From 9f5590d41c19052888cd52fc1647e8e3f741e065 Mon Sep 17 00:00:00 2001 From: Alessandro Autiero Date: Mon, 20 May 2024 17:24:00 +0200 Subject: [PATCH] 9.0.2 --- cli/lib/cli.dart | 3 +- cli/lib/src/game.dart | 10 +- cli/lib/src/server.dart | 4 +- cli/pubspec.yaml | 2 +- common/lib/common.dart | 7 +- common/lib/src/constant/authenticator.dart | 2 +- common/lib/src/constant/game.dart | 7 +- common/lib/src/constant/matchmaker.dart | 2 +- common/lib/src/constant/os.dart | 1 - common/lib/src/constant/supabase.dart | 4 +- common/lib/src/model/archive.dart | 18 - common/lib/src/model/fortnite_build.dart | 56 +- common/lib/src/model/game_instance.dart | 49 +- common/lib/src/util/authenticator.dart | 21 +- common/lib/src/util/build.dart | 296 +- common/lib/src/util/dll.dart | 64 + common/lib/src/util/matchmaker.dart | 16 +- common/lib/src/util/network.dart | 99 +- common/lib/src/util/path.dart | 2 +- common/lib/src/util/process.dart | 68 +- common/lib/src/util/reboot.dart | 100 - common/pubspec.yaml | 2 +- {watch => daemon}/lib/watch.dart | 3 +- {watch => daemon}/pubspec.yaml | 2 +- dependencies/authenticator | 1 - dependencies/matchmaker | 1 - dependencies/reboot/.gitattributes | 2 - .../reboot/.github/workflows/msbuild.yml | 47 - dependencies/reboot/.gitignore | 387 - dependencies/reboot/LICENSE | 29 - dependencies/reboot/Project Reboot 3.0.sln | 31 - .../AbilitySystemComponent.h | 103 - .../AbilitySystemComponent_Abilities.cpp | 270 - .../reboot/Project Reboot 3.0/Actor.cpp | 314 - .../reboot/Project Reboot 3.0/Actor.h | 70 - .../reboot/Project Reboot 3.0/ActorChannel.h | 32 - .../Project Reboot 3.0/ActorComponent.cpp | 11 - .../Project Reboot 3.0/ActorComponent.h | 9 - .../reboot/Project Reboot 3.0/AndOrNot.h | 73 - .../reboot/Project Reboot 3.0/Array.h | 415 - .../Project Reboot 3.0/AssertionMacros.h | 61 - .../reboot/Project Reboot 3.0/AssetPtr.h | 26 - .../Project Reboot 3.0/AthenaBarrierFlag.h | 44 - .../AthenaBarrierObjective.h | 59 - .../Project Reboot 3.0/AthenaBigBaseWall.h | 8 - .../AthenaMarkerComponent.cpp | 161 - .../AthenaMarkerComponent.h | 141 - .../AthenaPlayerMatchReport.h | 55 - .../AthenaResurrectionComponent.h | 21 - .../reboot/Project Reboot 3.0/AttributeSet.h | 48 - dependencies/reboot/Project Reboot 3.0/BGA.h | 125 - .../Project Reboot 3.0/BP_IslandScripting.cpp | 26 - .../Project Reboot 3.0/BP_IslandScripting.h | 37 - .../reboot/Project Reboot 3.0/BinaryHeap.h | 143 - .../reboot/Project Reboot 3.0/BitArray.h | 329 - .../Project Reboot 3.0/BuildingActor.cpp | 120 - .../reboot/Project Reboot 3.0/BuildingActor.h | 99 - .../Project Reboot 3.0/BuildingContainer.cpp | 49 - .../Project Reboot 3.0/BuildingContainer.h | 73 - .../Project Reboot 3.0/BuildingFoundation.cpp | 30 - .../Project Reboot 3.0/BuildingFoundation.h | 40 - .../BuildingGameplayActor.h | 8 - .../BuildingGameplayActorSpawnMachine.cpp | 139 - .../BuildingGameplayActorSpawnMachine.h | 49 - .../BuildingItemWeaponUpgradeActor.h | 14 - .../reboot/Project Reboot 3.0/BuildingRift.h | 8 - .../Project Reboot 3.0/BuildingSMActor.cpp | 7 - .../Project Reboot 3.0/BuildingSMActor.h | 64 - .../BuildingStructuralSupportSystem.cpp | 17 - .../BuildingStructuralSupportSystem.h | 10 - .../Project Reboot 3.0/BuildingTrap.cpp | 4 - .../reboot/Project Reboot 3.0/BuildingTrap.h | 9 - .../Project Reboot 3.0/BuildingWeapons.cpp | 15 - .../Project Reboot 3.0/BuildingWeapons.h | 26 - .../reboot/Project Reboot 3.0/Channel.h | 27 - .../Project Reboot 3.0/CheatManager.cpp | 21 - .../reboot/Project Reboot 3.0/CheatManager.h | 12 - .../reboot/Project Reboot 3.0/Class.cpp | 53 - .../reboot/Project Reboot 3.0/Class.h | 85 - .../ContainerAllocationPolicies.h | 117 - .../reboot/Project Reboot 3.0/Controller.cpp | 17 - .../reboot/Project Reboot 3.0/Controller.h | 28 - .../reboot/Project Reboot 3.0/CurveTable.h | 94 - .../reboot/Project Reboot 3.0/DataChannel.cpp | 16 - .../reboot/Project Reboot 3.0/DataTable.h | 49 - .../DataTableFunctionLibrary.cpp | 29 - .../DataTableFunctionLibrary.h | 21 - .../reboot/Project Reboot 3.0/Decay.h | 39 - .../reboot/Project Reboot 3.0/Delegate.h | 19 - .../reboot/Project Reboot 3.0/DelegateBase.h | 28 - .../Project Reboot 3.0/DelegateCombinations.h | 7 - .../DelegateInstanceInterface.h | 16 - .../DelegateSignatureImpl.inl | 63 - .../reboot/Project Reboot 3.0/EnableIf.h | 15 - .../reboot/Project Reboot 3.0/Engine.h | 17 - .../reboot/Project Reboot 3.0/EngineTypes.cpp | 33 - .../reboot/Project Reboot 3.0/EngineTypes.h | 95 - .../reboot/Project Reboot 3.0/EnvQuery.h | 8 - .../reboot/Project Reboot 3.0/EnvQueryTypes.h | 18 - .../ExpressionParserTypes.inl | 1 - .../Project Reboot 3.0/FortAIEncounterInfo.h | 40 - .../Project Reboot 3.0/FortAbilitySet.h | 99 - .../FortAthenaAIBotCharacterCustomization.h | 13 - .../FortAthenaAIBotCustomizationData.h | 45 - .../FortAthenaCreativePortal.cpp | 80 - .../FortAthenaCreativePortal.h | 79 - .../Project Reboot 3.0/FortAthenaMapInfo.cpp | 86 - .../Project Reboot 3.0/FortAthenaMapInfo.h | 164 - .../Project Reboot 3.0/FortAthenaMutator.h | 44 - .../FortAthenaMutator_Barrier.cpp | 37 - .../FortAthenaMutator_Barrier.h | 87 - .../FortAthenaMutator_Bots.h | 32 - .../FortAthenaMutator_Disco.cpp | 18 - .../FortAthenaMutator_Disco.h | 31 - .../Project Reboot 3.0/FortAthenaMutator_GG.h | 93 - ...AthenaMutator_GiveItemsAtGamePhaseStep.cpp | 8 - ...rtAthenaMutator_GiveItemsAtGamePhaseStep.h | 57 - .../FortAthenaMutator_Heist.h | 42 - .../FortAthenaMutator_InventoryOverride.h | 131 - ...rtAthenaMutator_InventoryOverride_Bucket.h | 35 - .../FortAthenaMutator_ItemDropOnDeath.h | 23 - .../FortAthenaMutator_LoadoutSwap.h | 8 - .../FortAthenaMutator_TDM.h | 15 - .../FortAthenaNpcPatrollingComponent.h | 23 - .../Project Reboot 3.0/FortAthenaPatrolPath.h | 8 - .../FortAthenaSKPushCannon.h | 67 - .../FortAthenaSupplyDrop.cpp | 93 - .../Project Reboot 3.0/FortAthenaSupplyDrop.h | 20 - .../Project Reboot 3.0/FortAthenaVehicle.cpp | 77 - .../Project Reboot 3.0/FortAthenaVehicle.h | 36 - .../FortAthenaVehicleSpawner.cpp | 11 - .../FortAthenaVehicleSpawner.h | 9 - .../Project Reboot 3.0/FortBotNameSettings.h | 36 - .../Project Reboot 3.0/FortDagwoodVehicle.h | 19 - .../FortDecoItemDefinition.cpp | 7 - .../FortDecoItemDefinition.h | 10 - .../FortGadgetItemDefinition.cpp | 22 - .../FortGadgetItemDefinition.h | 59 - .../Project Reboot 3.0/FortGameMode.cpp | 19 - .../reboot/Project Reboot 3.0/FortGameMode.h | 9 - .../Project Reboot 3.0/FortGameModeAthena.cpp | 1531 - .../Project Reboot 3.0/FortGameModeAthena.h | 275 - .../Project Reboot 3.0/FortGameModePickup.h | 13 - .../Project Reboot 3.0/FortGameModePvPBase.h | 8 - .../Project Reboot 3.0/FortGameModeZone.cpp | 11 - .../Project Reboot 3.0/FortGameModeZone.h | 11 - .../FortGameSessionDedicatedAthena.cpp | 57 - .../FortGameSessionDedicatedAthena.h | 9 - .../FortGameStateAthena.cpp | 400 - .../Project Reboot 3.0/FortGameStateAthena.h | 168 - ...ameplayAbilityAthena_PeriodicItemGrant.cpp | 15 - ...tGameplayAbilityAthena_PeriodicItemGrant.h | 58 - .../Project Reboot 3.0/FortInventory.cpp | 566 - .../reboot/Project Reboot 3.0/FortInventory.h | 117 - .../FortInventoryInterface.cpp | 56 - .../FortInventoryInterface.h | 9 - .../reboot/Project Reboot 3.0/FortItem.cpp | 65 - .../reboot/Project Reboot 3.0/FortItem.h | 254 - .../Project Reboot 3.0/FortItemDefinition.cpp | 55 - .../Project Reboot 3.0/FortItemDefinition.h | 45 - .../Project Reboot 3.0/FortKismetLibrary.cpp | 669 - .../Project Reboot 3.0/FortKismetLibrary.h | 109 - .../Project Reboot 3.0/FortLootLevel.cpp | 71 - .../reboot/Project Reboot 3.0/FortLootLevel.h | 9 - .../Project Reboot 3.0/FortLootPackage.cpp | 740 - .../Project Reboot 3.0/FortLootPackage.h | 258 - .../Project Reboot 3.0/FortMinigame.cpp | 30 - .../reboot/Project Reboot 3.0/FortMinigame.h | 14 - .../Project Reboot 3.0/FortMountedCannon.h | 35 - .../Project Reboot 3.0/FortOctopusVehicle.cpp | 12 - .../Project Reboot 3.0/FortOctopusVehicle.h | 10 - .../reboot/Project Reboot 3.0/FortPawn.cpp | 143 - .../reboot/Project Reboot 3.0/FortPawn.h | 56 - .../reboot/Project Reboot 3.0/FortPickup.cpp | 532 - .../reboot/Project Reboot 3.0/FortPickup.h | 217 - .../FortPlayerController.cpp | 1695 -- .../Project Reboot 3.0/FortPlayerController.h | 172 - .../FortPlayerControllerAthena.cpp | 621 - .../FortPlayerControllerAthena.h | 267 - .../Project Reboot 3.0/FortPlayerPawn.cpp | 379 - .../Project Reboot 3.0/FortPlayerPawn.h | 56 - .../FortPlayerPawnAthena.cpp | 108 - .../Project Reboot 3.0/FortPlayerPawnAthena.h | 17 - .../Project Reboot 3.0/FortPlayerState.cpp | 39 - .../Project Reboot 3.0/FortPlayerState.h | 31 - .../FortPlayerStateAthena.cpp | 41 - .../FortPlayerStateAthena.h | 138 - .../reboot/Project Reboot 3.0/FortPlaylist.h | 317 - .../Project Reboot 3.0/FortPlaylistAthena.h | 27 - .../FortPlaysetItemDefinition.cpp | 39 - .../FortPlaysetItemDefinition.h | 12 - .../reboot/Project Reboot 3.0/FortQuickBars.h | 125 - .../FortResourceItemDefinition.h | 8 - .../FortSafeZoneIndicator.cpp | 22 - .../FortSafeZoneIndicator.h | 34 - .../FortVehicleItemDefinition.h | 51 - .../reboot/Project Reboot 3.0/FortVolume.h | 34 - .../Project Reboot 3.0/FortVolumeManager.cpp | 14 - .../Project Reboot 3.0/FortVolumeManager.h | 13 - .../reboot/Project Reboot 3.0/FortWeapon.cpp | 39 - .../reboot/Project Reboot 3.0/FortWeapon.h | 36 - .../FortWeaponItemDefinition.cpp | 49 - .../FortWeaponItemDefinition.h | 12 - .../FortWeaponMeleeItemDefinition.h | 14 - .../FortWeaponRangedMountedCannon.cpp | 65 - .../FortWeaponRangedMountedCannon.h | 10 - .../FortWorldItemDefinition.h | 138 - .../reboot/Project Reboot 3.0/Function.h | 56 - .../reboot/Project Reboot 3.0/GameInstance.h | 15 - .../reboot/Project Reboot 3.0/GameMode.cpp | 9 - .../reboot/Project Reboot 3.0/GameMode.h | 16 - .../Project Reboot 3.0/GameModeBase.cpp | 266 - .../reboot/Project Reboot 3.0/GameModeBase.h | 20 - .../reboot/Project Reboot 3.0/GameSession.h | 12 - .../reboot/Project Reboot 3.0/GameState.cpp | 17 - .../reboot/Project Reboot 3.0/GameState.h | 9 - .../Project Reboot 3.0/GameplayAbilitySpec.h | 105 - .../Project Reboot 3.0/GameplayAbilityTypes.h | 35 - .../Project Reboot 3.0/GameplayStatics.cpp | 150 - .../Project Reboot 3.0/GameplayStatics.h | 32 - .../Project Reboot 3.0/GameplayTagContainer.h | 67 - .../GenericPlatformMath.cpp | 73 - .../Project Reboot 3.0/GenericPlatformMath.h | 96 - .../Project Reboot 3.0/GenericPlatformMisc.h | 2 - .../Project Reboot 3.0/GenericPlatformTime.h | 25 - .../Project Reboot 3.0/IdentityFunctor.h | 15 - .../reboot/Project Reboot 3.0/Interface.h | 24 - .../reboot/Project Reboot 3.0/IntroSort.h | 132 - .../InventoryManagementLibrary.cpp | 254 - .../InventoryManagementLibrary.h | 24 - .../reboot/Project Reboot 3.0/Invoke.h | 52 - .../reboot/Project Reboot 3.0/IsArithmetic.h | 27 - .../reboot/Project Reboot 3.0/IsEnum.h | 7 - .../reboot/Project Reboot 3.0/IsPODType.h | 27 - .../reboot/Project Reboot 3.0/IsPointer.h | 13 - .../IsTriviallyCopyConstructible.h | 9 - .../Project Reboot 3.0/KismetMathLibrary.cpp | 21 - .../Project Reboot 3.0/KismetMathLibrary.h | 11 - .../KismetStringLibrary.cpp | 15 - .../Project Reboot 3.0/KismetStringLibrary.h | 10 - .../KismetSystemLibrary.cpp | 25 - .../Project Reboot 3.0/KismetSystemLibrary.h | 217 - .../Project Reboot 3.0/KismetTextLibrary.cpp | 41 - .../Project Reboot 3.0/KismetTextLibrary.h | 14 - .../Project Reboot 3.0/LatentActionManager.h | 12 - .../reboot/Project Reboot 3.0/Level.cpp | 36 - .../reboot/Project Reboot 3.0/Level.h | 11 - .../reboot/Project Reboot 3.0/LevelActor.cpp | 1 - .../Project Reboot 3.0/LevelStreaming.h | 8 - .../LevelStreamingDynamic.h | 36 - dependencies/reboot/Project Reboot 3.0/Map.h | 159 - .../Project Reboot 3.0/MegaStormManager.h | 24 - .../reboot/Project Reboot 3.0/MemoryOps.h | 25 - .../reboot/Project Reboot 3.0/NameTypes.cpp | 0 .../reboot/Project Reboot 3.0/NameTypes.h | 79 - .../Project Reboot 3.0/NetConnection.cpp | 25 - .../reboot/Project Reboot 3.0/NetConnection.h | 75 - .../reboot/Project Reboot 3.0/NetDriver.cpp | 658 - .../reboot/Project Reboot 3.0/NetDriver.h | 202 - .../Project Reboot 3.0/NetSerialization.h | 126 - .../reboot/Project Reboot 3.0/NetworkGuid.h | 104 - .../Project Reboot 3.0/NetworkObjectList.cpp | 107 - .../reboot/Project Reboot 3.0/NumericLimits.h | 288 - .../reboot/Project Reboot 3.0/Object.cpp | 219 - .../reboot/Project Reboot 3.0/Object.h | 137 - .../reboot/Project Reboot 3.0/ObjectMacros.h | 69 - .../Project Reboot 3.0/OnlineReplStructs.h | 55 - .../reboot/Project Reboot 3.0/OutputDevice.h | 8 - .../reboot/Project Reboot 3.0/Package.h | 9 - dependencies/reboot/Project Reboot 3.0/Pawn.h | 19 - .../Project Reboot 3.0/PersistentObjectPtr.h | 15 - .../reboot/Project Reboot 3.0/Player.h | 20 - .../Project Reboot 3.0/PlayerController.cpp | 43 - .../Project Reboot 3.0/PlayerController.h | 32 - .../reboot/Project Reboot 3.0/PlayerState.cpp | 57 - .../reboot/Project Reboot 3.0/PlayerState.h | 16 - .../PlaysetLevelStreamComponent.cpp | 13 - .../PlaysetLevelStreamComponent.h | 13 - .../PointerIsConvertibleFromTo.h | 13 - .../Project Reboot 3.0.vcxproj | 499 - .../Project Reboot 3.0.vcxproj.filters | 1244 - dependencies/reboot/Project Reboot 3.0/Quat.h | 22 - .../reboot/Project Reboot 3.0/RandomStream.h | 76 - .../reboot/Project Reboot 3.0/RemoveCV.h | 6 - .../Project Reboot 3.0/RemoveReference.h | 5 - .../Project Reboot 3.0/ReversePredicate.h | 21 - .../reboot/Project Reboot 3.0/Rotator.h | 54 - .../reboot/Project Reboot 3.0/SavePackage.cpp | 9 - .../Project Reboot 3.0/ScriptDelegates.h | 10 - .../Project Reboot 3.0/ScriptDisassembler.cpp | 1679 -- .../Project Reboot 3.0/ScriptDisassembler.h | 50 - .../Project Reboot 3.0/ScriptInterface.h | 21 - dependencies/reboot/Project Reboot 3.0/Set.h | 220 - .../reboot/Project Reboot 3.0/SharedPointer.h | 46 - .../SharedPointerInternals.h | 47 - .../Project Reboot 3.0/SoftObjectPath.h | 14 - .../reboot/Project Reboot 3.0/SoftObjectPtr.h | 60 - dependencies/reboot/Project Reboot 3.0/Sort.h | 14 - .../reboot/Project Reboot 3.0/Sorting.h | 55 - .../reboot/Project Reboot 3.0/SparseArray.h | 260 - .../reboot/Project Reboot 3.0/Stack.h | 98 - .../Project Reboot 3.0/StringAssetReference.h | 8 - dependencies/reboot/Project Reboot 3.0/Text.h | 16 - .../reboot/Project Reboot 3.0/TimerManager.h | 32 - .../reboot/Project Reboot 3.0/Transform.h | 13 - .../reboot/Project Reboot 3.0/Tuple.h | 2 - .../Project Reboot 3.0/TypeCompatibleBytes.h | 63 - .../reboot/Project Reboot 3.0/TypeWrapper.h | 16 - .../reboot/Project Reboot 3.0/UObjectArray.h | 174 - .../Project Reboot 3.0/UObjectGlobals.cpp | 0 .../Project Reboot 3.0/UObjectGlobals.h | 21 - .../Project Reboot 3.0/UnrealEngine.cpp | 0 .../reboot/Project Reboot 3.0/UnrealMath.cpp | 154 - .../Project Reboot 3.0/UnrealMathUtility.h | 44 - .../reboot/Project Reboot 3.0/UnrealNames.cpp | 84 - .../reboot/Project Reboot 3.0/UnrealString.h | 120 - .../Project Reboot 3.0/UnrealTemplate.h | 106 - .../Project Reboot 3.0/UnrealTypeTraits.h | 151 - .../reboot/Project Reboot 3.0/Vector.h | 65 - .../reboot/Project Reboot 3.0/Vector2D.h | 7 - .../reboot/Project Reboot 3.0/WeakObjectPtr.h | 20 - .../WeakObjectPtrTemplates.h | 21 - .../reboot/Project Reboot 3.0/World.cpp | 130 - .../reboot/Project Reboot 3.0/World.h | 169 - .../reboot/Project Reboot 3.0/addresses.cpp | 626 - .../reboot/Project Reboot 3.0/addresses.h | 107 - dependencies/reboot/Project Reboot 3.0/ai.h | 368 - .../reboot/Project Reboot 3.0/anticheat.h | 53 - dependencies/reboot/Project Reboot 3.0/bots.h | 397 - .../reboot/Project Reboot 3.0/builder.h | 148 - .../reboot/Project Reboot 3.0/calendar.h | 90 - .../reboot/Project Reboot 3.0/commands.cpp | 952 - .../reboot/Project Reboot 3.0/commands.h | 50 - dependencies/reboot/Project Reboot 3.0/die.h | 166 - .../reboot/Project Reboot 3.0/discord.h | 81 - .../reboot/Project Reboot 3.0/dllmain.cpp | 1144 - .../reboot/Project Reboot 3.0/events.h | 827 - .../reboot/Project Reboot 3.0/extra.cpp | 173 - .../reboot/Project Reboot 3.0/finder.cpp | 205 - .../reboot/Project Reboot 3.0/finder.h | 1911 -- .../reboot/Project Reboot 3.0/globals.h | 41 - dependencies/reboot/Project Reboot 3.0/gui.h | 1630 - .../reboot/Project Reboot 3.0/hooking.h | 411 - .../reboot/Project Reboot 3.0/inc.cpp | 20 - dependencies/reboot/Project Reboot 3.0/inc.h | 85 - dependencies/reboot/Project Reboot 3.0/log.h | 107 - .../reboot/Project Reboot 3.0/moderation.h | 189 - .../Project Reboot 3.0/objectviewer.cpp | 175 - .../reboot/Project Reboot 3.0/objectviewer.h | 26 - .../reboot/Project Reboot 3.0/reboot.cpp | 29 - .../reboot/Project Reboot 3.0/reboot.h | 414 - .../reboot/Project Reboot 3.0/vehicles.h | 262 - .../Project Reboot 3.0/vendingmachine.h | 325 - dependencies/reboot/README.md | 9 - dependencies/reboot/vendor/Fonts/ruda-bold.h | 2076 -- dependencies/reboot/vendor/ImGui/imconfig.h | 125 - dependencies/reboot/vendor/ImGui/imgui.cpp | 13522 --------- dependencies/reboot/vendor/ImGui/imgui.h | 3046 -- .../reboot/vendor/ImGui/imgui_demo.cpp | 7970 ----- .../reboot/vendor/ImGui/imgui_draw.cpp | 4162 --- .../reboot/vendor/ImGui/imgui_impl_dx9.cpp | 378 - .../reboot/vendor/ImGui/imgui_impl_dx9.h | 25 - .../reboot/vendor/ImGui/imgui_impl_win32.cpp | 791 - .../reboot/vendor/ImGui/imgui_impl_win32.h | 44 - .../reboot/vendor/ImGui/imgui_internal.h | 2994 -- .../reboot/vendor/ImGui/imgui_stdlib.cpp | 72 - .../reboot/vendor/ImGui/imgui_stdlib.h | 18 - .../reboot/vendor/ImGui/imgui_tables.cpp | 4074 --- .../reboot/vendor/ImGui/imgui_widgets.cpp | 8415 ------ .../reboot/vendor/ImGui/imstb_rectpack.h | 627 - .../reboot/vendor/ImGui/imstb_textedit.h | 1447 - .../reboot/vendor/ImGui/imstb_truetype.h | 5085 ---- .../reboot/vendor/Images/reboot_icon.h | 1263 - dependencies/reboot/vendor/MinHook/MinHook.h | 186 - .../reboot/vendor/MinHook/minhook.x64.lib | Bin 292260 -> 0 bytes dependencies/reboot/vendor/curl/curl.h | 3129 -- dependencies/reboot/vendor/curl/curlver.h | 79 - dependencies/reboot/vendor/curl/easy.h | 125 - dependencies/reboot/vendor/curl/header.h | 66 - dependencies/reboot/vendor/curl/libcurl.lib | Bin 12379478 -> 0 bytes dependencies/reboot/vendor/curl/mprintf.h | 52 - dependencies/reboot/vendor/curl/multi.h | 460 - dependencies/reboot/vendor/curl/options.h | 70 - dependencies/reboot/vendor/curl/stdcheaders.h | 35 - dependencies/reboot/vendor/curl/system.h | 490 - .../reboot/vendor/curl/typecheck-gcc.h | 712 - dependencies/reboot/vendor/curl/urlapi.h | 147 - dependencies/reboot/vendor/curl/zlib.lib | Bin 445992 -> 0 bytes dependencies/reboot/vendor/json.hpp | 24639 ---------------- dependencies/reboot/vendor/memcury.h | 1452 - dependencies/reboot/vendor/spdlog/async.h | 99 - .../reboot/vendor/spdlog/async_logger-inl.h | 92 - .../reboot/vendor/spdlog/async_logger.h | 68 - dependencies/reboot/vendor/spdlog/cfg/argv.h | 44 - dependencies/reboot/vendor/spdlog/cfg/env.h | 38 - .../reboot/vendor/spdlog/cfg/helpers-inl.h | 120 - .../reboot/vendor/spdlog/cfg/helpers.h | 29 - .../reboot/vendor/spdlog/common-inl.h | 82 - dependencies/reboot/vendor/spdlog/common.h | 352 - .../vendor/spdlog/details/backtracer-inl.h | 69 - .../reboot/vendor/spdlog/details/backtracer.h | 45 - .../reboot/vendor/spdlog/details/circular_q.h | 141 - .../vendor/spdlog/details/console_globals.h | 32 - .../vendor/spdlog/details/file_helper-inl.h | 172 - .../vendor/spdlog/details/file_helper.h | 61 - .../reboot/vendor/spdlog/details/fmt_helper.h | 169 - .../vendor/spdlog/details/log_msg-inl.h | 37 - .../reboot/vendor/spdlog/details/log_msg.h | 37 - .../spdlog/details/log_msg_buffer-inl.h | 58 - .../vendor/spdlog/details/log_msg_buffer.h | 33 - .../vendor/spdlog/details/mpmc_blocking_q.h | 126 - .../reboot/vendor/spdlog/details/null_mutex.h | 49 - .../reboot/vendor/spdlog/details/os-inl.h | 606 - .../reboot/vendor/spdlog/details/os.h | 118 - .../spdlog/details/periodic_worker-inl.h | 49 - .../vendor/spdlog/details/periodic_worker.h | 40 - .../vendor/spdlog/details/registry-inl.h | 313 - .../reboot/vendor/spdlog/details/registry.h | 115 - .../spdlog/details/synchronous_factory.h | 24 - .../spdlog/details/tcp_client-windows.h | 160 - .../reboot/vendor/spdlog/details/tcp_client.h | 145 - .../vendor/spdlog/details/thread_pool-inl.h | 136 - .../vendor/spdlog/details/thread_pool.h | 121 - .../spdlog/details/udp_client-windows.h | 111 - .../reboot/vendor/spdlog/details/udp_client.h | 94 - .../vendor/spdlog/details/windows_include.h | 11 - .../reboot/vendor/spdlog/fmt/bin_to_hex.h | 246 - .../reboot/vendor/spdlog/fmt/bundled/args.h | 234 - .../reboot/vendor/spdlog/fmt/bundled/chrono.h | 2067 -- .../reboot/vendor/spdlog/fmt/bundled/color.h | 638 - .../vendor/spdlog/fmt/bundled/compile.h | 642 - .../reboot/vendor/spdlog/fmt/bundled/core.h | 3236 -- .../vendor/spdlog/fmt/bundled/fmt.license.rst | 27 - .../vendor/spdlog/fmt/bundled/format-inl.h | 2643 -- .../reboot/vendor/spdlog/fmt/bundled/format.h | 3104 -- .../reboot/vendor/spdlog/fmt/bundled/locale.h | 2 - .../reboot/vendor/spdlog/fmt/bundled/os.h | 527 - .../vendor/spdlog/fmt/bundled/ostream.h | 135 - .../reboot/vendor/spdlog/fmt/bundled/printf.h | 657 - .../reboot/vendor/spdlog/fmt/bundled/ranges.h | 793 - .../reboot/vendor/spdlog/fmt/bundled/xchar.h | 236 - .../reboot/vendor/spdlog/fmt/chrono.h | 22 - .../reboot/vendor/spdlog/fmt/compile.h | 22 - dependencies/reboot/vendor/spdlog/fmt/fmt.h | 29 - dependencies/reboot/vendor/spdlog/fmt/ostr.h | 22 - .../reboot/vendor/spdlog/fmt/ranges.h | 22 - dependencies/reboot/vendor/spdlog/fmt/xchar.h | 22 - dependencies/reboot/vendor/spdlog/formatter.h | 18 - dependencies/reboot/vendor/spdlog/fwd.h | 18 - .../reboot/vendor/spdlog/logger-inl.h | 257 - dependencies/reboot/vendor/spdlog/logger.h | 450 - .../vendor/spdlog/pattern_formatter-inl.h | 1432 - .../reboot/vendor/spdlog/pattern_formatter.h | 128 - .../reboot/vendor/spdlog/sinks/android_sink.h | 142 - .../vendor/spdlog/sinks/ansicolor_sink-inl.h | 145 - .../vendor/spdlog/sinks/ansicolor_sink.h | 118 - .../vendor/spdlog/sinks/base_sink-inl.h | 63 - .../reboot/vendor/spdlog/sinks/base_sink.h | 52 - .../vendor/spdlog/sinks/basic_file_sink-inl.h | 44 - .../vendor/spdlog/sinks/basic_file_sink.h | 60 - .../vendor/spdlog/sinks/daily_file_sink.h | 294 - .../reboot/vendor/spdlog/sinks/dist_sink.h | 97 - .../vendor/spdlog/sinks/dup_filter_sink.h | 94 - .../vendor/spdlog/sinks/hourly_file_sink.h | 196 - .../reboot/vendor/spdlog/sinks/mongo_sink.h | 99 - .../reboot/vendor/spdlog/sinks/msvc_sink.h | 49 - .../reboot/vendor/spdlog/sinks/null_sink.h | 44 - .../reboot/vendor/spdlog/sinks/ostream_sink.h | 50 - .../reboot/vendor/spdlog/sinks/qt_sinks.h | 102 - .../vendor/spdlog/sinks/ringbuffer_sink.h | 74 - .../spdlog/sinks/rotating_file_sink-inl.h | 152 - .../vendor/spdlog/sinks/rotating_file_sink.h | 81 - .../reboot/vendor/spdlog/sinks/sink-inl.h | 25 - .../reboot/vendor/spdlog/sinks/sink.h | 35 - .../spdlog/sinks/stdout_color_sinks-inl.h | 38 - .../vendor/spdlog/sinks/stdout_color_sinks.h | 45 - .../vendor/spdlog/sinks/stdout_sinks-inl.h | 139 - .../reboot/vendor/spdlog/sinks/stdout_sinks.h | 87 - .../reboot/vendor/spdlog/sinks/syslog_sink.h | 109 - .../reboot/vendor/spdlog/sinks/systemd_sink.h | 119 - .../reboot/vendor/spdlog/sinks/tcp_sink.h | 81 - .../reboot/vendor/spdlog/sinks/udp_sink.h | 74 - .../vendor/spdlog/sinks/win_eventlog_sink.h | 289 - .../vendor/spdlog/sinks/wincolor_sink-inl.h | 175 - .../vendor/spdlog/sinks/wincolor_sink.h | 85 - .../reboot/vendor/spdlog/spdlog-inl.h | 125 - dependencies/reboot/vendor/spdlog/spdlog.h | 345 - dependencies/reboot/vendor/spdlog/stopwatch.h | 68 - dependencies/reboot/vendor/spdlog/tweakme.h | 134 - dependencies/reboot/vendor/spdlog/version.h | 10 - gui/assets/authenticator/kill.bat | 1 - gui/assets/dlls/reboot.dll | Bin 2401280 -> 0 bytes gui/assets/matchmaker/kill.bat | 1 - gui/assets/misc/watch.exe | Bin 6386176 -> 6199296 bytes gui/assets/misc/winnat.bat | 2 - .../CodeDependencies.iss | 735 + gui/lib/l10n/reboot_ar.arb | 268 - gui/lib/l10n/reboot_de.arb | 251 - gui/lib/l10n/reboot_en.arb | 107 +- gui/lib/l10n/reboot_es.arb | 251 - gui/lib/l10n/reboot_fr.arb | 268 - gui/lib/l10n/reboot_pl.arb | 269 - gui/lib/l10n/reboot_pt.arb | 251 - gui/lib/l10n/reboot_ro.arb | 251 - gui/lib/l10n/reboot_ru.arb | 268 - gui/lib/main.dart | 88 +- .../controller/authenticator_controller.dart | 2 +- gui/lib/src/controller/build_controller.dart | 33 +- gui/lib/src/controller/game_controller.dart | 7 +- .../src/controller/hosting_controller.dart | 24 +- gui/lib/src/controller/info_controller.dart | 1 - .../src/controller/matchmaker_controller.dart | 2 +- gui/lib/src/controller/server_controller.dart | 31 +- .../src/controller/settings_controller.dart | 3 - gui/lib/src/controller/update_controller.dart | 40 +- gui/lib/src/dialog/abstract/dialog.dart | 22 +- gui/lib/src/dialog/abstract/info_bar.dart | 69 +- gui/lib/src/dialog/implementation/dll.dart | 24 + gui/lib/src/dialog/implementation/server.dart | 170 +- gui/lib/src/page/abstract/page.dart | 22 +- gui/lib/src/page/abstract/page_setting.dart | 26 - .../src/page/abstract/page_suggestion.dart | 13 + .../implementation/authenticator_page.dart | 219 +- .../src/page/implementation/home_page.dart | 455 +- .../src/page/implementation/info_page.dart | 155 +- .../page/implementation/matchmaker_page.dart | 240 +- .../src/page/implementation/play_page.dart | 124 +- .../implementation/server_browser_page.dart | 82 +- .../page/implementation/server_host_page.dart | 175 +- .../page/implementation/settings_page.dart | 250 +- gui/lib/src/page/pages.dart | 48 +- gui/lib/src/util/cryptography.dart | 8 +- gui/lib/src/util/{watch.dart => daemon.dart} | 42 +- gui/lib/src/util/dll.dart | 52 + gui/lib/src/util/os.dart | 8 +- gui/lib/src/util/tutorial.dart | 11 +- gui/lib/src/util/types.dart | 8 + .../{version => }/add_local_version.dart | 4 +- .../{version => }/add_server_version.dart | 104 +- gui/lib/src/widget/common/setting_tile.dart | 136 - .../widget/{common => }/file_selector.dart | 0 ...art_button.dart => game_start_button.dart} | 195 +- gui/lib/src/widget/home/profile.dart | 100 - gui/lib/src/widget/profile_tile.dart | 106 + ...t_button.dart => server_start_button.dart} | 49 +- ...elector.dart => server_type_selector.dart} | 0 gui/lib/src/widget/setting_tile.dart | 164 + gui/lib/src/widget/{os => }/title_bar.dart | 2 +- .../buttons.dart => title_bar_buttons.dart} | 4 +- .../{os/icons.dart => title_bar_icons.dart} | 0 .../{os/mouse.dart => title_bar_mouse.dart} | 0 .../version/version_build_selector.dart | 50 - .../widget/version/version_selector_tile.dart | 48 - .../{version => }/version_name_input.dart | 0 .../{version => }/version_selector.dart | 24 +- gui/lib/src/widget/version_selector_tile.dart | 61 + gui/package.bat | 1 + gui/pubspec.yaml | 28 +- gui/windows/flutter/CMakeLists.txt | 7 +- .../exe/custom-inno-setup-script.iss | 13 +- gui/windows/runner/main.cpp | 2 +- gui/windows/runner/win32_window.cpp | 2 +- 562 files changed, 3303 insertions(+), 156787 deletions(-) delete mode 100644 common/lib/src/constant/os.dart delete mode 100644 common/lib/src/model/archive.dart create mode 100644 common/lib/src/util/dll.dart delete mode 100644 common/lib/src/util/reboot.dart rename {watch => daemon}/lib/watch.dart (95%) rename {watch => daemon}/pubspec.yaml (87%) delete mode 160000 dependencies/authenticator delete mode 160000 dependencies/matchmaker delete mode 100644 dependencies/reboot/.gitattributes delete mode 100644 dependencies/reboot/.github/workflows/msbuild.yml delete mode 100644 dependencies/reboot/.gitignore delete mode 100644 dependencies/reboot/LICENSE delete mode 100644 dependencies/reboot/Project Reboot 3.0.sln delete mode 100644 dependencies/reboot/Project Reboot 3.0/AbilitySystemComponent.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AbilitySystemComponent_Abilities.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/Actor.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/Actor.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ActorChannel.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ActorComponent.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/ActorComponent.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AndOrNot.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Array.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AssertionMacros.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AssetPtr.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AthenaBarrierFlag.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AthenaBarrierObjective.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AthenaBigBaseWall.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AthenaMarkerComponent.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/AthenaMarkerComponent.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AthenaPlayerMatchReport.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AthenaResurrectionComponent.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/AttributeSet.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BGA.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BP_IslandScripting.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BP_IslandScripting.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BinaryHeap.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BitArray.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingActor.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingActor.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingContainer.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingContainer.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingFoundation.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingFoundation.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingGameplayActor.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingGameplayActorSpawnMachine.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingGameplayActorSpawnMachine.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingItemWeaponUpgradeActor.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingRift.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingSMActor.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingSMActor.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingStructuralSupportSystem.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingStructuralSupportSystem.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingTrap.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingTrap.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingWeapons.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/BuildingWeapons.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Channel.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/CheatManager.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/CheatManager.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Class.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/Class.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ContainerAllocationPolicies.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Controller.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/Controller.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/CurveTable.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/DataChannel.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/DataTable.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/DataTableFunctionLibrary.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/DataTableFunctionLibrary.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Decay.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Delegate.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/DelegateBase.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/DelegateCombinations.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/DelegateInstanceInterface.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/DelegateSignatureImpl.inl delete mode 100644 dependencies/reboot/Project Reboot 3.0/EnableIf.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Engine.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/EngineTypes.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/EngineTypes.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/EnvQuery.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/EnvQueryTypes.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ExpressionParserTypes.inl delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAIEncounterInfo.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAbilitySet.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaAIBotCharacterCustomization.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaAIBotCustomizationData.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaCreativePortal.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaCreativePortal.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMapInfo.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMapInfo.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Barrier.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Barrier.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Bots.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Disco.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Disco.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GG.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GiveItemsAtGamePhaseStep.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Heist.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_InventoryOverride.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_InventoryOverride_Bucket.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_ItemDropOnDeath.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_LoadoutSwap.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_TDM.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaNpcPatrollingComponent.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaPatrolPath.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaSKPushCannon.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaSupplyDrop.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaSupplyDrop.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaVehicle.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaVehicle.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaVehicleSpawner.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortAthenaVehicleSpawner.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortBotNameSettings.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortDagwoodVehicle.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortDecoItemDefinition.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortDecoItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGadgetItemDefinition.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGadgetItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameMode.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameMode.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameModeAthena.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameModeAthena.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameModePickup.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameModePvPBase.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameModeZone.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameModeZone.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameSessionDedicatedAthena.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameSessionDedicatedAthena.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameStateAthena.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameStateAthena.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameplayAbilityAthena_PeriodicItemGrant.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortGameplayAbilityAthena_PeriodicItemGrant.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortInventory.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortInventory.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortInventoryInterface.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortInventoryInterface.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortItem.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortItem.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortItemDefinition.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortKismetLibrary.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortKismetLibrary.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortLootLevel.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortLootLevel.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortLootPackage.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortLootPackage.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortMinigame.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortMinigame.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortMountedCannon.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortOctopusVehicle.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortOctopusVehicle.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPawn.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPawn.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPickup.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPickup.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerController.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerController.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerControllerAthena.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerControllerAthena.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerPawn.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerPawn.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerPawnAthena.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerPawnAthena.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerState.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerState.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerStateAthena.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlayerStateAthena.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlaylist.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlaylistAthena.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlaysetItemDefinition.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortPlaysetItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortQuickBars.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortResourceItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortSafeZoneIndicator.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortSafeZoneIndicator.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortVehicleItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortVolume.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortVolumeManager.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortVolumeManager.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortWeapon.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortWeapon.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortWeaponItemDefinition.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortWeaponItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortWeaponMeleeItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortWeaponRangedMountedCannon.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortWeaponRangedMountedCannon.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/FortWorldItemDefinition.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Function.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameInstance.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameMode.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameMode.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameModeBase.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameModeBase.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameSession.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameState.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameState.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameplayAbilitySpec.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameplayAbilityTypes.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameplayStatics.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameplayStatics.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GameplayTagContainer.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GenericPlatformMath.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/GenericPlatformMath.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GenericPlatformMisc.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/GenericPlatformTime.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/IdentityFunctor.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Interface.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/IntroSort.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/InventoryManagementLibrary.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/InventoryManagementLibrary.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Invoke.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/IsArithmetic.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/IsEnum.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/IsPODType.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/IsPointer.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/IsTriviallyCopyConstructible.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/KismetMathLibrary.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/KismetMathLibrary.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/KismetStringLibrary.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/KismetStringLibrary.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/KismetSystemLibrary.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/KismetSystemLibrary.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/KismetTextLibrary.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/KismetTextLibrary.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/LatentActionManager.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Level.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/Level.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/LevelActor.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/LevelStreaming.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/LevelStreamingDynamic.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Map.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/MegaStormManager.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/MemoryOps.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/NameTypes.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/NameTypes.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/NetConnection.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/NetConnection.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/NetDriver.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/NetDriver.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/NetSerialization.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/NetworkGuid.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/NetworkObjectList.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/NumericLimits.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Object.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/Object.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ObjectMacros.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/OnlineReplStructs.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/OutputDevice.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Package.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Pawn.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/PersistentObjectPtr.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Player.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/PlayerController.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/PlayerController.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/PlayerState.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/PlayerState.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/PlaysetLevelStreamComponent.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/PlaysetLevelStreamComponent.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/PointerIsConvertibleFromTo.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Project Reboot 3.0.vcxproj delete mode 100644 dependencies/reboot/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters delete mode 100644 dependencies/reboot/Project Reboot 3.0/Quat.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/RandomStream.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/RemoveCV.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/RemoveReference.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ReversePredicate.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Rotator.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/SavePackage.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/ScriptDelegates.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ScriptDisassembler.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/ScriptDisassembler.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ScriptInterface.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Set.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/SharedPointer.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/SharedPointerInternals.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/SoftObjectPath.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/SoftObjectPtr.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Sort.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Sorting.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/SparseArray.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Stack.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/StringAssetReference.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Text.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/TimerManager.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Transform.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Tuple.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/TypeCompatibleBytes.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/TypeWrapper.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/UObjectArray.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/UObjectGlobals.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/UObjectGlobals.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/UnrealEngine.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/UnrealMath.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/UnrealMathUtility.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/UnrealNames.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/UnrealString.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/UnrealTemplate.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/UnrealTypeTraits.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Vector.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/Vector2D.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/WeakObjectPtr.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/WeakObjectPtrTemplates.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/World.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/World.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/addresses.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/addresses.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/ai.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/anticheat.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/bots.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/builder.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/calendar.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/commands.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/commands.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/die.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/discord.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/dllmain.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/events.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/extra.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/finder.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/finder.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/globals.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/gui.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/hooking.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/inc.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/inc.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/log.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/moderation.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/objectviewer.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/objectviewer.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/reboot.cpp delete mode 100644 dependencies/reboot/Project Reboot 3.0/reboot.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/vehicles.h delete mode 100644 dependencies/reboot/Project Reboot 3.0/vendingmachine.h delete mode 100644 dependencies/reboot/README.md delete mode 100644 dependencies/reboot/vendor/Fonts/ruda-bold.h delete mode 100644 dependencies/reboot/vendor/ImGui/imconfig.h delete mode 100644 dependencies/reboot/vendor/ImGui/imgui.cpp delete mode 100644 dependencies/reboot/vendor/ImGui/imgui.h delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_demo.cpp delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_draw.cpp delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_impl_dx9.cpp delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_impl_dx9.h delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_impl_win32.cpp delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_impl_win32.h delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_internal.h delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_stdlib.cpp delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_stdlib.h delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_tables.cpp delete mode 100644 dependencies/reboot/vendor/ImGui/imgui_widgets.cpp delete mode 100644 dependencies/reboot/vendor/ImGui/imstb_rectpack.h delete mode 100644 dependencies/reboot/vendor/ImGui/imstb_textedit.h delete mode 100644 dependencies/reboot/vendor/ImGui/imstb_truetype.h delete mode 100644 dependencies/reboot/vendor/Images/reboot_icon.h delete mode 100644 dependencies/reboot/vendor/MinHook/MinHook.h delete mode 100644 dependencies/reboot/vendor/MinHook/minhook.x64.lib delete mode 100644 dependencies/reboot/vendor/curl/curl.h delete mode 100644 dependencies/reboot/vendor/curl/curlver.h delete mode 100644 dependencies/reboot/vendor/curl/easy.h delete mode 100644 dependencies/reboot/vendor/curl/header.h delete mode 100644 dependencies/reboot/vendor/curl/libcurl.lib delete mode 100644 dependencies/reboot/vendor/curl/mprintf.h delete mode 100644 dependencies/reboot/vendor/curl/multi.h delete mode 100644 dependencies/reboot/vendor/curl/options.h delete mode 100644 dependencies/reboot/vendor/curl/stdcheaders.h delete mode 100644 dependencies/reboot/vendor/curl/system.h delete mode 100644 dependencies/reboot/vendor/curl/typecheck-gcc.h delete mode 100644 dependencies/reboot/vendor/curl/urlapi.h delete mode 100644 dependencies/reboot/vendor/curl/zlib.lib delete mode 100644 dependencies/reboot/vendor/json.hpp delete mode 100644 dependencies/reboot/vendor/memcury.h delete mode 100644 dependencies/reboot/vendor/spdlog/async.h delete mode 100644 dependencies/reboot/vendor/spdlog/async_logger-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/async_logger.h delete mode 100644 dependencies/reboot/vendor/spdlog/cfg/argv.h delete mode 100644 dependencies/reboot/vendor/spdlog/cfg/env.h delete mode 100644 dependencies/reboot/vendor/spdlog/cfg/helpers-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/cfg/helpers.h delete mode 100644 dependencies/reboot/vendor/spdlog/common-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/common.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/backtracer-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/backtracer.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/circular_q.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/console_globals.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/file_helper-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/file_helper.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/fmt_helper.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/log_msg-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/log_msg.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/log_msg_buffer-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/log_msg_buffer.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/mpmc_blocking_q.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/null_mutex.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/os-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/os.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/periodic_worker-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/periodic_worker.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/registry-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/registry.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/synchronous_factory.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/tcp_client-windows.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/tcp_client.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/thread_pool-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/thread_pool.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/udp_client-windows.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/udp_client.h delete mode 100644 dependencies/reboot/vendor/spdlog/details/windows_include.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bin_to_hex.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/args.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/chrono.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/color.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/compile.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/core.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/fmt.license.rst delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/format-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/format.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/locale.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/os.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/ostream.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/printf.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/ranges.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/bundled/xchar.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/chrono.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/compile.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/fmt.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/ostr.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/ranges.h delete mode 100644 dependencies/reboot/vendor/spdlog/fmt/xchar.h delete mode 100644 dependencies/reboot/vendor/spdlog/formatter.h delete mode 100644 dependencies/reboot/vendor/spdlog/fwd.h delete mode 100644 dependencies/reboot/vendor/spdlog/logger-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/logger.h delete mode 100644 dependencies/reboot/vendor/spdlog/pattern_formatter-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/pattern_formatter.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/android_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/ansicolor_sink-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/ansicolor_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/base_sink-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/base_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/basic_file_sink-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/basic_file_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/daily_file_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/dist_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/dup_filter_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/hourly_file_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/mongo_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/msvc_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/null_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/ostream_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/qt_sinks.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/ringbuffer_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/rotating_file_sink-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/rotating_file_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/sink-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/stdout_color_sinks-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/stdout_color_sinks.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/stdout_sinks-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/stdout_sinks.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/syslog_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/systemd_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/tcp_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/udp_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/win_eventlog_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/wincolor_sink-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/sinks/wincolor_sink.h delete mode 100644 dependencies/reboot/vendor/spdlog/spdlog-inl.h delete mode 100644 dependencies/reboot/vendor/spdlog/spdlog.h delete mode 100644 dependencies/reboot/vendor/spdlog/stopwatch.h delete mode 100644 dependencies/reboot/vendor/spdlog/tweakme.h delete mode 100644 dependencies/reboot/vendor/spdlog/version.h delete mode 100644 gui/assets/authenticator/kill.bat delete mode 100644 gui/assets/dlls/reboot.dll delete mode 100644 gui/assets/matchmaker/kill.bat delete mode 100644 gui/assets/misc/winnat.bat create mode 100644 gui/dependencies/InnoDependencyInstaller/CodeDependencies.iss delete mode 100644 gui/lib/l10n/reboot_ar.arb delete mode 100644 gui/lib/l10n/reboot_de.arb delete mode 100644 gui/lib/l10n/reboot_es.arb delete mode 100644 gui/lib/l10n/reboot_fr.arb delete mode 100644 gui/lib/l10n/reboot_pl.arb delete mode 100644 gui/lib/l10n/reboot_pt.arb delete mode 100644 gui/lib/l10n/reboot_ro.arb delete mode 100644 gui/lib/l10n/reboot_ru.arb create mode 100644 gui/lib/src/dialog/implementation/dll.dart delete mode 100644 gui/lib/src/page/abstract/page_setting.dart create mode 100644 gui/lib/src/page/abstract/page_suggestion.dart rename gui/lib/src/util/{watch.dart => daemon.dart} (55%) create mode 100644 gui/lib/src/util/dll.dart create mode 100644 gui/lib/src/util/types.dart rename gui/lib/src/widget/{version => }/add_local_version.dart (95%) rename gui/lib/src/widget/{version => }/add_server_version.dart (75%) delete mode 100644 gui/lib/src/widget/common/setting_tile.dart rename gui/lib/src/widget/{common => }/file_selector.dart (100%) rename gui/lib/src/widget/{game/start_button.dart => game_start_button.dart} (70%) delete mode 100644 gui/lib/src/widget/home/profile.dart create mode 100644 gui/lib/src/widget/profile_tile.dart rename gui/lib/src/widget/{server/start_button.dart => server_start_button.dart} (54%) rename gui/lib/src/widget/{server/type_selector.dart => server_type_selector.dart} (100%) create mode 100644 gui/lib/src/widget/setting_tile.dart rename gui/lib/src/widget/{os => }/title_bar.dart (96%) rename gui/lib/src/widget/{os/buttons.dart => title_bar_buttons.dart} (98%) rename gui/lib/src/widget/{os/icons.dart => title_bar_icons.dart} (100%) rename gui/lib/src/widget/{os/mouse.dart => title_bar_mouse.dart} (100%) delete mode 100644 gui/lib/src/widget/version/version_build_selector.dart delete mode 100644 gui/lib/src/widget/version/version_selector_tile.dart rename gui/lib/src/widget/{version => }/version_name_input.dart (100%) rename gui/lib/src/widget/{version => }/version_selector.dart (93%) create mode 100644 gui/lib/src/widget/version_selector_tile.dart create mode 100644 gui/package.bat diff --git a/cli/lib/cli.dart b/cli/lib/cli.dart index d4aeeee..0fc1a7f 100644 --- a/cli/lib/cli.dart +++ b/cli/lib/cli.dart @@ -5,7 +5,6 @@ import 'package:reboot_cli/src/game.dart'; import 'package:reboot_cli/src/reboot.dart'; import 'package:reboot_cli/src/server.dart'; import 'package:reboot_common/common.dart'; -import 'package:reboot_common/src/model/fortnite_version.dart'; import 'package:reboot_common/src/util/matchmaker.dart' as matchmaker; late String? username; @@ -46,7 +45,7 @@ void main(List args) async { if(result["update"]) { stdout.writeln("Updating reboot dll..."); try { - await downloadRebootDll(rebootDownloadUrl, 0); + await downloadRebootDll(kRebootDownloadUrl); }catch(error){ stderr.writeln("Cannot update reboot dll: $error"); } diff --git a/cli/lib/src/game.dart b/cli/lib/src/game.dart index a694590..ff5dd50 100644 --- a/cli/lib/src/game.dart +++ b/cli/lib/src/game.dart @@ -1,10 +1,8 @@ -import 'dart:convert'; import 'dart:io'; import 'package:process_run/process_run.dart'; -import 'package:reboot_common/common.dart'; - import 'package:reboot_cli/cli.dart'; +import 'package:reboot_common/common.dart'; Process? _gameProcess; Process? _launcherProcess; @@ -24,7 +22,7 @@ Future startGame() async { stdout.writeln("No username was specified, using $username by default. Use --username to specify one"); } - _gameProcess = await Process.start(executable.path, createRebootArgs(username!, "", host, "")) + _gameProcess = await Process.start(executable.path, createRebootArgs(username!, "", host, host, "")) ..exitCode.then((_) => _onClose()) ..outLines.forEach((line) => _onGameOutput(line, dll, host, verbose)); _injectOrShowError("cobalt.dll"); @@ -54,12 +52,12 @@ void _onGameOutput(String line, String dll, bool hosting, bool verbose) { stdout.writeln(line); } - if (line.contains(shutdownLine)) { + if (line.contains(kShutdownLine)) { _onClose(); return; } - if(cannotConnectErrors.any((element) => line.contains(element))){ + if(kCannotConnectErrors.any((element) => line.contains(element))){ stderr.writeln("The backend doesn't work! Token expired"); _onClose(); return; diff --git a/cli/lib/src/server.dart b/cli/lib/src/server.dart index c9e32c0..fa74c04 100644 --- a/cli/lib/src/server.dart +++ b/cli/lib/src/server.dart @@ -7,7 +7,7 @@ Future startServerCli(String? host, String? port, ServerType type) async { stdout.writeln("Starting backend server..."); switch(type){ case ServerType.local: - var result = await pingAuthenticator(host ?? kDefaultAuthenticatorHost, port ?? kDefaultAuthenticatorPort); + var result = await pingAuthenticator(host ?? kDefaultAuthenticatorHost, port ?? kDefaultAuthenticatorPort.toString()); if(result == null){ throw Exception("Local backend server is not running"); } @@ -17,7 +17,7 @@ Future startServerCli(String? host, String? port, ServerType type) async { case ServerType.embedded: stdout.writeln("Starting an embedded server..."); await server.startEmbeddedAuthenticator(false); - var result = await pingAuthenticator(host ?? kDefaultAuthenticatorHost, port ?? kDefaultAuthenticatorPort); + var result = await pingAuthenticator(host ?? kDefaultAuthenticatorHost, port ?? kDefaultAuthenticatorPort.toString()); if(result == null){ throw Exception("Cannot start embedded server"); } diff --git a/cli/pubspec.yaml b/cli/pubspec.yaml index ec36601..db03abc 100644 --- a/cli/pubspec.yaml +++ b/cli/pubspec.yaml @@ -5,7 +5,7 @@ version: "1.0.0" publish_to: 'none' environment: - sdk: ">=2.19.0 <=3.3.3" + sdk: ">=2.19.0 <=3.3.4" dependencies: reboot_common: diff --git a/common/lib/common.dart b/common/lib/common.dart index 2812459..aa36d96 100644 --- a/common/lib/common.dart +++ b/common/lib/common.dart @@ -1,11 +1,7 @@ export 'package:reboot_common/src/constant/authenticator.dart'; export 'package:reboot_common/src/constant/game.dart'; export 'package:reboot_common/src/constant/matchmaker.dart'; -export 'package:reboot_common/src/constant/os.dart'; export 'package:reboot_common/src/constant/supabase.dart'; - - -export 'package:reboot_common/src/model/archive.dart'; export 'package:reboot_common/src/model/fortnite_build.dart'; export 'package:reboot_common/src/model/fortnite_version.dart'; export 'package:reboot_common/src/model/game_instance.dart'; @@ -13,12 +9,11 @@ export 'package:reboot_common/src/model/server_result.dart'; export 'package:reboot_common/src/model/server_type.dart'; export 'package:reboot_common/src/model/update_status.dart'; export 'package:reboot_common/src/model/update_timer.dart'; - export 'package:reboot_common/src/util/authenticator.dart'; export 'package:reboot_common/src/util/build.dart'; +export 'package:reboot_common/src/util/dll.dart'; export 'package:reboot_common/src/util/matchmaker.dart'; export 'package:reboot_common/src/util/network.dart'; export 'package:reboot_common/src/util/patcher.dart'; export 'package:reboot_common/src/util/path.dart'; export 'package:reboot_common/src/util/process.dart'; -export 'package:reboot_common/src/util/reboot.dart'; diff --git a/common/lib/src/constant/authenticator.dart b/common/lib/src/constant/authenticator.dart index 19dc408..37cbad7 100644 --- a/common/lib/src/constant/authenticator.dart +++ b/common/lib/src/constant/authenticator.dart @@ -1,2 +1,2 @@ const String kDefaultAuthenticatorHost = "127.0.0.1"; -const String kDefaultAuthenticatorPort = "3551"; \ No newline at end of file +const int kDefaultAuthenticatorPort = 3551; \ No newline at end of file diff --git a/common/lib/src/constant/game.dart b/common/lib/src/constant/game.dart index 0d1e8a3..85ca690 100644 --- a/common/lib/src/constant/game.dart +++ b/common/lib/src/constant/game.dart @@ -1,12 +1,13 @@ const String kDefaultPlayerName = "Player"; const String kDefaultGameServerHost = "127.0.0.1"; const String kDefaultGameServerPort = "7777"; -const String shutdownLine = "FOnlineSubsystemGoogleCommon::Shutdown()"; -const List corruptedBuildErrors = [ +const String kConsoleLine = "Region "; +const String kShutdownLine = "FOnlineSubsystemGoogleCommon::Shutdown()"; +const List kCorruptedBuildErrors = [ "when 0 bytes remain", "Pak chunk signature verification failed!" ]; -const List cannotConnectErrors = [ +const List kCannotConnectErrors = [ "port 3551 failed: Connection refused", "Unable to login to Fortnite servers", "HTTP 400 response from ", diff --git a/common/lib/src/constant/matchmaker.dart b/common/lib/src/constant/matchmaker.dart index fedd8fa..eaa43ed 100644 --- a/common/lib/src/constant/matchmaker.dart +++ b/common/lib/src/constant/matchmaker.dart @@ -1,2 +1,2 @@ const String kDefaultMatchmakerHost = "127.0.0.1"; -const String kDefaultMatchmakerPort = "8080"; \ No newline at end of file +const int kDefaultMatchmakerPort = 8080; \ No newline at end of file diff --git a/common/lib/src/constant/os.dart b/common/lib/src/constant/os.dart deleted file mode 100644 index 5e7b5ba..0000000 --- a/common/lib/src/constant/os.dart +++ /dev/null @@ -1 +0,0 @@ -const int appBarWidth = 2; \ No newline at end of file diff --git a/common/lib/src/constant/supabase.dart b/common/lib/src/constant/supabase.dart index 02fc1cb..6e6378f 100644 --- a/common/lib/src/constant/supabase.dart +++ b/common/lib/src/constant/supabase.dart @@ -1,2 +1,2 @@ -const String supabaseUrl = 'https://pocjparoguvaeeyjapjb.supabase.co'; -const String supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InBvY2pwYXJvZ3V2YWVleWphcGpiIiwicm9sZSI6ImFub24iLCJpYXQiOjE2OTUzMTM4NTUsImV4cCI6MjAxMDg4OTg1NX0.BffJtbQvX1NVUy-9Nj4GVzUJXPK_1GyezDE0V5MRiao'; \ No newline at end of file +const String supabaseUrl = 'https://drxuhdtyigthmjfhjgfl.supabase.co'; +const String supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRyeHVoZHR5aWd0aG1qZmhqZ2ZsIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODUzMDU4NjYsImV4cCI6MjAwMDg4MTg2Nn0.unuO67xf9CZgHi-3aXmC5p3RAktUfW7WwqDY-ccFN1M'; \ No newline at end of file diff --git a/common/lib/src/model/archive.dart b/common/lib/src/model/archive.dart deleted file mode 100644 index c292fb3..0000000 --- a/common/lib/src/model/archive.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'dart:io'; -import 'dart:isolate'; - -class ArchiveDownloadProgress { - final double progress; - final int? minutesLeft; - final bool extracting; - - ArchiveDownloadProgress(this.progress, this.minutesLeft, this.extracting); -} - -class ArchiveDownloadOptions { - String archiveUrl; - Directory destination; - SendPort port; - - ArchiveDownloadOptions(this.archiveUrl, this.destination, this.port); -} diff --git a/common/lib/src/model/fortnite_build.dart b/common/lib/src/model/fortnite_build.dart index 0d6526c..cde2518 100644 --- a/common/lib/src/model/fortnite_build.dart +++ b/common/lib/src/model/fortnite_build.dart @@ -1,6 +1,60 @@ +import 'dart:io'; +import 'dart:isolate'; + class FortniteBuild { + final String identifier; final String version; final String link; + final FortniteBuildSource source; - FortniteBuild({required this.version, required this.link}); + FortniteBuild({required this.identifier, required this.version, required this.link, required this.source}); +} + +enum FortniteBuildSource { + manifest, + archive +} + +class FortniteBuildDownloadProgress { + final double progress; + final int? minutesLeft; + final bool extracting; + + FortniteBuildDownloadProgress(this.progress, this.minutesLeft, this.extracting); +} + +class FortniteBuildDownloadOptions { + FortniteBuild build; + Directory destination; + SendPort port; + + FortniteBuildDownloadOptions(this.build, this.destination, this.port); +} + +class FortniteBuildManifestChunk { + List chunksIds; + String file; + int fileSize; + + FortniteBuildManifestChunk._internal(this.chunksIds, this.file, this.fileSize); + + factory FortniteBuildManifestChunk.fromJson(json) => FortniteBuildManifestChunk._internal( + List.from(json["ChunksIds"] as List), + json["File"], + json["FileSize"] + ); +} + +class FortniteBuildManifestFile { + String name; + List chunks; + int size; + + FortniteBuildManifestFile._internal(this.name, this.chunks, this.size); + + factory FortniteBuildManifestFile.fromJson(json) => FortniteBuildManifestFile._internal( + json["Name"], + List.from(json["Chunks"].map((chunk) => FortniteBuildManifestChunk.fromJson(chunk))), + json["Size"] + ); } diff --git a/common/lib/src/model/game_instance.dart b/common/lib/src/model/game_instance.dart index 5d42bcb..f29a843 100644 --- a/common/lib/src/model/game_instance.dart +++ b/common/lib/src/model/game_instance.dart @@ -8,35 +8,18 @@ class GameInstance { final int? eacPid; int? observerPid; bool hosting; + bool launched; bool tokenError; - bool linkedHosting; + GameInstance? child; - GameInstance(this.versionName, this.gamePid, this.launcherPid, this.eacPid, this.hosting, this.linkedHosting) - : tokenError = false, - assert(!linkedHosting || !hosting, "Only a game instance can have a linked hosting server"); - - GameInstance._fromJson(this.versionName, this.gamePid, this.launcherPid, this.eacPid, this.observerPid, - this.hosting, this.tokenError, this.linkedHosting); - - static GameInstance? fromJson(Map? json) { - if(json == null) { - return null; - } - - var gamePid = json["game"]; - if(gamePid == null) { - return null; - } - - var version = json["versionName"]; - var launcherPid = json["launcher"]; - var eacPid = json["eac"]; - var observerPid = json["observer"]; - var hosting = json["hosting"]; - var tokenError = json["tokenError"]; - var linkedHosting = json["linkedHosting"]; - return GameInstance._fromJson(version, gamePid, launcherPid, eacPid, observerPid, hosting, tokenError, linkedHosting); - } + GameInstance({ + required this.versionName, + required this.gamePid, + required this.launcherPid, + required this.eacPid, + required this.hosting, + required this.child + }): tokenError = false, launched = false; void kill() { Process.killPid(gamePid, ProcessSignal.sigabrt); @@ -49,16 +32,6 @@ class GameInstance { if(observerPid != null) { Process.killPid(observerPid!, ProcessSignal.sigabrt); } + child?.kill(); } - - Map toJson() => { - 'versionName': versionName, - 'game': gamePid, - 'launcher': launcherPid, - 'eac': eacPid, - 'observer': observerPid, - 'hosting': hosting, - 'tokenError': tokenError, - 'linkedHosting': linkedHosting - }; } diff --git a/common/lib/src/util/authenticator.dart b/common/lib/src/util/authenticator.dart index 407a78b..cf6a9f5 100644 --- a/common/lib/src/util/authenticator.dart +++ b/common/lib/src/util/authenticator.dart @@ -6,30 +6,27 @@ import 'package:shelf_proxy/shelf_proxy.dart'; final authenticatorDirectory = Directory("${assetsDirectory.path}\\authenticator"); final authenticatorStartExecutable = File("${authenticatorDirectory.path}\\lawinserver.exe"); -final authenticatorKillExecutable = File("${authenticatorDirectory.path}\\kill.bat"); Future startEmbeddedAuthenticator(bool detached) async => startBackgroundProcess( executable: authenticatorStartExecutable, window: detached ); -Future startRemoteAuthenticatorProxy(Uri uri) async => await serve(proxyHandler(uri), kDefaultAuthenticatorHost, int.parse(kDefaultAuthenticatorPort)); +Future startRemoteAuthenticatorProxy(Uri uri) async { + print("CALLED: $uri"); + return await serve(proxyHandler(uri), kDefaultAuthenticatorHost, kDefaultAuthenticatorPort); +} -Future isAuthenticatorPortFree() async => isPortFree(int.parse(kDefaultAuthenticatorPort)); +Future isAuthenticatorPortFree() async => await pingAuthenticator(kDefaultAuthenticatorHost, kDefaultAuthenticatorPort.toString()) == null; Future freeAuthenticatorPort() async { - await Process.run(authenticatorKillExecutable.path, []); - var standardResult = await isAuthenticatorPortFree(); + await killProcessByPort(kDefaultAuthenticatorPort); + final standardResult = await isAuthenticatorPortFree(); if(standardResult) { return true; } - var elevatedResult = await runElevatedProcess(authenticatorKillExecutable.path, ""); - if(!elevatedResult) { - return false; - } - - return await isAuthenticatorPortFree(); + return false; } Future pingAuthenticator(String host, String port, [bool https=false]) async { @@ -48,7 +45,7 @@ Future pingAuthenticator(String host, String port, [bool https=false]) asy var response = await request.close(); return response.statusCode == 200 || response.statusCode == 404 ? uri : null; }catch(_){ - return https || declaredScheme != null ? null : await pingAuthenticator(host, port, true); + return https || declaredScheme != null || isLocalHost(host) ? null : await pingAuthenticator(host, port, true); } } diff --git a/common/lib/src/util/build.dart b/common/lib/src/util/build.dart index a731c78..9521216 100644 --- a/common/lib/src/util/build.dart +++ b/common/lib/src/util/build.dart @@ -2,24 +2,62 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:isolate'; +import 'dart:typed_data'; +import 'package:dio/dio.dart'; import 'package:path/path.dart' as path; import 'package:reboot_common/common.dart'; -import 'package:dio/dio.dart'; + +const String kStopBuildDownloadSignal = "kill"; final Dio _dio = Dio(); -final String _manifestSourceUrl = "https://raw.githubusercontent.com/simplyblk/Fortnitebuilds/main/README.md"; +final String _archiveSourceUrl = "https://raw.githubusercontent.com/simplyblk/Fortnitebuilds/main/README.md"; final RegExp _rarProgressRegex = RegExp("^((100)|(\\d{1,2}(.\\d*)?))%\$"); +const String _manifestSourceUrl = "https://manifest.fnbuilds.services"; +const int _maxDownloadErrors = 30; Future> fetchBuilds(ignored) async { - var response = await _dio.get( - _manifestSourceUrl, + final results = await Future.wait([_fetchManifestBuilds(), _fetchArchiveBuilds()]); + final data = []; + for(final result in results) { + data.addAll(result); + } + + return data; +} + +Future> _fetchManifestBuilds() async { + try { + final response = await _dio.get("$_manifestSourceUrl/versions.json"); + final body = response.data; + return jsonDecode(body!).map((version) { + final nameParts = version.split("-"); + if(nameParts.length < 2) { + return null; + } + + final name = nameParts[1]; + return FortniteBuild( + identifier: name, + version: "Fortnite ${name}", + link: "$_manifestSourceUrl/$name/$name.manifest", + source: FortniteBuildSource.manifest + ); + }).whereType().toList(); + }catch(_) { + return []; + } +} + +Future> _fetchArchiveBuilds() async { + final response = await _dio.get( + _archiveSourceUrl, options: Options( responseType: ResponseType.plain ) ); if (response.statusCode != 200) { - throw Exception("Erroneous status code: ${response.statusCode}"); + return []; } var results = []; @@ -40,63 +78,154 @@ Future> fetchBuilds(ignored) async { var version = parts.first.trim(); version = version.substring(0, version.indexOf("-")); - results.add(FortniteBuild(version: "Fortnite $version", link: link)); + results.add(FortniteBuild( + identifier: version, + version: "Fortnite $version", + link: link, + source: FortniteBuildSource.archive + )); } return results; } -Future downloadArchiveBuild(ArchiveDownloadOptions options) async { - var stopped = _setupLifecycle(options); - var outputDir = Directory("${options.destination.path}\\.build"); - outputDir.createSync(recursive: true); - options.destination.createSync(recursive: true); - var fileName = options.archiveUrl.substring(options.archiveUrl.lastIndexOf("/") + 1); - var extension = path.extension(fileName); - var tempFile = File("${outputDir.path}\\$fileName"); - if(tempFile.existsSync()) { - tempFile.deleteSync(recursive: true); - } +Future downloadArchiveBuild(FortniteBuildDownloadOptions options) async { + try { + final stopped = _setupLifecycle(options); + switch(options.build.source) { + case FortniteBuildSource.archive: + final outputDir = Directory("${options.destination.path}\\.build"); + await outputDir.create(recursive: true); + final fileName = options.build.link.substring(options.build.link.lastIndexOf("/") + 1); + final extension = path.extension(fileName); + final tempFile = File("${outputDir.path}\\$fileName"); + if(await tempFile.exists()) { + await tempFile.delete(recursive: true); + } - var startTime = DateTime.now().millisecondsSinceEpoch; - var response = _downloadFile(options, tempFile, startTime); - await Future.any([stopped.future, response]); - if(!stopped.isCompleted) { - var awaitedResponse = await response; - if (!awaitedResponse.statusCode.toString().startsWith("20")) { - throw Exception("Erroneous status code: ${awaitedResponse.statusCode}"); + final startTime = DateTime.now().millisecondsSinceEpoch; + final response = _downloadArchive(options, tempFile, startTime); + await Future.any([stopped.future, response]); + if(!stopped.isCompleted) { + var awaitedResponse = await response; + if (!awaitedResponse.statusCode.toString().startsWith("20")) { + options.port.send("Erroneous status code: ${awaitedResponse.statusCode}"); + return; + } + + await _extractArchive(stopped, extension, tempFile, options); + } + + delete(outputDir); + break; + case FortniteBuildSource.manifest: + final response = await _dio.get(options.build.link); + final manifest = FortniteBuildManifestFile.fromJson(jsonDecode(response.data!)); + + final totalBytes = manifest.size; + final outputDir = options.destination; + await outputDir.create(recursive: true); + + final startTime = DateTime.now().millisecondsSinceEpoch; + final codec = GZipCodec(); + var completedBytes = 0; + var lastPercentage = 0.0; + + final writers = manifest.chunks.map((chunkedFile) async { + final outputFile = File('${outputDir.path}/${chunkedFile.file}'); + if(outputFile.existsSync()) { + if(outputFile.lengthSync() != chunkedFile.fileSize) { + await outputFile.delete(); + } else { + completedBytes += chunkedFile.fileSize; + final percentage = completedBytes * 100 / totalBytes; + if(percentage - lastPercentage > 0.1) { + _onProgress( + startTime, + DateTime.now().millisecondsSinceEpoch, + percentage, + false, + options + ); + } + return; + } + } + + await outputFile.parent.create(recursive: true); + for(final chunkId in chunkedFile.chunksIds) { + final response = await _dio.get( + "$_manifestSourceUrl/${options.build.identifier}/$chunkId.chunk", + options: Options( + responseType: ResponseType.bytes, + headers: { + "Accept-Encoding": "gzip" + } + ), + ); + var responseBody = response.data; + if(responseBody == null) { + continue; + } + + final decodedBody = codec.decode(responseBody); + await outputFile.writeAsBytes( + decodedBody, + mode: FileMode.append, + flush: true + ); + completedBytes += decodedBody.length; + + final percentage = completedBytes * 100 / totalBytes; + if(percentage - lastPercentage > 0.1) { + _onProgress( + startTime, + DateTime.now().millisecondsSinceEpoch, + percentage, + false, + options + ); + } + } + }); + await Future.any([stopped.future, Future.wait(writers)]); + options.port.send(FortniteBuildDownloadProgress(100, 0, true)); + break; + } + }catch(error, stackTrace) { + options.port.send("$error\n$stackTrace"); + } +} + +Future _downloadArchive(FortniteBuildDownloadOptions options, File tempFile, int startTime, [int? byteStart = null, int errorsCount = 0]) async { + var received = byteStart ?? 0; + try { + return await _dio.download( + options.build.link, + tempFile.path, + onReceiveProgress: (data, length) { + received = data; + final percentage = (received / length) * 100; + _onProgress(startTime, DateTime.now().millisecondsSinceEpoch, percentage, false, options); + }, + deleteOnError: false, + options: Options( + headers: byteStart == null ? null : { + "Range": "bytes=${byteStart}-" + } + ) + ); + }catch(error) { + if(errorsCount >= _maxDownloadErrors) { + throw error; } - await _extract(stopped, extension, tempFile, options); + return await _downloadArchive(options, tempFile, startTime, received, errorsCount + 1); } - - delete(outputDir); } -Future _downloadFile(ArchiveDownloadOptions options, File tempFile, int startTime, [int? byteStart = null]) { - var received = byteStart ?? 0; - return _dio.download( - options.archiveUrl, - tempFile.path, - onReceiveProgress: (data, length) { - received = data; - var now = DateTime.now(); - var progress = (received / length) * 100; - var msLeft = startTime + (now.millisecondsSinceEpoch - startTime) * length / received - now.millisecondsSinceEpoch; - var minutesLeft = (msLeft / 1000 / 60).round(); - options.port.send(ArchiveDownloadProgress(progress, minutesLeft, false)); - }, - deleteOnError: false, - options: Options( - headers: byteStart == null ? null : { - "Range": "bytes=${byteStart}-" - } - ) - ).catchError((error) => _downloadFile(options, tempFile, startTime, received)); -} - -Future _extract(Completer stopped, String extension, File tempFile, ArchiveDownloadOptions options) async { +Future _extractArchive(Completer stopped, String extension, File tempFile, FortniteBuildDownloadOptions options) async { var startTime = DateTime.now().millisecondsSinceEpoch; Process? process; switch (extension.toLowerCase()) { @@ -106,25 +235,20 @@ Future _extract(Completer stopped, String extension, File tempFil ["a", "-bsp1", '-o"${options.destination.path}"', tempFile.path] ); process.stdout.listen((bytes) { - var now = DateTime.now().millisecondsSinceEpoch; - var data = utf8.decode(bytes); + final now = DateTime.now().millisecondsSinceEpoch; + final data = utf8.decode(bytes); if(data == "Everything is Ok") { - options.port.send(ArchiveDownloadProgress(100, 0, true)); + options.port.send(FortniteBuildDownloadProgress(100, 0, true)); return; } - var element = data.trim().split(" ")[0]; + final element = data.trim().split(" ")[0]; if(!element.endsWith("%")) { return; } - var percentage = int.parse(element.substring(0, element.length - 1)); - if(percentage == 0) { - options.port.send(ArchiveDownloadProgress(percentage.toDouble(), null, true)); - return; - } - - _onProgress(startTime, now, percentage, options); + final percentage = int.parse(element.substring(0, element.length - 1)).toDouble(); + _onProgress(startTime, now, percentage, true, options); }); break; case ".rar": @@ -133,34 +257,29 @@ Future _extract(Completer stopped, String extension, File tempFil ["x", "-o+", tempFile.path, "*.*", options.destination.path] ); process.stdout.listen((event) { - var now = DateTime.now().millisecondsSinceEpoch; - var data = utf8.decode(event); + final now = DateTime.now().millisecondsSinceEpoch; + final data = utf8.decode(event); data.replaceAll("\r", "") .replaceAll("\b", "") .trim() .split("\n") .forEach((entry) { - if(entry == "All OK") { - options.port.send(ArchiveDownloadProgress(100, 0, true)); - return; - } + if(entry == "All OK") { + options.port.send(FortniteBuildDownloadProgress(100, 0, true)); + return; + } - var element = _rarProgressRegex.firstMatch(entry)?.group(1); - if(element == null) { - return; - } + final element = _rarProgressRegex.firstMatch(entry)?.group(1); + if(element == null) { + return; + } - var percentage = int.parse(element); - if(percentage == 0) { - options.port.send(ArchiveDownloadProgress(percentage.toDouble(), null, true)); - return; - } - - _onProgress(startTime, now, percentage, options); - }); + final percentage = int.parse(element).toDouble(); + _onProgress(startTime, now, percentage, true, options); + }); }); process.stderr.listen((event) { - var data = utf8.decode(event); + final data = utf8.decode(event); options.port.send(data); }); break; @@ -171,17 +290,22 @@ Future _extract(Completer stopped, String extension, File tempFil await Future.any([stopped.future, process.exitCode]); } -void _onProgress(int startTime, int now, int percentage, ArchiveDownloadOptions options) { - var msLeft = startTime + (now - startTime) * 100 / percentage - now; - var minutesLeft = (msLeft / 1000 / 60).round(); - options.port.send(ArchiveDownloadProgress(percentage.toDouble(), minutesLeft, true)); +void _onProgress(int startTime, int now, double percentage, bool extracting, FortniteBuildDownloadOptions options) { + if(percentage == 0) { + options.port.send(FortniteBuildDownloadProgress(percentage, null, extracting)); + return; + } + + final msLeft = startTime + (now - startTime) * 100 / percentage - now; + final minutesLeft = (msLeft / 1000 / 60).round(); + options.port.send(FortniteBuildDownloadProgress(percentage, minutesLeft, extracting)); } -Completer _setupLifecycle(ArchiveDownloadOptions options) { +Completer _setupLifecycle(FortniteBuildDownloadOptions options) { var stopped = Completer(); var lifecyclePort = ReceivePort(); lifecyclePort.listen((message) { - if(message == "kill") { + if(message == kStopBuildDownloadSignal && !stopped.isCompleted) { stopped.complete(); } }); diff --git a/common/lib/src/util/dll.dart b/common/lib/src/util/dll.dart new file mode 100644 index 0000000..32fa68c --- /dev/null +++ b/common/lib/src/util/dll.dart @@ -0,0 +1,64 @@ +import 'dart:io'; + +import 'package:archive/archive_io.dart'; +import 'package:http/http.dart' as http; +import 'package:path/path.dart' as path; +import 'package:reboot_common/common.dart'; + +bool _watcher = false; +final File rebootDllFile = File("${assetsDirectory.path}\\dlls\\reboot.dll"); +const String kRebootDownloadUrl = + "https://nightly.link/Milxnor/Project-Reboot-3.0/workflows/msbuild/master/Release.zip"; + +Future hasRebootDllUpdate(int? lastUpdateMs, {int hours = 24, bool force = false}) async { + final lastUpdate = await _getLastUpdate(lastUpdateMs); + final exists = await rebootDllFile.exists(); + final now = DateTime.now(); + return force || !exists || (hours > 0 && lastUpdate != null && now.difference(lastUpdate).inHours > hours); +} + +Future downloadCriticalDll(String name, String outputPath) async { + final response = await http.get(Uri.parse("https://github.com/Auties00/reboot_launcher/tree/master/gui/assets/dlls/$name")); + final output = File(outputPath); + await output.parent.create(recursive: true); + await output.writeAsBytes(response.bodyBytes); +} + +Future downloadRebootDll(String url) async { + Directory? outputDir; + final now = DateTime.now(); + try { + final response = await http.get(Uri.parse(url)); + outputDir = await installationDirectory.createTemp("reboot_out"); + final tempZip = File("${outputDir.path}\\reboot.zip"); + await tempZip.writeAsBytes(response.bodyBytes); + await extractFileToDisk(tempZip.path, outputDir.path); + final rebootDll = File(outputDir.listSync().firstWhere((element) => path.extension(element.path) == ".dll").path); + await rebootDllFile.writeAsBytes(await rebootDll.readAsBytes()); + return now.millisecondsSinceEpoch; + } finally{ + if(outputDir != null) { + delete(outputDir); + } + } +} + +Future _getLastUpdate(int? lastUpdateMs) async { + return lastUpdateMs != null + ? DateTime.fromMillisecondsSinceEpoch(lastUpdateMs) + : null; +} + +Stream watchDlls() async* { + if(_watcher) { + return; + } + + _watcher = true; + await for(final event in rebootDllFile.parent.watch(events: FileSystemEvent.delete | FileSystemEvent.move)) { + print(event); + if (event.path.endsWith(".dll")) { + yield event.path; + } + } +} diff --git a/common/lib/src/util/matchmaker.dart b/common/lib/src/util/matchmaker.dart index 69a855c..79cbe7a 100644 --- a/common/lib/src/util/matchmaker.dart +++ b/common/lib/src/util/matchmaker.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:io'; import 'package:ini/ini.dart'; - import 'package:reboot_common/common.dart'; import 'package:sync/semaphore.dart'; @@ -75,21 +74,16 @@ Future writeMatchmakingIp(String text) async { await matchmakerConfigFile.writeAsString(config.toString(), flush: true); } -Future isMatchmakerPortFree() async => isPortFree(int.parse(kDefaultMatchmakerPort)); +Future isMatchmakerPortFree() async => await pingMatchmaker(kDefaultMatchmakerHost, kDefaultMatchmakerPort.toString()) == null; Future freeMatchmakerPort() async { - await Process.run(matchmakerKillExecutable.path, []); - var standardResult = await isMatchmakerPortFree(); + await killProcessByPort(kDefaultMatchmakerPort); + final standardResult = await isMatchmakerPortFree(); if(standardResult) { return true; } - var elevatedResult = await runElevatedProcess(matchmakerKillExecutable.path, ""); - if(!elevatedResult) { - return false; - } - - return await isMatchmakerPortFree(); + return false; } Future pingMatchmaker(String host, String port, [bool wss=false]) async { @@ -124,7 +118,7 @@ Future pingMatchmaker(String host, String port, [bool wss=false]) async { await socket.close(); return result ? uri : null; }catch(_){ - return wss || declaredScheme != null ? null : await pingMatchmaker(host, port, true); + return wss || declaredScheme != null || isLocalHost(host) ? null : await pingMatchmaker(host, port, true); } } diff --git a/common/lib/src/util/network.dart b/common/lib/src/util/network.dart index e177291..fefb60d 100644 --- a/common/lib/src/util/network.dart +++ b/common/lib/src/util/network.dart @@ -1,22 +1,95 @@ -import 'dart:io'; +import 'dart:ffi'; -import 'package:reboot_common/common.dart'; +import 'package:ffi/ffi.dart'; +import 'package:win32/win32.dart'; + +const _AF_INET = 2; +const _TCP_TABLE_OWNER_PID_LISTENER = 3; + +final _getExtendedTcpTable = DynamicLibrary.open('iphlpapi.dll').lookupFunction< + Int32 Function(Pointer, Pointer, Int32, Int32, Int32, Int32), + int Function(Pointer, Pointer, int, int, int, int)>('GetExtendedTcpTable'); + +class _MIB_TCPROW_OWNER_PID extends Struct { + @Uint32() + external int dwState; + + @Uint32() + external int dwLocalAddr; + + @Uint32() + external int dwLocalPort; + + @Uint32() + external int dwRemoteAddr; + + @Uint32() + external int dwRemotePort; + + @Uint32() + external int dwOwningPid; +} + +class _MIB_TCPTABLE_OWNER_PID extends Struct { + @Uint32() + external int dwNumEntries; + + @Array(1) + external Array<_MIB_TCPROW_OWNER_PID> table; +} bool isLocalHost(String host) => host.trim() == "127.0.0.1" || host.trim().toLowerCase() == "localhost" || host.trim() == "0.0.0.0"; -Future isPortFree(int port) async { - try { - final server = await ServerSocket.bind(InternetAddress.anyIPv4, port); - await server.close(); - return true; - } catch (e) { - return false; +bool killProcessByPort(int port) { + var pTcpTable = calloc<_MIB_TCPTABLE_OWNER_PID>(); + final dwSize = calloc(); + dwSize.value = 0; + + int result = _getExtendedTcpTable( + nullptr, + dwSize, + FALSE, + _AF_INET, + _TCP_TABLE_OWNER_PID_LISTENER, + 0 + ); + if (result == ERROR_INSUFFICIENT_BUFFER) { + pTcpTable = calloc<_MIB_TCPTABLE_OWNER_PID>(dwSize.value); + result = _getExtendedTcpTable( + pTcpTable, + dwSize, + FALSE, + _AF_INET, + _TCP_TABLE_OWNER_PID_LISTENER, + 0 + ); } + + if (result == NO_ERROR) { + final table = pTcpTable.ref; + for (int i = 0; i < table.dwNumEntries; i++) { + final row = table.table[i]; + final localPort = _htons(row.dwLocalPort); + if (localPort == port) { + final pid = row.dwOwningPid; + calloc.free(pTcpTable); + calloc.free(dwSize); + final hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid); + if (hProcess != NULL) { + final result = TerminateProcess(hProcess, 0); + CloseHandle(hProcess); + return result != 0; + } + return false; + } + } + } + + calloc.free(pTcpTable); + calloc.free(dwSize); + return false; } -Future resetWinNat() async { - var binary = File("${assetsDirectory.path}\\misc\\winnat.bat"); - await runElevatedProcess(binary.path, ""); -} \ No newline at end of file +int _htons(int port) => ((port & 0xFF) << 8) | ((port >> 8) & 0xFF); \ No newline at end of file diff --git a/common/lib/src/util/path.dart b/common/lib/src/util/path.dart index c5d1b12..fbb7711 100644 --- a/common/lib/src/util/path.dart +++ b/common/lib/src/util/path.dart @@ -1,8 +1,8 @@ import 'dart:io'; import 'dart:isolate'; -import 'package:reboot_common/common.dart'; import 'package:path/path.dart' as path; +import 'package:reboot_common/common.dart'; Directory get installationDirectory => File(Platform.resolvedExecutable).parent; diff --git a/common/lib/src/util/process.dart b/common/lib/src/util/process.dart index abda700..560877d 100644 --- a/common/lib/src/util/process.dart +++ b/common/lib/src/util/process.dart @@ -4,10 +4,13 @@ import 'dart:async'; import 'dart:ffi'; import 'dart:io'; import 'dart:isolate'; +import 'dart:math'; import 'package:ffi/ffi.dart'; import 'package:win32/win32.dart'; +import '../constant/game.dart'; + final _ntdll = DynamicLibrary.open('ntdll.dll'); final _kernel32 = DynamicLibrary.open('kernel32.dll'); final _CreateRemoteThread = _kernel32.lookupFunction< @@ -84,23 +87,23 @@ Future injectDll(int pid, String dll) async { } } -Future runElevatedProcess(String executable, String args) async { - var shellInput = calloc(); +bool runElevatedProcess(String executable, String args) { + final shellInput = calloc(); shellInput.ref.lpFile = executable.toNativeUtf16(); shellInput.ref.lpParameters = args.toNativeUtf16(); shellInput.ref.nShow = SW_HIDE; shellInput.ref.fMask = ES_AWAYMODE_REQUIRED; shellInput.ref.lpVerb = "runas".toNativeUtf16(); shellInput.ref.cbSize = sizeOf(); - var shellResult = ShellExecuteEx(shellInput); - return shellResult == 1; + final result = ShellExecuteEx(shellInput) == 1; + free(shellInput); + return result; } - void _startBackgroundProcess(_BackgroundProcessParameters params) { var args = params.args; var concatenatedArgs = args == null ? "" : " ${args.map((entry) => '"$entry"').join(" ")}"; - var executablePath = TEXT("${params.executable.path}$concatenatedArgs"); + var executablePath = TEXT('cmd.exe /k "${params.executable.path}"$concatenatedArgs'); var startupInfo = calloc(); var processInfo = calloc(); var windowFlag = params.window ? CREATE_NEW_CONSOLE : CREATE_NO_WINDOW; @@ -203,4 +206,57 @@ Future watchProcess(int pid) async { var result = await completer.future; isolate.kill(priority: Isolate.immediate); return result; +} + +List createRebootArgs(String username, String password, bool host, bool headless, String additionalArgs) { + if(password.isEmpty) { + username = '${_parseUsername(username, host)}@projectreboot.dev'; + } + + password = password.isNotEmpty ? password : "Rebooted"; + var args = [ + "-epicapp=Fortnite", + "-epicenv=Prod", + "-epiclocale=en-us", + "-epicportal", + "-skippatchcheck", + "-nobe", + "-fromfl=eac", + "-fltoken=3db3ba5dcbd2e16703f3978d", + "-caldera=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiYmU5ZGE1YzJmYmVhNDQwN2IyZjQwZWJhYWQ4NTlhZDQiLCJnZW5lcmF0ZWQiOjE2Mzg3MTcyNzgsImNhbGRlcmFHdWlkIjoiMzgxMGI4NjMtMmE2NS00NDU3LTliNTgtNGRhYjNiNDgyYTg2IiwiYWNQcm92aWRlciI6IkVhc3lBbnRpQ2hlYXQiLCJub3RlcyI6IiIsImZhbGxiYWNrIjpmYWxzZX0.VAWQB67RTxhiWOxx7DBjnzDnXyyEnX7OljJm-j2d88G_WgwQ9wrE6lwMEHZHjBd1ISJdUO1UVUqkfLdU5nofBQ", + "-AUTH_LOGIN=$username", + "-AUTH_PASSWORD=${password.isNotEmpty ? password : "Rebooted"}", + "-AUTH_TYPE=epic" + ]; + + if(host && headless){ + args.addAll([ + "-nullrhi", + "-nosplash", + "-nosound", + ]); + } + + if(additionalArgs.isNotEmpty){ + args.addAll(additionalArgs.split(" ")); + } + + return args; +} + +String _parseUsername(String username, bool host) { + if(host) { + return "Player${Random().nextInt(1000)}"; + } + + if (username.isEmpty) { + return kDefaultPlayerName; + } + + username = username.replaceAll(RegExp("[^A-Za-z0-9]"), "").trim(); + if(username.isEmpty){ + return kDefaultPlayerName; + } + + return username; } \ No newline at end of file diff --git a/common/lib/src/util/reboot.dart b/common/lib/src/util/reboot.dart deleted file mode 100644 index a49eecb..0000000 --- a/common/lib/src/util/reboot.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'dart:io'; -import 'dart:math'; - -import 'package:archive/archive_io.dart'; -import 'package:crypto/crypto.dart'; -import 'package:http/http.dart' as http; -import 'package:path/path.dart' as path; -import 'package:reboot_common/common.dart'; - -const String rebootDownloadUrl = - "https://nightly.link/Milxnor/Project-Reboot-3.0/workflows/msbuild/main/Release.zip"; -final File rebootDllFile = File("${assetsDirectory.path}\\dlls\\reboot.dll"); - -List createRebootArgs(String username, String password, bool host, String additionalArgs) { - if(password.isEmpty) { - username = '${_parseUsername(username, host)}@projectreboot.dev'; - } - - password = password.isNotEmpty ? password : "Rebooted"; - var args = [ - "-epicapp=Fortnite", - "-epicenv=Prod", - "-epiclocale=en-us", - "-epicportal", - "-skippatchcheck", - "-nobe", - "-fromfl=eac", - "-fltoken=3db3ba5dcbd2e16703f3978d", - "-caldera=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiYmU5ZGE1YzJmYmVhNDQwN2IyZjQwZWJhYWQ4NTlhZDQiLCJnZW5lcmF0ZWQiOjE2Mzg3MTcyNzgsImNhbGRlcmFHdWlkIjoiMzgxMGI4NjMtMmE2NS00NDU3LTliNTgtNGRhYjNiNDgyYTg2IiwiYWNQcm92aWRlciI6IkVhc3lBbnRpQ2hlYXQiLCJub3RlcyI6IiIsImZhbGxiYWNrIjpmYWxzZX0.VAWQB67RTxhiWOxx7DBjnzDnXyyEnX7OljJm-j2d88G_WgwQ9wrE6lwMEHZHjBd1ISJdUO1UVUqkfLdU5nofBQ", - "-AUTH_LOGIN=$username", - "-AUTH_PASSWORD=${password.isNotEmpty ? password : "Rebooted"}", - "-AUTH_TYPE=epic" - ]; - - if(host){ - args.addAll([ - "-nullrhi", - "-nosplash", - "-nosound", - ]); - } - - if(additionalArgs.isNotEmpty){ - args.addAll(additionalArgs.split(" ")); - } - - return args; -} - -String _parseUsername(String username, bool host) { - if(host) { - return "Player${Random().nextInt(1000)}"; - } - - if (username.isEmpty) { - return kDefaultPlayerName; - } - - username = username.replaceAll(RegExp("[^A-Za-z0-9]"), "").trim(); - if(username.isEmpty){ - return kDefaultPlayerName; - } - - return username; -} - - -Future downloadRebootDll(String url, int? lastUpdateMs, {int hours = 24, bool force = false}) async { - Directory? outputDir; - var now = DateTime.now(); - try { - var lastUpdate = await _getLastUpdate(lastUpdateMs); - var exists = await rebootDllFile.exists(); - if (!force && lastUpdate != null && now.difference(lastUpdate).inHours <= hours && exists) { - return lastUpdateMs!; - } - - var response = await http.get(Uri.parse(rebootDownloadUrl)); - outputDir = await installationDirectory.createTemp("reboot_out"); - var tempZip = File("${outputDir.path}\\reboot.zip"); - await tempZip.writeAsBytes(response.bodyBytes); - await extractFileToDisk(tempZip.path, outputDir.path); - var rebootDll = File(outputDir.listSync().firstWhere((element) => path.extension(element.path) == ".dll").path); - if (!exists || sha1.convert(await rebootDllFile.readAsBytes()) != sha1.convert(await rebootDll.readAsBytes())) { - await rebootDllFile.writeAsBytes(await rebootDll.readAsBytes()); - } - - return now.millisecondsSinceEpoch; - } finally{ - if(outputDir != null) { - delete(outputDir); - } - } -} - -Future _getLastUpdate(int? lastUpdateMs) async { - return lastUpdateMs != null - ? DateTime.fromMillisecondsSinceEpoch(lastUpdateMs) - : null; -} diff --git a/common/pubspec.yaml b/common/pubspec.yaml index 00a302f..6fa9176 100644 --- a/common/pubspec.yaml +++ b/common/pubspec.yaml @@ -4,7 +4,7 @@ version: "1.0.0" publish_to: 'none' environment: - sdk: ">=2.19.0 <=3.3.3" + sdk: ">=2.19.0 <=3.3.4" dependencies: dio: ^5.3.2 diff --git a/watch/lib/watch.dart b/daemon/lib/watch.dart similarity index 95% rename from watch/lib/watch.dart rename to daemon/lib/watch.dart index 1bdefa9..f73f809 100644 --- a/watch/lib/watch.dart +++ b/daemon/lib/watch.dart @@ -1,4 +1,5 @@ import 'dart:io'; + import 'package:reboot_common/common.dart'; import 'package:supabase/supabase.dart'; @@ -19,7 +20,7 @@ void main(List args) async { Process.killPid(launcherPid, ProcessSignal.sigabrt); Process.killPid(eacPid, ProcessSignal.sigabrt); if(hosting) { - await supabase.from('hosts') + await supabase.from("hosting") .delete() .match({'id': uuid}); } diff --git a/watch/pubspec.yaml b/daemon/pubspec.yaml similarity index 87% rename from watch/pubspec.yaml rename to daemon/pubspec.yaml index 7cacf5c..fa25c39 100644 --- a/watch/pubspec.yaml +++ b/daemon/pubspec.yaml @@ -4,7 +4,7 @@ version: "1.0.0" publish_to: 'none' environment: - sdk: ">=2.19.0 <=3.3.3" + sdk: ">=2.19.0 <=3.3.4" dependencies: supabase: ^1.9.1 diff --git a/dependencies/authenticator b/dependencies/authenticator deleted file mode 160000 index 2ea81cb..0000000 --- a/dependencies/authenticator +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2ea81cbde54ae82d958045373b52d478d0e6aae0 diff --git a/dependencies/matchmaker b/dependencies/matchmaker deleted file mode 160000 index 0047d0d..0000000 --- a/dependencies/matchmaker +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0047d0db973ce707e02cbe549007fdad35cf4349 diff --git a/dependencies/reboot/.gitattributes b/dependencies/reboot/.gitattributes deleted file mode 100644 index dfe0770..0000000 --- a/dependencies/reboot/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/dependencies/reboot/.github/workflows/msbuild.yml b/dependencies/reboot/.github/workflows/msbuild.yml deleted file mode 100644 index 6a34da3..0000000 --- a/dependencies/reboot/.github/workflows/msbuild.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: MSBuild - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - -env: - # Path to the solution file relative to the root of the project. - SOLUTION_FILE_PATH: . - - # Configuration type to build. - # You can convert this to a build matrix if you need coverage of multiple configuration types. - # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix - BUILD_CONFIGURATION: Release - -permissions: - contents: read - -jobs: - build: - runs-on: windows-latest - - steps: - - uses: actions/checkout@v3 - - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1.0.2 - - - name: Restore NuGet packages - working-directory: ${{env.GITHUB_WORKSPACE}} - run: nuget restore ${{env.SOLUTION_FILE_PATH}} - - - name: Build - working-directory: ${{env.GITHUB_WORKSPACE}} - # Add additional options to the MSBuild command line here (like platform or verbosity level). - # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference - run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}} - - - name: Upload Release Artifact - uses: actions/upload-artifact@v3 - with: - name: Release - path: ${{env.SOLUTION_FILE_PATH}}/x64/Release - if-no-files-found: warn - retention-days: 60 diff --git a/dependencies/reboot/.gitignore b/dependencies/reboot/.gitignore deleted file mode 100644 index 8cbf4b7..0000000 --- a/dependencies/reboot/.gitignore +++ /dev/null @@ -1,387 +0,0 @@ -## 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 -.vs/Project Reboot 3.0/v17/Browse.VC.db -.vs/Project Reboot 3.0/v17/.suo -.vs/Project Reboot 3.0/v17/fileList.bin -.vs/Project Reboot 3.0/v17/ipch/AutoPCH/389a1fa1f6dcd16f/DLLMAIN.ipch -.vs/Project Reboot 3.0/v17/ipch/AutoPCH/6b05e7771d6ded15/UTIL.ipch -Project Reboot 3.0/x64/Release/Project Reboot 3.0.tlog/CL.read.1.tlog -Project Reboot 3.0/x64/Release/Project Reboot 3.0.tlog/link.read.1.tlog -Project Reboot 3.0/x64/Release/Project Reboot 3.0.tlog/CL.write.1.tlog -Project Reboot 3.0e/x64/Release/vc143.pdb -x64/Release/Project Reboot 3.0.pdb -Project Reboot 3.0/x64/Release/Project Reboot 3.0.log -Project Reboot 3.0/x64/Release/Project Reboot 3.0.ipdb -Project Reboot 3.0/x64/Release/Project Reboot 3.0.iobj -.vs/Project Reboot 3.0/v17/Browse.VC.db -.vs/Project Reboot 3.0/v17/.suo -.vs/Project Reboot 3.0/v17/.suo -*.db -*.bin -*.ipch -*.ipdb -*.iobj -*.tlog -*.ifc -*.pdb diff --git a/dependencies/reboot/LICENSE b/dependencies/reboot/LICENSE deleted file mode 100644 index 245001d..0000000 --- a/dependencies/reboot/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2023, Milxnor -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/dependencies/reboot/Project Reboot 3.0.sln b/dependencies/reboot/Project Reboot 3.0.sln deleted file mode 100644 index da654b9..0000000 --- a/dependencies/reboot/Project Reboot 3.0.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.2.32630.192 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Project Reboot 3.0", "Project Reboot 3.0\Project Reboot 3.0.vcxproj", "{69618184-B9DB-4982-B4FE-F83E9BDD0555}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {69618184-B9DB-4982-B4FE-F83E9BDD0555}.Debug|x64.ActiveCfg = Debug|x64 - {69618184-B9DB-4982-B4FE-F83E9BDD0555}.Debug|x64.Build.0 = Debug|x64 - {69618184-B9DB-4982-B4FE-F83E9BDD0555}.Debug|x86.ActiveCfg = Debug|Win32 - {69618184-B9DB-4982-B4FE-F83E9BDD0555}.Debug|x86.Build.0 = Debug|Win32 - {69618184-B9DB-4982-B4FE-F83E9BDD0555}.Release|x64.ActiveCfg = Release|x64 - {69618184-B9DB-4982-B4FE-F83E9BDD0555}.Release|x64.Build.0 = Release|x64 - {69618184-B9DB-4982-B4FE-F83E9BDD0555}.Release|x86.ActiveCfg = Release|Win32 - {69618184-B9DB-4982-B4FE-F83E9BDD0555}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {ABF83670-C6F5-441C-9B62-254EF634207B} - EndGlobalSection -EndGlobal diff --git a/dependencies/reboot/Project Reboot 3.0/AbilitySystemComponent.h b/dependencies/reboot/Project Reboot 3.0/AbilitySystemComponent.h deleted file mode 100644 index f313acd..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AbilitySystemComponent.h +++ /dev/null @@ -1,103 +0,0 @@ -#pragma once - -#include "Object.h" -#include "GameplayAbilitySpec.h" -#include "AttributeSet.h" - -struct PadHex10 { char Pad[0x10]; }; -struct PadHex18 { char Pad[0x18]; }; -struct PadHexA8 { char Pad[0xA8]; }; -struct PadHexB0 { char Pad[0xB0]; }; - -// using FPredictionKey = PadHex18; -// using FGameplayEventData = PadHexA8; - -// using FPredictionKey = PadHex10; -using FGameplayEventData = PadHexB0; - -// using FGameplayEventData = __int64; - -struct FPredictionKey // todo move -{ - // __int64 real; - - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/GameplayAbilities.PredictionKey"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } -}; - -struct FGameplayEffectContextHandle -{ - unsigned char UnknownData00[0x18]; // 0x0000(0x0018) MISSED OFFSET -}; - -struct FActiveGameplayEffectHandle -{ - int Handle; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData) - bool bPassedFiltersAndWasExecuted; // 0x0004(0x0001) (ZeroConstructor, IsPlainOldData) - unsigned char UnknownData00[0x3]; // 0x0005(0x0003) MISSED OFFSET -}; - -struct FGameplayAbilitySpecContainer : public FFastArraySerializer -{ - TArray& GetItems() - { - static auto ItemsOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpecContainer", "Items"); - return *(TArray*)(__int64(this) + ItemsOffset); - } -}; - -class UAbilitySystemComponent : public UObject -{ -public: - static inline FGameplayAbilitySpecHandle* (*GiveAbilityOriginal)(UAbilitySystemComponent*, FGameplayAbilitySpecHandle*, __int64 inSpec); - static inline bool (*InternalTryActivateAbilityOriginal)(UAbilitySystemComponent*, FGameplayAbilitySpecHandle Handle, PadHex10 InPredictionKey, UObject** OutInstancedAbility, void* OnGameplayAbilityEndedDelegate, const FGameplayEventData* TriggerEventData); - static inline bool (*InternalTryActivateAbilityOriginal2)(UAbilitySystemComponent*, FGameplayAbilitySpecHandle Handle, PadHex18 InPredictionKey, UObject** OutInstancedAbility, void* OnGameplayAbilityEndedDelegate, const FGameplayEventData* TriggerEventData); - - void ClientActivateAbilityFailed(FGameplayAbilitySpecHandle AbilityToActivate, int16_t PredictionKey) - { - struct { FGameplayAbilitySpecHandle AbilityToActivate; int16_t PredictionKey; } UAbilitySystemComponent_ClientActivateAbilityFailed_Params{ AbilityToActivate, PredictionKey }; - static auto fn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.ClientActivateAbilityFailed"); - - this->ProcessEvent(fn, &UAbilitySystemComponent_ClientActivateAbilityFailed_Params); - } - - TArray& GetSpawnedAttributes() - { - static auto SpawnedAttributesOffset = GetOffset("SpawnedAttributes"); - return Get>(SpawnedAttributesOffset); - } - - FGameplayAbilitySpecContainer* GetActivatableAbilities() - { - static auto ActivatableAbilitiesOffset = this->GetOffset("ActivatableAbilities"); - return GetPtr(ActivatableAbilitiesOffset); - } - - UAttributeSet* AddDefaultSubobjectSet(UAttributeSet* Subobject) - { - GetSpawnedAttributes().Add(Subobject); - return Subobject; - } - - void ServerEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo, FPredictionKey* PredictionKey); - void ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo); - void ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo* ActivationInfo); - bool HasAbility(UObject* DefaultAbility); - FActiveGameplayEffectHandle ApplyGameplayEffectToSelf(UClass* GameplayEffectClass, float Level, const FGameplayEffectContextHandle& EffectContext = FGameplayEffectContextHandle()); - // FGameplayEffectContextHandle MakeEffectContext(); - void RemoveActiveGameplayEffectBySourceEffect(UClass* GEClass, int StacksToRemove, UAbilitySystemComponent* Instigator); - void ConsumeAllReplicatedData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey* AbilityOriginalPredictionKey); - FGameplayAbilitySpecHandle GiveAbilityEasy(UClass* AbilityClass, UObject* SourceObject = nullptr, bool bDoNotRegive = true); - FGameplayAbilitySpec* FindAbilitySpecFromHandle(FGameplayAbilitySpecHandle Handle); - void RemoveActiveGameplayEffectBySourceEffect(UClass* GameplayEffect, UAbilitySystemComponent* InstigatorAbilitySystemComponent, int StacksToRemove); - void ClearAbility(const FGameplayAbilitySpecHandle& Handle); - - static void InternalServerTryActivateAbilityHook(UAbilitySystemComponent* AbilitySystemComponent, FGameplayAbilitySpecHandle Handle, bool InputPressed, const FPredictionKey* PredictionKey, const FGameplayEventData* TriggerEventData); -}; - -void LoopSpecs(UAbilitySystemComponent* AbilitySystemComponent, std::function func); \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AbilitySystemComponent_Abilities.cpp b/dependencies/reboot/Project Reboot 3.0/AbilitySystemComponent_Abilities.cpp deleted file mode 100644 index f7d1442..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AbilitySystemComponent_Abilities.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#include "AbilitySystemComponent.h" -#include "NetSerialization.h" -#include "Actor.h" -#include "FortPawn.h" -#include "FortPlayerController.h" -#include "FortPlayerStateAthena.h" - -void LoopSpecs(UAbilitySystemComponent* AbilitySystemComponent, std::function func) -{ - static auto ActivatableAbilitiesOffset = AbilitySystemComponent->GetOffset("ActivatableAbilities"); - auto ActivatableAbilities = AbilitySystemComponent->GetPtr(ActivatableAbilitiesOffset); - - static auto ItemsOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpecContainer", "Items"); - auto Items = (TArray*)(__int64(ActivatableAbilities) + ItemsOffset); - - static auto SpecSize = FGameplayAbilitySpec::GetStructSize(); - - if (ActivatableAbilities && Items) - { - for (int i = 0; i < Items->Num(); ++i) - { - auto CurrentSpec = Items->AtPtr(i, SpecSize); // (FGameplayAbilitySpec*)(__int64(Items->Data) + (static_cast(SpecSize) * i)); - func(CurrentSpec); - } - } -} - -FActiveGameplayEffectHandle UAbilitySystemComponent::ApplyGameplayEffectToSelf(UClass* GameplayEffectClass, float Level, const FGameplayEffectContextHandle& EffectContext) -{ - static auto BP_ApplyGameplayEffectToSelfFn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.BP_ApplyGameplayEffectToSelf"); - - struct - { - UClass* GameplayEffectClass; // (Parm, ZeroConstructor, IsPlainOldData) - float Level; // (Parm, ZeroConstructor, IsPlainOldData) - FGameplayEffectContextHandle EffectContext; // (Parm) - FActiveGameplayEffectHandle ReturnValue; // (Parm, OutParm, ReturnParm) - }UAbilitySystemComponent_BP_ApplyGameplayEffectToSelf_Params{GameplayEffectClass, Level, EffectContext}; - - this->ProcessEvent(BP_ApplyGameplayEffectToSelfFn, &UAbilitySystemComponent_BP_ApplyGameplayEffectToSelf_Params); - - return UAbilitySystemComponent_BP_ApplyGameplayEffectToSelf_Params.ReturnValue; -} - -/* FGameplayEffectContextHandle UAbilitySystemComponent::MakeEffectContext() -{ - static auto MakeEffectContextFn = FindObject("/Script/GameplayAbilities.AbilitySystemComponent.MakeEffectContext"); - FGameplayEffectContextHandle ContextHandle; - this->ProcessEvent(MakeEffectContextFn, &ContextHandle); - return ContextHandle; -} */ - -void UAbilitySystemComponent::ServerEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo, FPredictionKey* PredictionKey) -{ - static auto ServerEndAbilityFn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility"); - - auto Params = Alloc(ServerEndAbilityFn->GetPropertiesSize()); - - if (!Params) - return; - - static auto AbilityToEndOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "AbilityToEnd"); - static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "ActivationInfo"); - static auto PredictionKeyOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ServerEndAbility", "PredictionKey"); - - *(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToEndOffset) = AbilityToEnd; - CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize()); - CopyStruct((FPredictionKey*)(__int64(Params) + PredictionKeyOffset), PredictionKey, FPredictionKey::GetStructSize()); - - this->ProcessEvent(ServerEndAbilityFn, Params); - - VirtualFree(Params, 0, MEM_RELEASE); -} - -void UAbilitySystemComponent::ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo* ActivationInfo) -{ - static auto ClientEndAbilityFn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility"); - - auto Params = Alloc(ClientEndAbilityFn->GetPropertiesSize()); - - static auto AbilityToEndOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility", "AbilityToEnd"); - static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientEndAbility", "ActivationInfo"); - - *(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToEndOffset) = AbilityToEnd; - CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize()); - - this->ProcessEvent(ClientEndAbilityFn, Params); - - VirtualFree(Params, 0, MEM_RELEASE); -} - -void UAbilitySystemComponent::ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo* ActivationInfo) -{ - static auto ClientCancelAbilityFn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility"); - - auto Params = Alloc(ClientCancelAbilityFn->GetPropertiesSize()); - - static auto AbilityToCancelOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility", "AbilityToCancel"); - static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.AbilitySystemComponent.ClientCancelAbility", "ActivationInfo"); - - *(FGameplayAbilitySpecHandle*)(__int64(Params) + AbilityToCancelOffset) = AbilityToCancel; - CopyStruct((FGameplayAbilityActivationInfo*)(__int64(Params) + ActivationInfoOffset), ActivationInfo, FGameplayAbilityActivationInfo::GetStructSize()); - - this->ProcessEvent(ClientCancelAbilityFn, Params); - - VirtualFree(Params, 0, MEM_RELEASE); -} - -bool UAbilitySystemComponent::HasAbility(UObject* DefaultAbility) -{ - auto ActivatableAbilities = GetActivatableAbilities(); - - auto& Items = ActivatableAbilities->GetItems(); - - for (int i = 0; i < Items.Num(); ++i) - { - auto Spec = Items.AtPtr(i, FGameplayAbilitySpec::GetStructSize()); - - if (Spec->GetAbility() == DefaultAbility) - return true; - } - - return false; -} - -void UAbilitySystemComponent::RemoveActiveGameplayEffectBySourceEffect(UClass* GEClass, int StacksToRemove, UAbilitySystemComponent* Instigator) -{ - static auto RemoveActiveGameplayEffectBySourceEffectFn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.RemoveActiveGameplayEffectBySourceEffect"); - struct { UClass* GameplayEffect; UObject* InstigatorAbilitySystemComponent; int StacksToRemove; } UAbilitySystemComponent_RemoveActiveGameplayEffectBySourceEffect_Params{ GEClass, Instigator, StacksToRemove }; - - this->ProcessEvent(RemoveActiveGameplayEffectBySourceEffectFn, &UAbilitySystemComponent_RemoveActiveGameplayEffectBySourceEffect_Params); -} - -void UAbilitySystemComponent::ConsumeAllReplicatedData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey* AbilityOriginalPredictionKey) -{ - // static auto AbilityTargetDataMapOffset = ActivatableAbilitiesOffset + FGameplayAbilitySpecContainerSize ? - - return; -} - -void UAbilitySystemComponent::InternalServerTryActivateAbilityHook(UAbilitySystemComponent* AbilitySystemComponent, FGameplayAbilitySpecHandle Handle, bool InputPressed, const FPredictionKey* PredictionKey, const FGameplayEventData* TriggerEventData) // https://github.com/EpicGames/UnrealEngine/blob/4.23/Engine/Plugins/Runtime/GameplayAbilities/Source/GameplayAbilities/Private/AbilitySystemComponent_Abilities.cpp#L1445 -{ - using UGameplayAbility = UObject; - - auto Spec = AbilitySystemComponent->FindAbilitySpecFromHandle(Handle); - - static auto PredictionKeyStruct = FindObject(L"/Script/GameplayAbilities.PredictionKey"); - static auto PredictionKeySize = PredictionKeyStruct->GetPropertiesSize(); - static auto CurrentOffset = FindOffsetStruct("/Script/GameplayAbilities.PredictionKey", "Current"); - - if (!Spec) - { - LOG_INFO(LogAbilities, "InternalServerTryActivateAbility. Rejecting ClientActivation of ability with invalid SpecHandle!"); - AbilitySystemComponent->ClientActivateAbilityFailed(Handle, *(int16_t*)(__int64(PredictionKey) + CurrentOffset)); - return; - } - - AbilitySystemComponent->ConsumeAllReplicatedData(Handle, (FPredictionKey*)PredictionKey); - - /* const */ UGameplayAbility * AbilityToActivate = Spec->GetAbility(); - - if (!AbilityToActivate) - { - LOG_ERROR(LogAbilities, "InternalServerTryActiveAbility. Rejecting ClientActivation of unconfigured spec ability!"); - AbilitySystemComponent->ClientActivateAbilityFailed(Handle, *(int16_t*)(__int64(PredictionKey) + CurrentOffset)); - return; - } - - static auto InputPressedOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "InputPressed"); - - UGameplayAbility* InstancedAbility = nullptr; - SetBitfield((PlaceholderBitfield*)(__int64(Spec) + InputPressedOffset), 1, true); // InputPressed = true - - bool res = false; - - if (PredictionKeySize == 0x10) - res = UAbilitySystemComponent::InternalTryActivateAbilityOriginal(AbilitySystemComponent, Handle, *(PadHex10*)PredictionKey, &InstancedAbility, nullptr, TriggerEventData); - else if (PredictionKeySize == 0x18) - res = UAbilitySystemComponent::InternalTryActivateAbilityOriginal2(AbilitySystemComponent, Handle, *(PadHex18*)PredictionKey, &InstancedAbility, nullptr, TriggerEventData); - else - LOG_ERROR(LogAbilities, "Prediction key size does not match with any of them!"); - - if (!res) - { - LOG_INFO(LogAbilities, "InternalServerTryActivateAbility. Rejecting ClientActivation of {}. InternalTryActivateAbility failed: ", AbilityToActivate->GetName()); - - AbilitySystemComponent->ClientActivateAbilityFailed(Handle, *(int16_t*)(__int64(PredictionKey) + CurrentOffset)); - SetBitfield((PlaceholderBitfield*)(__int64(Spec) + InputPressedOffset), 1, false); // InputPressed = false - - AbilitySystemComponent->GetActivatableAbilities()->MarkItemDirty(Spec); - } - else - { - // LOG_INFO(LogAbilities, "InternalServerTryActivateAbility. Activated {}", AbilityToActivate->GetName()); - } -} - -FGameplayAbilitySpecHandle UAbilitySystemComponent::GiveAbilityEasy(UClass* AbilityClass, UObject* SourceObject, bool bDoNotRegive) -{ - if (!AbilityClass) - { - LOG_WARN(LogAbilities, "Invalid AbilityClass passed into GiveAbilityEasy!"); - return FGameplayAbilitySpecHandle(); - } - - // LOG_INFO(LogDev, "Making spec!"); - - auto DefaultAbility = AbilityClass->CreateDefaultObject(); - - if (!DefaultAbility) - return FGameplayAbilitySpecHandle(); - - if (bDoNotRegive && HasAbility(DefaultAbility)) - return FGameplayAbilitySpecHandle(); - - auto NewSpec = MakeNewSpec((UClass*)DefaultAbility, SourceObject, true); - - // LOG_INFO(LogDev, "Made spec!"); - - FGameplayAbilitySpecHandle Handle; - - GiveAbilityOriginal(this, &Handle, __int64(NewSpec)); - - return Handle; -} - -FGameplayAbilitySpec* UAbilitySystemComponent::FindAbilitySpecFromHandle(FGameplayAbilitySpecHandle Handle) -{ - FGameplayAbilitySpec* SpecToReturn = nullptr; - - auto compareHandles = [&Handle, &SpecToReturn](FGameplayAbilitySpec* Spec) { - auto& CurrentHandle = Spec->GetHandle(); - - if (CurrentHandle.Handle == Handle.Handle) - { - SpecToReturn = Spec; - return; - } - }; - - LoopSpecs(this, compareHandles); - - return SpecToReturn; -} - -void UAbilitySystemComponent::RemoveActiveGameplayEffectBySourceEffect(UClass* GameplayEffect, UAbilitySystemComponent* InstigatorAbilitySystemComponent, int StacksToRemove) -{ - static auto RemoveActiveGameplayEffectBySourceEffectFn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.RemoveActiveGameplayEffectBySourceEffect"); - - struct - { - UClass* GameplayEffect; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UAbilitySystemComponent* InstigatorAbilitySystemComponent; // (Parm, ZeroConstructor, InstancedReference, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int StacksToRemove; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UAbilitySystemComponent_RemoveActiveGameplayEffectBySourceEffect_Params{GameplayEffect, InstigatorAbilitySystemComponent, StacksToRemove}; - - this->ProcessEvent(RemoveActiveGameplayEffectBySourceEffectFn, &UAbilitySystemComponent_RemoveActiveGameplayEffectBySourceEffect_Params); -} - -void UAbilitySystemComponent::ClearAbility(const FGameplayAbilitySpecHandle& Handle) -{ - if (!Addresses::ClearAbility) - { - LOG_INFO(LogDev, "Invalid clear ability!"); - return; - } - - static void (*ClearAbilityOriginal)(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAbilitySpecHandle& Handle) = decltype(ClearAbilityOriginal)(Addresses::ClearAbility); - ClearAbilityOriginal(this, Handle); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Actor.cpp b/dependencies/reboot/Project Reboot 3.0/Actor.cpp deleted file mode 100644 index 105e8c9..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Actor.cpp +++ /dev/null @@ -1,314 +0,0 @@ -#include "Actor.h" - -#include "Transform.h" - -#include "reboot.h" -#include "GameplayStatics.h" - -bool AActor::HasAuthority() -{ - static auto RoleOffset = GetOffset("Role"); - return Get(RoleOffset) == 3; -} - -bool AActor::IsTearOff() -{ - static auto bTearOffOffset = GetOffset("bTearOff"); - static auto bTearOffFieldMask = GetFieldMask(GetProperty("bTearOff")); - return ReadBitfieldValue(bTearOffOffset, bTearOffFieldMask); -} - -/* FORCEINLINE */ ENetDormancy& AActor::GetNetDormancy() -{ - static auto NetDormancyOffset = GetOffset("NetDormancy"); - return Get(NetDormancyOffset); -} - -int32& AActor::GetNetTag() -{ - static auto NetTagOffset = GetOffset("NetTag"); - return Get(NetTagOffset); -} - -FTransform AActor::GetTransform() -{ - FTransform Ret; - static auto fn = FindObject(L"/Script/Engine.Actor.GetTransform"); - this->ProcessEvent(fn, &Ret); - return Ret; -} - -/* - -UWorld* AActor::GetWorld() -{ - return GetWorld(); // for real -} - -*/ - -void AActor::SetNetDormancy(ENetDormancy Dormancy) -{ - static auto SetNetDormancyFn = FindObject(L"/Script/Engine.Actor.SetNetDormancy"); - this->ProcessEvent(SetNetDormancyFn, &Dormancy); -} - -AActor* AActor::GetOwner() -{ - static auto GetOwnerFunction = FindObject(L"/Script/Engine.Actor.GetOwner"); - - AActor* Owner = nullptr; - this->ProcessEvent(GetOwnerFunction, &Owner); - - return Owner; -} - -void AActor::K2_DestroyActor() -{ - static auto DestroyActorFn = FindObject("/Script/Engine.Actor.K2_DestroyActor"); - - this->ProcessEvent(DestroyActorFn); -} - -UActorComponent* AActor::GetComponentByClass(class UClass* ComponentClass) -{ - static auto fn = FindObject("/Script/Engine.Actor.GetComponentByClass"); - struct - { - class UClass* ComponentClass; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UActorComponent* ReturnValue; // (ExportObject, Parm, OutParm, ZeroConstructor, ReturnParm, InstancedReference, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AActor_GetComponentByClass_Params{ComponentClass}; - - this->ProcessEvent(fn, &AActor_GetComponentByClass_Params); - - return AActor_GetComponentByClass_Params.ReturnValue; -} - -float AActor::GetDistanceTo(AActor* OtherActor) -{ - static auto fn = FindObject("/Script/Engine.Actor.GetDistanceTo"); - - struct { AActor* OtherActor; float ReturnValue; } AActor_GetDistanceTo_Params{OtherActor}; - - this->ProcessEvent(fn, &AActor_GetDistanceTo_Params); - - return AActor_GetDistanceTo_Params.ReturnValue; -} - -FVector AActor::GetActorScale3D() -{ - static auto GetActorScale3DFn = FindObject("/Script/Engine.Actor.GetActorScale3D"); - - FVector Scale3D; - this->ProcessEvent(GetActorScale3DFn, &Scale3D); - - return Scale3D; -} - -FVector AActor::GetActorLocation() -{ - static auto K2_GetActorLocationFn = FindObject("/Script/Engine.Actor.K2_GetActorLocation"); - FVector ret; - this->ProcessEvent(K2_GetActorLocationFn, &ret); - - return ret; -} - -FVector AActor::GetActorForwardVector() -{ - static auto GetActorForwardVectorFn = FindObject("/Script/Engine.Actor.GetActorForwardVector"); - FVector ret; - this->ProcessEvent(GetActorForwardVectorFn, &ret); - - return ret; -} - -FVector AActor::GetActorRightVector() -{ - static auto GetActorRightVectorFn = FindObject("/Script/Engine.Actor.GetActorRightVector"); - FVector ret; - this->ProcessEvent(GetActorRightVectorFn, &ret); - - return ret; -} - -FVector AActor::GetActorUpVector() -{ - static auto GetActorUpVectorFn = FindObject("/Script/Engine.Actor.GetActorUpVector"); - FVector ret; - this->ProcessEvent(GetActorUpVectorFn, &ret); - - return ret; -} - -FRotator AActor::GetActorRotation() -{ - static auto K2_GetActorRotationFn = FindObject(L"/Script/Engine.Actor.K2_GetActorRotation"); - FRotator ret; - this->ProcessEvent(K2_GetActorRotationFn, &ret); - - return ret; -} - -void AActor::FlushNetDormancy() -{ - static auto fn = FindObject(L"/Script/Engine.Actor.FlushNetDormancy"); - this->ProcessEvent(fn); -} - -bool AActor::TeleportTo(const FVector& DestLocation, const FRotator& DestRotation) -{ - static auto fn = FindObject(L"/Script/Engine.Actor.K2_TeleportTo"); - struct - { - struct FVector DestLocation; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - struct FRotator DestRotation; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AActor_K2_TeleportTo_Params{DestLocation, DestRotation}; - this->ProcessEvent(fn, &AActor_K2_TeleportTo_Params); - return AActor_K2_TeleportTo_Params.ReturnValue; -} - -bool AActor::IsActorBeingDestroyed() -{ - static auto bActorIsBeingDestroyedOffset = GetOffset("bActorIsBeingDestroyed"); - static auto bActorIsBeingDestroyedFieldMask = GetFieldMask(GetProperty("bActorIsBeingDestroyed")); - return ReadBitfieldValue(bActorIsBeingDestroyedOffset, bActorIsBeingDestroyedFieldMask); -} - -bool AActor::IsNetStartup() -{ - static auto bNetStartupOffset = GetOffset("bNetStartup"); - static auto bNetStartupFieldMask = GetFieldMask(GetProperty("bNetStartup")); - return ReadBitfieldValue(bNetStartupOffset, bNetStartupFieldMask); -} - -void AActor::SetOwner(AActor* Owner) -{ - static auto SetOwnerFn = FindObject(L"/Script/Engine.Actor.SetOwner"); - this->ProcessEvent(SetOwnerFn, &Owner); -} - -void AActor::ForceNetUpdate() -{ - static auto ForceNetUpdateFn = FindObject(L"/Script/Engine.Actor.ForceNetUpdate"); - this->ProcessEvent(ForceNetUpdateFn); -} - -bool AActor::IsNetStartupActor() -{ - return IsNetStartup(); // The implementation on this function depends on the version. -} - -bool AActor::IsPendingKillPending() -{ - return IsActorBeingDestroyed() || !IsValidChecked(this); -} - -float& AActor::GetNetUpdateFrequency() -{ - static auto NetUpdateFrequencyOffset = GetOffset("NetUpdateFrequency"); - return Get(NetUpdateFrequencyOffset); -} - -float& AActor::GetMinNetUpdateFrequency() -{ - static auto MinNetUpdateFrequencyOffset = GetOffset("MinNetUpdateFrequency"); - return Get(MinNetUpdateFrequencyOffset); -} - -const AActor* AActor::GetNetOwner() const -{ - static int GetNetOwnerOffset = 0x448; // 1.11 - const AActor* (*GetNetOwnerOriginal)(const AActor*) = decltype(GetNetOwnerOriginal)(this->VFTable[GetNetOwnerOffset / 8]); - return GetNetOwnerOriginal(this); -} - -void AActor::GetActorEyesViewPoint(FVector* OutLocation, FRotator* OutRotation) const -{ - static auto GetActorEyesViewPointFn = FindObject(L"/Script/Engine.Actor.GetActorEyesViewPoint"); - struct - { - FVector OutLocation; // (Parm, OutParm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FRotator OutRotation; // (Parm, OutParm, ZeroConstructor, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - } AActor_GetActorEyesViewPoint_Params{}; - this->ProcessEvent(GetActorEyesViewPointFn, &AActor_GetActorEyesViewPoint_Params); - - *OutLocation = AActor_GetActorEyesViewPoint_Params.OutLocation; - *OutRotation = AActor_GetActorEyesViewPoint_Params.OutRotation; -} - -AActor* AActor::GetClosestActor(UClass* ActorClass, float DistMax, std::function AdditionalCheck) -{ - float TargetDist = FLT_MAX; - AActor* TargetActor = nullptr; - - TArray AllActors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ActorClass); - auto ActorLocation = GetActorLocation(); - - for (int i = 0; i < AllActors.Num(); ++i) - { - auto Actor = AllActors.at(i); - - if (!Actor || Actor == this) - continue; - - if (!AdditionalCheck(Actor)) - continue; - - auto CurrentActorLocation = Actor->GetActorLocation(); - - int Dist = float(sqrtf(powf(CurrentActorLocation.X - ActorLocation.X, 2.0) + powf(CurrentActorLocation.Y - ActorLocation.Y, 2.0) + powf(CurrentActorLocation.Z - ActorLocation.Z, 2.0))) / 100.f; - - if (Dist <= DistMax && Dist < TargetDist) - { - TargetDist = Dist; - TargetActor = Actor; - } - } - - AllActors.Free(); - - return TargetActor; -} - -bool AActor::IsAlwaysRelevant() -{ - static auto bAlwaysRelevantOffset = GetOffset("bAlwaysRelevant"); - static auto bAlwaysRelevantFieldMask = GetFieldMask(GetProperty("bAlwaysRelevant")); - return ReadBitfieldValue(bAlwaysRelevantOffset, bAlwaysRelevantFieldMask); -} - -bool AActor::UsesOwnerRelevancy() -{ - static auto bNetUseOwnerRelevancyOffset = GetOffset("bNetUseOwnerRelevancy"); - static auto bNetUseOwnerRelevancyFieldMask = GetFieldMask(GetProperty("bNetUseOwnerRelevancy")); - return ReadBitfieldValue(bNetUseOwnerRelevancyOffset, bNetUseOwnerRelevancyFieldMask); -} - -bool AActor::IsOnlyRelevantToOwner() -{ - static auto bOnlyRelevantToOwnerOffset = GetOffset("bOnlyRelevantToOwner"); - static auto bOnlyRelevantToOwnerFieldMask = GetFieldMask(GetProperty("bOnlyRelevantToOwner")); - return ReadBitfieldValue(bOnlyRelevantToOwnerOffset, bOnlyRelevantToOwnerFieldMask); -} - -bool AActor::CanBeDamaged() -{ - static auto bCanBeDamagedOffset = GetOffset("bCanBeDamaged"); - static auto bCanBeDamagedFieldMask = GetFieldMask(GetProperty("bCanBeDamaged")); - return ReadBitfieldValue(bCanBeDamagedOffset, bCanBeDamagedFieldMask); -} - -void AActor::SetCanBeDamaged(bool NewValue) -{ - static auto bCanBeDamagedOffset = GetOffset("bCanBeDamaged"); - static auto bCanBeDamagedFieldMask = GetFieldMask(GetProperty("bCanBeDamaged")); - SetBitfieldValue(bCanBeDamagedOffset, bCanBeDamagedFieldMask, NewValue); -} - -UClass* AActor::StaticClass() -{ - static auto Class = FindObject(L"/Script/Engine.Actor"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Actor.h b/dependencies/reboot/Project Reboot 3.0/Actor.h deleted file mode 100644 index 2c48346..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Actor.h +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once - -#include "Object.h" -#include "anticheat.h" - -enum class ENetDormancy : uint8_t -{ - DORM_Never = 0, - DORM_Awake = 1, - DORM_DormantAll = 2, - DORM_DormantPartial = 3, - DORM_Initial = 4, - DORN_MAX = 5, - ENetDormancy_MAX = 6 -}; - -class AActor : public UObject -{ -public: - struct FTransform GetTransform(); - - // class UWorld* GetWorld(); - bool HasAuthority(); - bool IsTearOff(); - /* FORCEINLINE */ ENetDormancy& GetNetDormancy(); - int32& GetNetTag(); - void SetNetDormancy(ENetDormancy Dormancy); - AActor* GetOwner(); - struct FVector GetActorScale3D(); - struct FVector GetActorLocation(); - struct FVector GetActorForwardVector(); - struct FVector GetActorRightVector(); - struct FVector GetActorUpVector(); - void K2_DestroyActor(); - class UActorComponent* GetComponentByClass(class UClass* ComponentClass); - float GetDistanceTo(AActor* OtherActor); - struct FRotator GetActorRotation(); - void FlushNetDormancy(); - bool TeleportTo(const FVector& DestLocation, const FRotator& DestRotation); - bool IsActorBeingDestroyed(); - bool IsNetStartup(); - bool IsAlwaysRelevant(); - bool UsesOwnerRelevancy(); - bool IsOnlyRelevantToOwner(); - bool CanBeDamaged(); - void SetCanBeDamaged(bool NewValue); - void SetOwner(AActor* Owner); - void ForceNetUpdate(); - bool IsNetStartupActor(); - bool IsPendingKillPending(); - float& GetNetUpdateFrequency(); - float& GetMinNetUpdateFrequency(); - const AActor* GetNetOwner() const; - void GetActorEyesViewPoint(FVector* OutLocation, FRotator* OutRotation) const; - AActor* GetClosestActor(UClass* ActorClass, float DistMax, std::function AdditionalCheck = [&](AActor*) { return true; }); - - bool IsRelevancyOwnerFor(const AActor* ReplicatedActor, const AActor* ActorOwner, const AActor* ConnectionActor) const - { - // we should call virtual function but eh - // return (ActorOwner == this); - - static auto IsRelevancyOwnerForOffset = 0x428; - bool (*IsRelevancyOwnerForOriginal)(const AActor* Actor, const AActor * ReplicatedActor, const AActor * ActorOwner, const AActor * ConnectionActor) = - decltype(IsRelevancyOwnerForOriginal)(this->VFTable[IsRelevancyOwnerForOffset / 8]); - - return IsRelevancyOwnerForOriginal(this, ReplicatedActor, ActorOwner, ConnectionActor); - } - - static class UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ActorChannel.h b/dependencies/reboot/Project Reboot 3.0/ActorChannel.h deleted file mode 100644 index 6603d78..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ActorChannel.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "Channel.h" -#include "NetworkGuid.h" - -class UActorChannel : public UChannel -{ -public: - double& GetLastUpdateTime() - { - static auto LastUpdateTimeOffset = GetOffset("Actor") + 8 + 4 + 4 + 8; // checked on 4.19 - return Get(LastUpdateTimeOffset); - } - - double& GetRelevantTime() - { - static auto RelevantTimeOffset = GetOffset("Actor") + 8 + 4 + 4; // checked on 4.19 - return Get(RelevantTimeOffset); - } - - AActor*& GetActor() - { - static auto ActorOffset = GetOffset("Actor"); - return Get(ActorOffset); - } - - void Close() - { - static void (*ActorChannelClose)(UActorChannel*) = decltype(ActorChannelClose)(Addresses::ActorChannelClose); - ActorChannelClose(this); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ActorComponent.cpp b/dependencies/reboot/Project Reboot 3.0/ActorComponent.cpp deleted file mode 100644 index 0412513..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ActorComponent.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "ActorComponent.h" - -#include "reboot.h" - -AActor* UActorComponent::GetOwner() -{ - auto GetOwnerFn = FindObject(L"/Script/Engine.ActorComponent.GetOwner"); - AActor* Owner; - this->ProcessEvent(GetOwnerFn, &Owner); - return Owner; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ActorComponent.h b/dependencies/reboot/Project Reboot 3.0/ActorComponent.h deleted file mode 100644 index a8cb966..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ActorComponent.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "Actor.h" - -class UActorComponent : public UObject -{ -public: - AActor* GetOwner(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AndOrNot.h b/dependencies/reboot/Project Reboot 3.0/AndOrNot.h deleted file mode 100644 index 5ae432f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AndOrNot.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved. - -#pragma once - -#include "inc.h" - -/** - * Does a boolean AND of the ::Value static members of each type, but short-circuits if any Type::Value == false. - */ -template -struct TAnd; - -template -struct TAndValue -{ - enum { Value = TAnd::Value }; -}; - -template -struct TAndValue -{ - enum { Value = false }; -}; - -template -struct TAnd : TAndValue -{ -}; - -template <> -struct TAnd<> -{ - enum { Value = true }; -}; - -/** - * Does a boolean OR of the ::Value static members of each type, but short-circuits if any Type::Value == true. - */ -template -struct TOr; - -template -struct TOrValue -{ - enum { Value = TOr::Value }; -}; - -template -struct TOrValue -{ - enum { Value = true }; -}; - -template -struct TOr : TOrValue -{ -}; - -template <> -struct TOr<> -{ - enum { Value = false }; -}; - -/** - * Does a boolean NOT of the ::Value static members of the type. - */ -template -struct TNot -{ - enum { Value = !Type::Value }; -}; - diff --git a/dependencies/reboot/Project Reboot 3.0/Array.h b/dependencies/reboot/Project Reboot 3.0/Array.h deleted file mode 100644 index 92cf406..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Array.h +++ /dev/null @@ -1,415 +0,0 @@ -#pragma once - -#include "inc.h" -#include "addresses.h" - -#include "MemoryOps.h" -#include "ContainerAllocationPolicies.h" - -struct FMemory -{ - static inline void* (*Realloc)(void* Original, SIZE_T Count, uint32_t Alignment /* = DEFAULT_ALIGNMENT */); -}; - -template -static T* AllocUnreal(size_t Size) -{ - return (T*)FMemory::Realloc(0, Size, 0); -} - -template //, typename InAllocatorType> -class TArray -{ - // protected: -public: - friend class FString; - - using ElementAllocatorType = InElementType*; - using SizeType = int32; - - ElementAllocatorType Data = nullptr; // AllocatorInstance; - SizeType ArrayNum; - SizeType ArrayMax; - -public: - - inline InElementType& At(int i, size_t Size = sizeof(InElementType)) const { return *(InElementType*)(__int64(Data) + (static_cast(Size) * i)); } - inline InElementType& at(int i, size_t Size = sizeof(InElementType)) const { return *(InElementType*)(__int64(Data) + (static_cast(Size) * i)); } - inline InElementType* AtPtr(int i, size_t Size = sizeof(InElementType)) const { return (InElementType*)(__int64(Data) + (static_cast(Size) * i)); } - - bool IsValidIndex(int i) { return i > 0 && i < ArrayNum; } - - ElementAllocatorType& GetData() const { return Data; } - ElementAllocatorType& GetData() { return Data; } - - void Reserve(int Number, size_t Size = sizeof(InElementType)) - { - // LOG_INFO(LogDev, "ArrayNum {}", ArrayNum); - // Data = (InElementType*)FMemory::Realloc(Data, (ArrayMax = ArrayNum + Number) * Size, 0); - Data = /* (ArrayMax - ArrayNum) >= ArrayNum ? Data : */ (InElementType*)FMemory::Realloc(Data, (ArrayMax = Number + ArrayNum) * Size, 0); - } - - int CalculateSlackReserve(SizeType NumElements, SIZE_T NumBytesPerElement) const - { - return DefaultCalculateSlackReserve(NumElements, NumBytesPerElement, false); - } - - void ResizeArray(SizeType NewNum, SIZE_T NumBytesPerElement) - { - const SizeType CurrentMax = ArrayMax; - SizeType v3 = NewNum; - if (NewNum) - { - /* SizeType v6 = (unsigned __int64)FMemory::QuantizeSize(4 * NewNum, 0) >> 2; - // if (v3 > (int)v6) - // LODWORD(v6) = 0x7FFFFFFF; - v3 = v6; */ - } - - if (v3 != CurrentMax && (Data || v3)) - Data = (InElementType*)FMemory::Realloc(Data, NumBytesPerElement * v3, 0); - - ArrayNum = v3; // ? - ArrayMax = v3; - } - - void RefitArray(SIZE_T NumBytesPerElement = sizeof(InElementType)) - { - auto newNum = ArrayNum; - - // newNum = FMemory::QuantizeSize(NumBytesPerElement * newNum, 0) >> 4 - - ArrayMax = newNum; - - if (Data || ArrayNum) - { - Data = false ? (InElementType*)VirtualAlloc(0, newNum * NumBytesPerElement, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE) : - (InElementType*)FMemory::Realloc(Data, newNum * NumBytesPerElement, 0); - } - } - - int AddUninitialized2(SIZE_T NumBytesPerElement = sizeof(InElementType)) - { - const int OldArrayNum = ArrayNum; - - ArrayNum = OldArrayNum + 1; - - if (OldArrayNum + 1 > ArrayMax) - { - RefitArray(NumBytesPerElement); - // ResizeArray(ArrayNum, NumBytesPerElement); - } - - return OldArrayNum; - } - - void CopyFromArray(TArray& OtherArray, SIZE_T NumBytesPerElement = sizeof(InElementType)) - { - if (!OtherArray.ArrayNum && !ArrayMax) // so if the new array has nothing, and we currently have nothing allocated, then we can just return - { - ArrayMax = 0; - return; - } - - ResizeArray(OtherArray.ArrayNum, NumBytesPerElement); - memcpy(this->Data, OtherArray.Data, NumBytesPerElement * OtherArray.ArrayNum); - } - - /* - FORCENOINLINE void ResizeForCopy(SizeType NewMax, SizeType PrevMax, int ElementSize = sizeof(InElementType)) - { - if (NewMax) - { - NewMax = CalculateSlackReserve(NewMax, ElementSize); - } - if (NewMax != PrevMax) - { - int ReserveCount = NewMax - PrevMax; // IDK TODO Milxnor - Reserve(ReserveCount, ElementSize); - // AllocatorInstance.ResizeAllocation(0, NewMax, ElementSize); - } - - ArrayMax = NewMax; - } - - template - void CopyToEmpty(const OtherElementType* OtherData, OtherSizeType OtherNum, SizeType PrevMax, SizeType ExtraSlack, int ElementSize = sizeof(InElementType)) - { - SizeType NewNum = (SizeType)OtherNum; - // checkf((OtherSizeType)NewNum == OtherNum, TEXT("Invalid number of elements to add to this array type: %llu"), (unsigned long long)NewNum); - - // checkSlow(ExtraSlack >= 0); - ArrayNum = NewNum; - - if (OtherNum || ExtraSlack || PrevMax) - { - ResizeForCopy(NewNum + ExtraSlack, PrevMax); - ConstructItems(GetData(), OtherData, OtherNum); - } - else - { - ArrayMax = 0; // AllocatorInstance.GetInitialCapacity(); - } - } - - FORCEINLINE TArray(const TArray& Other) - { - CopyToEmpty(Other.Data, Other.Num(), 0, 0); - } - */ - - TArray() : Data(nullptr), ArrayNum(0), ArrayMax(0) {} - - inline int Num() const { return ArrayNum; } - inline int size() const { return ArrayNum; } - - /* FORCENOINLINE void ResizeTo(int32 NewMax) - { - if (NewMax) - { - NewMax = AllocatorInstance.CalculateSlackReserve(NewMax, sizeof(ElementType)); - } - if (NewMax != ArrayMax) - { - ArrayMax = NewMax; - AllocatorInstance.ResizeAllocation(ArrayNum, ArrayMax, sizeof(ElementType)); - } - } - - void Empty(int32 Slack = 0) - { - // DestructItems(GetData(), ArrayNum); - - // checkSlow(Slack >= 0); - ArrayNum = 0; - - if (ArrayMax != Slack) - { - ResizeTo(Slack); - } - } - - void Reset(int32 NewSize = 0) - { - // If we have space to hold the excepted size, then don't reallocate - if (NewSize <= ArrayMax) - { - // DestructItems(GetData(), ArrayNum); - ArrayNum = 0; - } - else - { - Empty(NewSize); - } - } */ - - void RemoveAtImpl(int32 Index, int32 Count, bool bAllowShrinking) - { - if (Count) - { - // CheckInvariants(); - // checkSlow((Count >= 0) & (Index >= 0) & (Index + Count <= ArrayNum)); - - // DestructItems(GetData() + Index, Count); // TODO milxnor - - // Skip memmove in the common case that there is nothing to move. - int32 NumToMove = ArrayNum - Index - Count; - if (NumToMove) - { - /* FMemory::Memmove - ( - (uint8*)AllocatorInstance.GetAllocation() + (Index) * sizeof(ElementType), - (uint8*)AllocatorInstance.GetAllocation() + (Index + Count) * sizeof(ElementType), - NumToMove * sizeof(ElementType) - ); */ - // memmove(Data + (Index) * sizeof(InElementType), Data + (Index + Count) * sizeof(InElementType), NumToMove * sizeof(InElementType)); // i think this wrong - } - ArrayNum -= Count; - - if (bAllowShrinking) - { - // ResizeShrink(); // TODO milxnor - } - } - } - - - FORCEINLINE SizeType CalculateSlackGrow(SizeType NumElements, SizeType NumAllocatedElements, SIZE_T NumBytesPerElement) const - { - return ArrayMax - NumElements; - } - - template - FORCEINLINE void RemoveAt(int32 Index, CountType Count, bool bAllowShrinking = true) - { - // static_assert(!TAreTypesEqual::Value, "TArray::RemoveAt: unexpected bool passed as the Count argument"); - RemoveAtImpl(Index, Count, bAllowShrinking); - } - - FORCENOINLINE void ResizeGrow(int32 OldNum, size_t Size = sizeof(InElementType)) - { - // LOG_INFO(LogMemory, "FMemory::Realloc: {}", __int64(FMemory::Realloc)); - - ArrayMax = ArrayNum; // CalculateSlackGrow(/* ArrayNum */ OldNum, ArrayMax, Size); - // AllocatorInstance.ResizeAllocation(OldNum, ArrayMax, sizeof(ElementType)); - // LOG_INFO(LogMemory, "ArrayMax: {} Size: {}", ArrayMax, Size); - Data = (InElementType*)FMemory::Realloc(Data, ArrayNum * Size, 0); - } - - FORCEINLINE int32 AddUninitialized(int32 Count = 1, size_t Size = sizeof(InElementType)) - { - // CheckInvariants(); - - if (Count < 0) - { - return 0; - } - - const int32 OldNum = ArrayNum; - if ((ArrayNum += Count) > ArrayMax) - { - ResizeGrow(OldNum, Size); - } - return OldNum; - } - - FORCEINLINE int32 Emplace(const InElementType& New, size_t Size = sizeof(InElementType)) - { - const int32 Index = AddUninitialized(1, Size); // resizes array - memcpy_s((InElementType*)(__int64(Data) + (Index * Size)), Size, (void*)&New, Size); - // new(GetData() + Index) ElementType(Forward(Args)...); - return Index; - } - - /* int Add(const InElementType& New, int Size = sizeof(InElementType)) - { - return Emplace(New, Size); - } */ - - int AddPtr(InElementType* New, size_t Size = sizeof(InElementType)) - { - // LOG_INFO(LogDev, "ArrayMax: {}", ArrayMax); - - if ((ArrayNum + 1) > ArrayMax) - { - Reserve(1, Size); - } - - if (Data) - { - memcpy_s((InElementType*)(__int64(Data) + (ArrayNum * Size)), Size, (void*)New, Size); - ++ArrayNum; - return ArrayNum; // - 1; - } - - return -1; - } - - int Add(const InElementType& New, size_t Size = sizeof(InElementType)) - { - // LOG_INFO(LogDev, "ArrayMax: {}", ArrayMax); - - if ((ArrayNum + 1) > ArrayMax) - { - Reserve(1, Size); - } - - if (Data) - { - memcpy_s((InElementType*)(__int64(Data) + (ArrayNum * Size)), Size, (void*)&New, Size); - ++ArrayNum; - return ArrayNum; // - 1; - } - - return -1; - } - - void FreeGood(SizeType Size = sizeof(InElementType)) - { - if (Data) - { - if (true) - { - static void (*FreeOriginal)(void* Original) = decltype(FreeOriginal)(Addresses::Free); - - if (FreeOriginal) - FreeOriginal(Data); - } - else - { - VirtualFree(Data, 0, MEM_RELEASE); - } - } - - Data = nullptr; - ArrayNum = 0; - ArrayMax = 0; - } - - void FreeReal(SizeType Size = sizeof(InElementType)) - { - if (!IsBadReadPtr(Data, 8) && ArrayNum > 0 && sizeof(InElementType) > 0) - { - for (int i = 0; i < ArrayNum; ++i) - { - auto current = AtPtr(i, Size); - - RtlSecureZeroMemory(current, Size); - } - - // VirtualFree(Data, _msize(Data), MEM_RELEASE); - // VirtualFree(Data, sizeof(InElementType) * ArrayNum, MEM_RELEASE); // ik this does nothing - - /* static void (*FreeOriginal)(void*) = decltype(FreeOriginal)(Addresses::Free); - - if (FreeOriginal) - { - FreeOriginal(Data); - } - else */ - { - auto res = VirtualFree(Data, 0, MEM_RELEASE); - // auto res = VirtualFree(Data, sizeof(InElementType) * ArrayNum, MEM_RELEASE); - LOG_INFO(LogDev, "Free: {} aa: 0x{:x}", res, res ? 0 : GetLastError()); - } - } - - Data = nullptr; - ArrayNum = 0; - ArrayMax = 0; - } - - void Free() - { - if (Data && ArrayNum > 0 && sizeof(InElementType) > 0) - { - // VirtualFree(Data, _msize(Data), MEM_RELEASE); - VirtualFree(Data, sizeof(InElementType) * ArrayNum, MEM_RELEASE); // ik this does nothing - // VirtualFree(Data, 0, MEM_RELEASE); - } - - Data = nullptr; - ArrayNum = 0; - ArrayMax = 0; - } - - bool Remove(const int Index, size_t Size = sizeof(InElementType)) - { - // return false; - - if (Index < ArrayNum) - { - if (Index != ArrayNum - 1) - { - memcpy_s(&at(Index, Size), Size, &at(ArrayNum - 1, Size), Size); - // Data[Index] = Data[ArrayNum - 1]; - } - - --ArrayNum; - - return true; - } - - return false; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AssertionMacros.h b/dependencies/reboot/Project Reboot 3.0/AssertionMacros.h deleted file mode 100644 index 8cc728c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AssertionMacros.h +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include "log.h" -#include "inc.h" - -/* -#ifdef PROD -#define UE_DEBUG_BREAK() ((void)0) -#else -#define UE_DEBUG_BREAK() ((void)(FWindowsPlatformMisc::IsDebuggerPresent() && (__debugbreak(), 1))) -#endif - -#ifndef PROD -#define _DebugBreakAndPromptForRemote() \ - if (!FPlatformMisc::IsDebuggerPresent()) { FPlatformMisc::PromptForRemoteDebugging(false); } UE_DEBUG_BREAK(); -#else -#define _DebugBreakAndPromptForRemote() -#endif - -#define CA_ASSUME( Expr ) // Todo move to Misc/CoreMiscDefines.h - -namespace FDebug -{ - template - static void LogAssertFailedMessage(const char* Expr, const char* File, int32 Line, const FmtType& Fmt, Types... Args) - { - // static_assert(TIsArrayOrRefOfType::Value, "Formatting string must be a TCHAR array."); - // tatic_assert(TAnd...>::Value, "Invalid argument(s) passed to FDebug::LogAssertFailedMessage"); - - LOG_ERROR(LogDev, "Assert failed message {} {}", File, Line); - // LogAssertFailedMessageImpl(Expr, File, Line, Fmt, Args...); - } - - void __cdecl AssertFailed(const char* Expr, const char* File, int32 Line, const wchar_t* Format = TEXT(""), ...) - { - LOG_ERROR(LogDev, "Assert failed {} {}", File, Line); - - /* - if (GIsCriticalError) - { - return; - } - - // This is not perfect because another thread might crash and be handled before this assert - // but this static varible will report the crash as an assert. Given complexity of a thread - // aware solution, this should be good enough. If crash reports are obviously wrong we can - // look into fixing this. - bHasAsserted = true; - - TCHAR DescriptionString[4096]; - GET_VARARGS(DescriptionString, ARRAY_COUNT(DescriptionString), ARRAY_COUNT(DescriptionString) - 1, Format, Format); - - TCHAR ErrorString[MAX_SPRINTF]; - FCString::Sprintf(ErrorString, TEXT("%s"), ANSI_TO_TCHAR(Expr)); - GError->Logf(TEXT("Assertion failed: %s") FILE_LINE_DESC TEXT("\n%s\n"), ErrorString, ANSI_TO_TCHAR(File), Line, DescriptionString); - - } -} -*/ - -// #define check(expr) { if(UNLIKELY(!(expr))) { FDebug::LogAssertFailedMessage( #expr, __FILE__, __LINE__, TEXT("") ); _DebugBreakAndPromptForRemote(); FDebug::AssertFailed( #expr, __FILE__, __LINE__ ); CA_ASSUME(false); } } diff --git a/dependencies/reboot/Project Reboot 3.0/AssetPtr.h b/dependencies/reboot/Project Reboot 3.0/AssetPtr.h deleted file mode 100644 index f95e690..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AssetPtr.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "PersistentObjectPtr.h" -#include "StringAssetReference.h" - -#include "reboot.h" - -class FAssetPtr : public TPersistentObjectPtr -{ -public: -}; - -template -class TAssetPtr -{ -public: - FAssetPtr AssetPtr; - - T* Get() - { - if (!AssetPtr.ObjectID.AssetLongPathname.IsValid()) - return nullptr; - - return FindObject(AssetPtr.ObjectID.AssetLongPathname.ToString()); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AthenaBarrierFlag.h b/dependencies/reboot/Project Reboot 3.0/AthenaBarrierFlag.h deleted file mode 100644 index 66bf48a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AthenaBarrierFlag.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include "BuildingGameplayActor.h" -#include "AthenaBarrierObjective.h" - -struct FBarrierFlagDisplayData -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.BarrierFlagDisplayData"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - UStaticMesh* GetHeadMesh() - { - static auto HeadMeshOffset = FindOffsetStruct("/Script/FortniteGame.BarrierFlagDisplayData", "HeadMesh"); - return *(UStaticMesh**)(__int64(this) + HeadMeshOffset); - } - - FVector& GetMeshScale() - { - static auto MeshScaleOffset = FindOffsetStruct("/Script/FortniteGame.BarrierFlagDisplayData", "MeshScale"); - return *(FVector*)(__int64(this) + MeshScaleOffset); - } -}; - -class AAthenaBarrierFlag : public ABuildingGameplayActor -{ -public: - EBarrierFoodTeam& GetFoodTeam() - { - static auto FoodTeamOffset = GetOffset("FoodTeam"); - return Get(FoodTeamOffset); - } - - FBarrierFlagDisplayData* GetDisplayData(EBarrierFoodTeam FoodTeam) - { - static auto FoodDisplayDataOffset = GetOffset("FoodDisplayData"); - auto FoodDisplayData = Get(FoodDisplayDataOffset); // Array of size 2 - return &FoodDisplayData[(int)FoodTeam]; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AthenaBarrierObjective.h b/dependencies/reboot/Project Reboot 3.0/AthenaBarrierObjective.h deleted file mode 100644 index d20e4b7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AthenaBarrierObjective.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "BuildingGameplayActor.h" - -using UStaticMesh = UObject; -using UMaterialInterface = UObject; - -enum class EBarrierFoodTeam : uint8_t -{ - Burger = 0, - Tomato = 1, - MAX = 2 -}; - -struct FBarrierObjectiveDisplayData -{ - UStaticMesh* HeadMesh; // 0x0000(0x0008) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector MeshScale; // 0x0008(0x000C) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector MeshRelativeOffset; // 0x0014(0x000C) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - TArray MaterialsToSwap; // 0x0020(0x0010) (Edit, ZeroConstructor, NativeAccessSpecifierPublic) -}; - -class AAthenaBarrierObjective : public ABuildingGameplayActor -{ -public: - void SetHeadMesh(UStaticMesh* NewMesh, const FVector& NewScale, const FVector& NewOffset, const TArray& MaterialsToSwap) - { - static auto SetHeadMeshFn = FindObject("/Script/FortniteGame.AthenaBarrierObjective.SetHeadMesh"); - - struct - { - UStaticMesh* NewMesh; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector NewScale; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector NewOffset; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - TArray MaterialsToSwap; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, NativeAccessSpecifierPublic) - } AAthenaBarrierObjective_SetHeadMesh_Params{ NewMesh, NewScale, NewOffset, MaterialsToSwap }; - - this->ProcessEvent(SetHeadMeshFn, &AAthenaBarrierObjective_SetHeadMesh_Params); - } - - EBarrierFoodTeam& GetFoodTeam() - { - static auto FoodTeamOffset = GetOffset("FoodTeam"); - return Get(FoodTeamOffset); - } - - FBarrierObjectiveDisplayData* GetFoodDisplayData(EBarrierFoodTeam FoodTeam) - { - static auto FoodDisplayDataOffset = GetOffset("FoodDisplayData"); - auto FoodDisplayData = Get(FoodDisplayDataOffset); // Array size of 2 - return &FoodDisplayData[(int)FoodTeam]; - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.AthenaBarrierObjective"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AthenaBigBaseWall.h b/dependencies/reboot/Project Reboot 3.0/AthenaBigBaseWall.h deleted file mode 100644 index 3195e6b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AthenaBigBaseWall.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "BuildingGameplayActor.h" - -class AAthenaBigBaseWall : public ABuildingGameplayActor -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AthenaMarkerComponent.cpp b/dependencies/reboot/Project Reboot 3.0/AthenaMarkerComponent.cpp deleted file mode 100644 index 9a6c52d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AthenaMarkerComponent.cpp +++ /dev/null @@ -1,161 +0,0 @@ -#include "AthenaMarkerComponent.h" -#include "FortPlayerControllerAthena.h" -#include "Text.h" -#include "KismetTextLibrary.h" - -void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FFortClientMarkerRequest MarkerRequest) -{ - auto Owner = MarkerComponent->GetOwner(); - - AFortPlayerControllerAthena* PlayerController = Cast(Owner); - - if (!PlayerController) - return; - - AFortPlayerStateAthena* PlayerState = Cast(PlayerController->GetPlayerState()); - - if (!PlayerState) - return; - - auto MarkerRequestPtr = &MarkerRequest; - - bool useRealloc = false; - auto MarkerData = Alloc(FFortWorldMarkerData::GetStructSize(), useRealloc); - - static auto IconOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "Icon"); - static auto DisplayNameOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "DisplayName"); - static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition", false); - static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "bIncludeSquad", false); - static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset", false); - - FMarkerID MarkerID{}; - MarkerID.PlayerID = PlayerState->GetPlayerID(); - MarkerID.InstanceID = MarkerRequestPtr->GetInstanceID(); - - MarkerData->GetMarkerType() = MarkerRequestPtr->GetMarkerType(); - MarkerData->GetOwner() = PlayerState; - MarkerData->GetWorldNormal() = MarkerRequestPtr->GetWorldNormal(); - - if (WorldPositionOffset != -1) - MarkerData->GetWorldPosition() = MarkerRequestPtr->GetWorldPosition(); - if (WorldPositionOffset != -1) - MarkerData->GetWorldPositionOffset() = MarkerRequestPtr->GetWorldPositionOffset(); - if (bIncludeSquadOffset != -1) - MarkerData->DoesIncludeSquad() = MarkerRequestPtr->DoesIncludeSquad(); - - MarkerData->GetMarkerID() = MarkerID; - MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectIndex = -1; - MarkerData->GetMarkedActorClass().SoftObjectPtr.TagAtLastTest = 0; - MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0; - MarkerData->GetMarkedActor().SoftObjectPtr.WeakPtr.ObjectIndex = -1; - MarkerData->GetMarkedActor().SoftObjectPtr.TagAtLastTest = 0; - MarkerData->GetMarkedActor().SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0; - ((TSoftObjectPtr*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectIndex = -1; - ((TSoftObjectPtr*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.TagAtLastTest = 0; - ((TSoftObjectPtr*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0; - *(FText*)(__int64(MarkerData->GetCustomDisplayInfo()) + DisplayNameOffset) = UKismetTextLibrary::Conv_StringToText(L""); - - static auto PlayerTeamOffset = PlayerState->GetOffset("PlayerTeam"); - auto PlayerTeam = PlayerState->Get(PlayerTeamOffset); - - if (!PlayerTeam) - return; - - static auto TeamMembersOffset = PlayerTeam->GetOffset("TeamMembers"); - auto& TeamMembers = PlayerTeam->Get>(TeamMembersOffset); - - for (int i = 0; i < TeamMembers.Num(); ++i) - { - if (TeamMembers.at(i) == PlayerController) - continue; - - auto CurrentTeamMemberPC = Cast(TeamMembers.at(i)); - - if (!CurrentTeamMemberPC) - continue; - - auto CurrentTeamMemberMarkerComponent = CurrentTeamMemberPC->GetMarkerComponent();// (UAthenaMarkerComponent*)CurrentTeamMemberPC->GetComponentByClass(UAthenaMarkerComponent::StaticClass()); - - if (!CurrentTeamMemberMarkerComponent) - continue; - - static auto ClientAddMarkerFn = FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ClientAddMarker"); - - if (ClientAddMarkerFn) - { - CurrentTeamMemberMarkerComponent->ProcessEvent(ClientAddMarkerFn, MarkerData); - } - else - { - // We are assuming it is not the TArray and it is FFortWorldMarkerContainer - - static auto MarkerStreamOffset = CurrentTeamMemberMarkerComponent->GetOffset("MarkerStream"); - auto MarkerStream = CurrentTeamMemberMarkerComponent->GetPtr(MarkerStreamOffset); - - static auto MarkersOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerContainer", "Markers"); - - if (MarkersOffset != -1) - { - // We are assuming it is a FFastArraySerializerItem - ((FFastArraySerializerItem*)MarkerData)->MostRecentArrayReplicationKey = -1; - ((FFastArraySerializerItem*)MarkerData)->ReplicationID = -1; - ((FFastArraySerializerItem*)MarkerData)->ReplicationKey = -1; - - auto Markers = (TArray*)(__int64(MarkerStream) + MarkersOffset); - Markers->AddPtr(MarkerData, FFortWorldMarkerData::GetStructSize()); - MarkerStream->MarkArrayDirty(); - } - } - } -} - -void UAthenaMarkerComponent::ServerRemoveMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FMarkerID MarkerID, uint8_t CancelReason) -{ - auto Owner = MarkerComponent->GetOwner(); - - AFortPlayerControllerAthena* PlayerController = Cast(Owner); - - if (!PlayerController) - return; - - AFortPlayerStateAthena* PlayerState = Cast(PlayerController->GetPlayerState()); - - if (!PlayerState) - return; - - static auto PlayerTeamOffset = PlayerState->GetOffset("PlayerTeam"); - auto PlayerTeam = PlayerState->Get(PlayerTeamOffset); - - if (!PlayerTeam) - return; - - static auto TeamMembersOffset = PlayerTeam->GetOffset("TeamMembers"); - auto& TeamMembers = PlayerTeam->Get>(TeamMembersOffset); - - for (int i = 0; i < TeamMembers.Num(); ++i) - { - if (TeamMembers.at(i) == PlayerController) - continue; - - auto CurrentTeamMemberPC = Cast(TeamMembers.at(i)); - - if (!CurrentTeamMemberPC) - continue; - - auto CurrentTeamMemberMarkerComponent = CurrentTeamMemberPC->GetMarkerComponent(); - - if (!CurrentTeamMemberMarkerComponent) - continue; - - static auto ClientCancelMarkerFn = FindObject("/Script/FortniteGame.AthenaMarkerComponent.ClientCancelMarker"); - - if (ClientCancelMarkerFn) - { - CurrentTeamMemberMarkerComponent->ProcessEvent(ClientCancelMarkerFn, &MarkerID); - } - else - { - // UnmarkActorOnClient ? - } - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AthenaMarkerComponent.h b/dependencies/reboot/Project Reboot 3.0/AthenaMarkerComponent.h deleted file mode 100644 index 0cae453..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AthenaMarkerComponent.h +++ /dev/null @@ -1,141 +0,0 @@ -#pragma once - -#include "ActorComponent.h" -#include "Vector.h" -#include "SoftObjectPtr.h" -#include "FortPlayerState.h" - -struct FMarkerID { int PlayerID; int InstanceID; }; - -struct FFortClientMarkerRequest -{ - char pad[0x20]; // real idk - - int& GetInstanceID() - { - static auto InstanceIDOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "InstanceID", false) == -1 ? - FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "InstanceId") : FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "InstanceID"); - - return *(int*)(__int64(this) + InstanceIDOffset); - } - - bool& DoesIncludeSquad() - { - static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "bIncludeSquad"); - return *(bool*)(__int64(this) + bIncludeSquadOffset); - } - - bool& UsesHoveredMarkerDetail() - { - static auto bUseHoveredMarkerDetailOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "bUseHoveredMarkerDetail"); - return *(bool*)(__int64(this) + bUseHoveredMarkerDetailOffset); - } - - FVector& GetWorldPosition() - { - static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldPosition"); - return *(FVector*)(__int64(this) + WorldPositionOffset); - } - - uint8_t& GetMarkerType() - { - static auto MarkerTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "MarkerType"); - return *(uint8_t*)(__int64(this) + MarkerTypeOffset); - } - - FVector& GetWorldPositionOffset() - { - static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldPositionOffset"); - return *(FVector*)(__int64(this) + WorldPositionOffsetOffset); - } - - FVector& GetWorldNormal() - { - static auto WorldNormalOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "WorldNormal"); - return *(FVector*)(__int64(this) + WorldNormalOffset); - } -}; - -struct FFortWorldMarkerData -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.FortWorldMarkerData"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - FMarkerID& GetMarkerID() - { - static auto MarkerIDOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerID"); - return *(FMarkerID*)(__int64(this) + MarkerIDOffset); - } - - UObject*& GetMarkerInstance() - { - static auto MarkerInstanceOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerInstance"); - return *(UObject**)(__int64(this) + MarkerInstanceOffset); - } - - FVector& GetWorldPosition() - { - static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition"); - return *(FVector*)(__int64(this) + WorldPositionOffset); - } - - bool& DoesIncludeSquad() - { - static auto bIncludeSquadOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "bIncludeSquad"); - return *(bool*)(__int64(this) + bIncludeSquadOffset); - } - - FVector& GetWorldPositionOffset() - { - static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset"); - return *(FVector*)(__int64(this) + WorldPositionOffsetOffset); - } - - FVector& GetWorldNormal() - { - static auto WorldNormalOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldNormal"); - return *(FVector*)(__int64(this) + WorldNormalOffset); - } - - TSoftObjectPtr& GetMarkedActor() - { - static auto MarkedActorOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkedActor"); - return *(TSoftObjectPtr*)(__int64(this) + MarkedActorOffset); - } - - uint8_t& GetMarkerType() - { - static auto MarkerTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkerType"); - return *(uint8_t*)(__int64(this) + MarkerTypeOffset); - } - - TSoftObjectPtr& GetMarkedActorClass() - { - static auto MarkedActorClassOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "MarkedActorClass"); - return *(TSoftObjectPtr*)(__int64(this) + MarkedActorClassOffset); - } - - AFortPlayerState*& GetOwner() - { - static auto OwnerOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "Owner"); - return *(AFortPlayerState**)(__int64(this) + OwnerOffset); - } - - void* GetCustomDisplayInfo() - { - static auto CustomDisplayInfoOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "CustomDisplayInfo"); - return (void*)(__int64(this) + CustomDisplayInfoOffset); - } -}; - -class UAthenaMarkerComponent : public UActorComponent -{ -public: - static void ServerAddMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FFortClientMarkerRequest MarkerRequest); - static void ServerRemoveMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FMarkerID MarkerID, uint8_t CancelReason); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AthenaPlayerMatchReport.h b/dependencies/reboot/Project Reboot 3.0/AthenaPlayerMatchReport.h deleted file mode 100644 index 037ae10..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AthenaPlayerMatchReport.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include "reboot.h" - -struct FAthenaMatchTeamStats -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.AthenaMatchTeamStats"); - return Struct; - } - - static auto GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - int Place; // 0x0000(0x0004) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int TotalPlayers; // 0x0004(0x0004) (Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - - int& GetPlace() - { - return Place; - } - - int& GetTotalPlayers() - { - return TotalPlayers; - } -}; - -class UAthenaPlayerMatchReport : public UObject -{ -public: - bool& HasTeamStats() - { - static auto bHasTeamStatsOffset = GetOffset("bHasTeamStats"); - return Get(bHasTeamStatsOffset); - } - - bool& HasMatchStats() - { - static auto bHasMatchStatsOffset = GetOffset("bHasMatchStats"); - return Get(bHasMatchStatsOffset); - } - - FAthenaMatchTeamStats* GetTeamStats() - { - static auto TeamStatsOffset = GetOffset("TeamStats"); - return GetPtr(TeamStatsOffset); - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.AthenaPlayerMatchReport"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AthenaResurrectionComponent.h b/dependencies/reboot/Project Reboot 3.0/AthenaResurrectionComponent.h deleted file mode 100644 index 93c864a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AthenaResurrectionComponent.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "ActorComponent.h" - -#include "reboot.h" - -class UAthenaResurrectionComponent : public UActorComponent -{ -public: - TWeakObjectPtr& GetResurrectionLocation() - { - static auto ResurrectionLocationOffset = GetOffset("ResurrectionLocation"); - return Get>(ResurrectionLocationOffset); - } - - int& GetClosestSpawnMachineIndex() - { - static auto ClosestSpawnMachineIndexOffset = GetOffset("ClosestSpawnMachineIndex"); - return Get(ClosestSpawnMachineIndexOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/AttributeSet.h b/dependencies/reboot/Project Reboot 3.0/AttributeSet.h deleted file mode 100644 index f287493..0000000 --- a/dependencies/reboot/Project Reboot 3.0/AttributeSet.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "reboot.h" - -class UAttributeSet : public UObject -{ -public: -}; - -struct FGameplayAttribute -{ - FString AttributeName; - void* Attribute; // Property - UStruct* AttributeOwner; - - std::string GetAttributeName() - { - return AttributeName.ToString(); - } - - std::string GetAttributePropertyName() - { - if (!Attribute) - return "INVALIDATTRIBUTE"; - - return GetFNameOfProp(Attribute)->ToString(); - } -}; - -struct FGameplayAttributeData -{ - float& GetBaseValue() - { - static auto BaseValueOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAttributeData", "BaseValue"); - return *(float*)(__int64(this) + BaseValueOffset); - } - - float& GetCurrentValue() - { - static auto CurrentValueOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAttributeData", "CurrentValue"); - return *(float*)(__int64(this) + CurrentValueOffset); - } -}; - -struct FFortGameplayAttributeData : public FGameplayAttributeData -{ - -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BGA.h b/dependencies/reboot/Project Reboot 3.0/BGA.h deleted file mode 100644 index 6a08899..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BGA.h +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once - -#include "reboot.h" -#include "GameplayStatics.h" -#include "FortLootPackage.h" -#include "FortPickup.h" -#include "BuildingGameplayActor.h" -#include "KismetSystemLibrary.h" - -static inline void SpawnBGAs() // hahah not "proper", there's a function that we can hook and it gets called on each spawner whenever playlist gets set, but it's fine. -{ - static auto BGAConsumableSpawnerClass = FindObject(L"/Script/FortniteGame.BGAConsumableSpawner"); - - if (!BGAConsumableSpawnerClass) - return; - - auto GameState = Cast(GetWorld()->GetGameState()); - - auto AllBGAConsumableSpawners = UGameplayStatics::GetAllActorsOfClass(GetWorld(), BGAConsumableSpawnerClass); - - LOG_INFO(LogDev, "AllBGAConsumableSpawners.Num(): {}", (int)AllBGAConsumableSpawners.Num()); - - for (int i = 0; i < AllBGAConsumableSpawners.Num(); ++i) - { - auto BGAConsumableSpawner = AllBGAConsumableSpawners.at(i); - auto SpawnLocation = BGAConsumableSpawner->GetActorLocation(); - - static auto bAlignSpawnedActorsToSurfaceOffset = BGAConsumableSpawner->GetOffset("bAlignSpawnedActorsToSurface"); - const bool bAlignSpawnedActorsToSurface = BGAConsumableSpawner->Get(bAlignSpawnedActorsToSurfaceOffset); - - FTransform SpawnTransform{}; - SpawnTransform.Translation = SpawnLocation; - SpawnTransform.Scale3D = FVector{ 1, 1, 1 }; - SpawnTransform.Rotation = FQuat(); - - if (FBuildingGameplayActorSpawnDetails::GetStruct()) - { - // todo handle? - - auto MapInfo = GameState->GetMapInfo(); - } - - static auto SpawnLootTierGroupOffset = BGAConsumableSpawner->GetOffset("SpawnLootTierGroup"); - auto& SpawnLootTierGroup = BGAConsumableSpawner->Get(SpawnLootTierGroupOffset); - - auto LootDrops = PickLootDrops(SpawnLootTierGroup, GameState->GetWorldLevel()); - - for (int z = 0; z < LootDrops.size(); z++) - { - auto& LootDrop = LootDrops.at(z); - - static auto ConsumableClassOffset = LootDrop->GetItemDefinition()->GetOffset("ConsumableClass"); - auto ConsumableClassSoft = LootDrop->GetItemDefinition()->GetPtr>(ConsumableClassOffset); - - static auto BlueprintGeneratedClassClass = FindObject(L"/Script/Engine.BlueprintGeneratedClass"); - auto StrongConsumableClass = ConsumableClassSoft->Get(BlueprintGeneratedClassClass, true); - - if (!StrongConsumableClass) - { - LOG_INFO(LogDev, "Invalid consumable class!"); - continue; - } - - bool bDeferConstruction = true; // hm? - - auto ConsumableActor = GetWorld()->SpawnActor(StrongConsumableClass, SpawnTransform, CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn, bDeferConstruction)); - - if (ConsumableActor) - { - FTransform FinalSpawnTransform = SpawnTransform; - - if (bAlignSpawnedActorsToSurface) - { - // I DONT KNOW - - /* FHitResult* NewHit = Alloc(FHitResult::GetStructSize()); - - FVector StartLocation = FinalSpawnTransform.Translation; - FVector EndLocation = StartLocation - FVector(0, 0, 1000); - - bool bTraceComplex = true; // idk - FName ProfileName = UKismetStringLibrary::Conv_StringToName(L"FindGroundLocationAt"); - - UKismetSystemLibrary::LineTraceSingleByProfile(ConsumableActor, StartLocation, EndLocation, ProfileName, bTraceComplex, - TArray(), EDrawDebugTrace::None, &NewHit, true, FLinearColor(), FLinearColor(), 0); - - // UKismetSystemLibrary::LineTraceSingle(ConsumableActor, StartLocation, EndLocation, - // ETraceTypeQuery::TraceTypeQuery1, bTraceComplex, TArray(), EDrawDebugTrace::None, true, FLinearColor(), FLinearColor(), 0, &NewHit); - - bool IsBlockingHit = NewHit && NewHit->IsBlockingHit(); // Should we check ret of linetracesingle? - - if (IsBlockingHit) - { - FinalSpawnTransform.Translation = NewHit->GetLocation(); - } - else - { - FinalSpawnTransform.Translation = FVector(0, 0, 0); - } - - */ - } - - if (FinalSpawnTransform.Translation.CompareVectors(FVector(0, 0, 0))) - { - LOG_WARN(LogGame, "Invalid BGA spawn location!"); - // ConsumableActor->K2_DestroyActor(); // ?? - continue; - } - - if (bDeferConstruction) - UGameplayStatics::FinishSpawningActor(ConsumableActor, FinalSpawnTransform); - - // ConsumableActor->InitializeBuildingActor(nullptr, nullptr, true); // idk UFortKismetLibrary::SpawnBuildingGameplayActor does this - - LOG_INFO(LogDev, "[{}/{}] Spawned BGA {} at {} {} {}", z, LootDrops.size(), ConsumableActor->GetName(), FinalSpawnTransform.Translation.X, FinalSpawnTransform.Translation.Y, FinalSpawnTransform.Translation.Z); - break; // ? - } - } - } - - AllBGAConsumableSpawners.Free(); - - LOG_INFO(LogDev, "Spawned BGAS!"); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BP_IslandScripting.cpp b/dependencies/reboot/Project Reboot 3.0/BP_IslandScripting.cpp deleted file mode 100644 index 2b65e76..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BP_IslandScripting.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "BP_IslandScripting.h" - -void ABP_IslandScripting_C::Initialize() -{ - static auto UpdateMapOffset = GetOffset("UpdateMap", false); - - if (UpdateMapOffset != -1) - { - Get(UpdateMapOffset) = true; - this->OnRep_UpdateMap(); - } - - /* - - // This spawns the beam. - - this->IsDeimosActive() = true; - this->OnRep_IsDeimosActive(); - */ -} - -ABP_IslandScripting_C* ABP_IslandScripting_C::GetIslandScripting() -{ - auto AllIslandScriptings = UGameplayStatics::GetAllActorsOfClass(GetWorld(), StaticClass()); - return AllIslandScriptings.Num() > 0 ? (ABP_IslandScripting_C*)AllIslandScriptings.at(0) : nullptr; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BP_IslandScripting.h b/dependencies/reboot/Project Reboot 3.0/BP_IslandScripting.h deleted file mode 100644 index 1d19ae8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BP_IslandScripting.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include "reboot.h" - -#include "GameplayStatics.h" - -class ABP_IslandScripting_C : public AActor // AFortAlwaysRelevantReplicatedActor -{ -public: - bool& IsDeimosActive() - { - static auto IsDeimosActiveOffset = GetOffset("IsDeimosActive"); - return Get(IsDeimosActiveOffset); - } - - void OnRep_IsDeimosActive() - { - static auto OnRep_IsDeimosActiveFn = FindObject("/Game/Athena/Prototype/Blueprints/Island/BP_IslandScripting.BP_IslandScripting_C.OnRep_IsDeimosActive"); - this->ProcessEvent(OnRep_IsDeimosActiveFn); - } - - void OnRep_UpdateMap() - { - static auto OnRep_UpdateMapFn = FindObject("/Game/Athena/Prototype/Blueprints/Island/BP_IslandScripting.BP_IslandScripting_C.OnRep_UpdateMap"); - this->ProcessEvent(OnRep_UpdateMapFn); - } - - void Initialize(); - - static ABP_IslandScripting_C* GetIslandScripting(); - - static UClass* StaticClass() - { - /* static */ auto Class = FindObject("/Game/Athena/Prototype/Blueprints/Island/BP_IslandScripting.BP_IslandScripting_C"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BinaryHeap.h b/dependencies/reboot/Project Reboot 3.0/BinaryHeap.h deleted file mode 100644 index a5dc250..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BinaryHeap.h +++ /dev/null @@ -1,143 +0,0 @@ -#pragma once - -#include "inc.h" - -#include "ReversePredicate.h" - -namespace AlgoImpl -{ - /** - * Gets the index of the left child of node at Index. - * - * @param Index Node for which the left child index is to be returned. - * @returns Index of the left child. - */ - FORCEINLINE int32 HeapGetLeftChildIndex(int32 Index) - { - return Index * 2 + 1; - } - - /** - * Checks if node located at Index is a leaf or not. - * - * @param Index Node index. - * @returns true if node is a leaf, false otherwise. - */ - FORCEINLINE bool HeapIsLeaf(int32 Index, int32 Count) - { - return HeapGetLeftChildIndex(Index) >= Count; - } - - /** - * Gets the parent index for node at Index. - * - * @param Index node index. - * @returns Parent index. - */ - FORCEINLINE int32 HeapGetParentIndex(int32 Index) - { - return (Index - 1) / 2; - } - - /** - * Fixes a possible violation of order property between node at Index and a child. - * - * @param Heap Pointer to the first element of a binary heap. - * @param Index Node index. - * @param Count Size of the heap. - * @param Projection The projection to apply to the elements. - * @param Predicate A binary predicate object used to specify if one element should precede another. - */ - template - FORCEINLINE void HeapSiftDown(RangeValueType* Heap, int32 Index, const int32 Count, const ProjectionType& Projection, const PredicateType& Predicate) - { - while (!HeapIsLeaf(Index, Count)) - { - const int32 LeftChildIndex = HeapGetLeftChildIndex(Index); - const int32 RightChildIndex = LeftChildIndex + 1; - - int32 MinChildIndex = LeftChildIndex; - if (RightChildIndex < Count) - { - MinChildIndex = Predicate(Invoke(Projection, Heap[LeftChildIndex]), Invoke(Projection, Heap[RightChildIndex])) ? LeftChildIndex : RightChildIndex; - } - - if (!Predicate(Invoke(Projection, Heap[MinChildIndex]), Invoke(Projection, Heap[Index]))) - { - break; - } - - Swap(Heap[Index], Heap[MinChildIndex]); - Index = MinChildIndex; - } - } - - /** - * Fixes a possible violation of order property between node at NodeIndex and a parent. - * - * @param Heap Pointer to the first element of a binary heap. - * @param RootIndex How far to go up? - * @param NodeIndex Node index. - * @param Projection The projection to apply to the elements. - * @param Predicate A binary predicate object used to specify if one element should precede another. - * - * @return The new index of the node that was at NodeIndex - */ - template - FORCEINLINE int32 HeapSiftUp(RangeValueType* Heap, int32 RootIndex, int32 NodeIndex, const ProjectionType& Projection, const PredicateType& Predicate) - { - while (NodeIndex > RootIndex) - { - int32 ParentIndex = HeapGetParentIndex(NodeIndex); - if (!Predicate(Invoke(Projection, Heap[NodeIndex]), Invoke(Projection, Heap[ParentIndex]))) - { - break; - } - - Swap(Heap[NodeIndex], Heap[ParentIndex]); - NodeIndex = ParentIndex; - } - - return NodeIndex; - } - - /** - * Builds an implicit min-heap from a range of elements. - * This is the internal function used by Heapify overrides. - * - * @param First pointer to the first element to heapify - * @param Num the number of items to heapify - * @param Projection The projection to apply to the elements. - * @param Predicate A binary predicate object used to specify if one element should precede another. - */ - template - FORCEINLINE void HeapifyInternal(RangeValueType* First, SIZE_T Num, ProjectionType Projection, PredicateType Predicate) - { - for (int32 Index = HeapGetParentIndex(Num - 1); Index >= 0; Index--) - { - HeapSiftDown(First, Index, Num, Projection, Predicate); - } - } - - /** - * Performs heap sort on the elements. - * This is the internal sorting function used by HeapSort overrides. - * - * @param First pointer to the first element to sort - * @param Num the number of elements to sort - * @param Predicate predicate class - */ - template - void HeapSortInternal(RangeValueType* First, SIZE_T Num, ProjectionType Projection, PredicateType Predicate) - { - TReversePredicate< PredicateType > ReversePredicateWrapper(Predicate); // Reverse the predicate to build a max-heap instead of a min-heap - HeapifyInternal(First, Num, Projection, ReversePredicateWrapper); - - for (int32 Index = Num - 1; Index > 0; Index--) - { - Swap(First[0], First[Index]); - - HeapSiftDown(First, 0, Index, Projection, ReversePredicateWrapper); - } - } -} diff --git a/dependencies/reboot/Project Reboot 3.0/BitArray.h b/dependencies/reboot/Project Reboot 3.0/BitArray.h deleted file mode 100644 index fc07d9c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BitArray.h +++ /dev/null @@ -1,329 +0,0 @@ -#pragma once - -#include "ContainerAllocationPolicies.h" - -static FORCEINLINE uint32 CountLeadingZeros(uint32 Value) -{ - unsigned long Log2; - if (_BitScanReverse(&Log2, Value) != 0) - { - return 31 - Log2; - } - - return 32; -} - -#define NumBitsPerDWORD ((int32)32) -#define NumBitsPerDWORDLogTwo ((int32)5) - -class TBitArray -{ -public: - TInlineAllocator<4>::ForElementType Data; - int NumBits; - int MaxBits; - - struct FRelativeBitReference - { - public: - FORCEINLINE explicit FRelativeBitReference(int32 BitIndex) - : DWORDIndex(BitIndex >> NumBitsPerDWORDLogTwo) - , Mask(1 << (BitIndex & (NumBitsPerDWORD -1))) - { - } - - int32 DWORDIndex; - uint32 Mask; - }; - -public: - struct FBitReference - { - FORCEINLINE FBitReference(uint32& InData, uint32 InMask) - : Data(InData) - , Mask(InMask) - { - } - FORCEINLINE const FBitReference(const uint32& InData, const uint32 InMask) - : Data(const_cast(InData)) - , Mask(InMask) - { - } - - FORCEINLINE void SetBit(const bool Value) - { - Value ? Data |= Mask : Data &= ~Mask; - - // 10011101 - Data // 10011101 - Data - // 00000010 - Mask - true | // 00000010 - Mask - false - // 10011111 - |= // 11111101 - ~ - // // 10011111 - &= - } - - FORCEINLINE operator bool() const - { - return (Data & Mask) != 0; - } - FORCEINLINE void operator=(const bool Value) - { - this->SetBit(Value); - } - - private: - uint32& Data; - uint32 Mask; - }; - -public: - class FBitIterator : public FRelativeBitReference - { - private: - int32 Index; - const TBitArray& IteratedArray; - - public: - FORCEINLINE const FBitIterator(const TBitArray& ToIterate, const int32 StartIndex) // Begin - : IteratedArray(ToIterate) - , Index(StartIndex) - , FRelativeBitReference(StartIndex) - { - } - FORCEINLINE const FBitIterator(const TBitArray& ToIterate) // End - : IteratedArray(ToIterate) - , Index(ToIterate.NumBits) - , FRelativeBitReference(ToIterate.NumBits) - { - } - - FORCEINLINE explicit operator bool() const - { - return Index < IteratedArray.Num(); - } - FORCEINLINE FBitIterator& operator++() - { - ++Index; - this->Mask <<= 1; - if (!this->Mask) - { - this->Mask = 1; - ++this->DWORDIndex; - } - return *this; - } - FORCEINLINE bool operator*() const - { - // Thesis: Once there are more elements in the BitArray than InlineData can hold it'll just allocate all of - // them through SecondaryElements, leaving InlineData all true - - if (IteratedArray.NumBits < IteratedArray.Data.NumInlineBits()) - { - return (bool)FBitReference(IteratedArray.Data.GetInlineElement(this->DWORDIndex), this->Mask); - } - else - { - return (bool)FBitReference(IteratedArray.Data.GetSecondaryElement(this->DWORDIndex), this->Mask); - } - } - FORCEINLINE bool operator==(const FBitIterator& OtherIt) const - { - return Index == OtherIt.Index; - } - FORCEINLINE bool operator!=(const FBitIterator& OtherIt) const - { - return Index (const int32 Other) const - { - return Index < Other; - } - - FORCEINLINE int32 GetIndex() const - { - return Index; - } - }; - - class FSetBitIterator : public FRelativeBitReference - { - private: - const TBitArray& IteratedArray; - - uint32 UnvisitedBitMask; - int32 CurrentBitIndex; - int32 BaseBitIndex; - - public: - FORCEINLINE FSetBitIterator(const TBitArray& ToIterate, int32 StartIndex) - : FRelativeBitReference(StartIndex) - , IteratedArray(const_cast(ToIterate)) - , UnvisitedBitMask((~0U) << (StartIndex & (NumBitsPerDWORD - 1))) - , CurrentBitIndex(StartIndex) - , BaseBitIndex(StartIndex & ~(NumBitsPerDWORD - 1)) - { - if (StartIndex != IteratedArray.NumBits) - { - FindNextSetBit(); - } - } - FORCEINLINE FSetBitIterator(const TBitArray& ToIterate) - : FRelativeBitReference(ToIterate.NumBits) - , IteratedArray(const_cast(ToIterate)) - , UnvisitedBitMask(0) - , CurrentBitIndex(ToIterate.NumBits) - , BaseBitIndex(ToIterate.NumBits) - { - } - - FORCEINLINE FSetBitIterator& operator++() - { - UnvisitedBitMask &= ~this->Mask; - - FindNextSetBit(); - - return *this; - } - FORCEINLINE bool operator*() const - { - return true; - } - - FORCEINLINE bool operator==(const FSetBitIterator& Other) const - { - return CurrentBitIndex == Other.CurrentBitIndex; - } - FORCEINLINE bool operator!=(const FSetBitIterator& Other) const - { - return CurrentBitIndex DWORDIndex] & UnvisitedBitMask; - - while (!RemainingBitMask) - { - ++this->DWORDIndex; - BaseBitIndex += NumBitsPerDWORD; - - if (this->DWORDIndex > LastDWORDIndex) - { - CurrentBitIndex = ArrayNum; - return; - } - - RemainingBitMask = ArrayData[this->DWORDIndex]; - UnvisitedBitMask = ~0; - } - - const uint32 NewRemainingBitMask = RemainingBitMask & (RemainingBitMask - 1); - - this->Mask = NewRemainingBitMask ^ RemainingBitMask; - - CurrentBitIndex = BaseBitIndex + NumBitsPerDWORD - 1 - CountLeadingZeros(this->Mask); - - if (CurrentBitIndex > ArrayNum) - { - CurrentBitIndex = ArrayNum; - } - } - }; - -public: - FORCEINLINE FBitIterator Iterator(int32 StartIndex) - { - return FBitIterator(*this, StartIndex); - } - FORCEINLINE FSetBitIterator SetBitIterator(int32 StartIndex) - { - return FSetBitIterator(*this, StartIndex); - } - - FORCEINLINE FBitIterator begin() - { - return FBitIterator(*this, 0); - } - FORCEINLINE const FBitIterator begin() const - { - return FBitIterator(*this, 0); - } - FORCEINLINE FBitIterator end() - { - return FBitIterator(*this); - } - FORCEINLINE const FBitIterator end() const - { - return FBitIterator(*this); - } - - FORCEINLINE FSetBitIterator SetBitsItBegin() - { - return FSetBitIterator(*this, 0); - } - FORCEINLINE const FSetBitIterator SetBitsItBegin() const - { - return FSetBitIterator(*this, 0); - } - FORCEINLINE const FSetBitIterator SetBitsItEnd() - { - return FSetBitIterator(*this); - } - FORCEINLINE const FSetBitIterator SetBitsItEnd() const - { - return FSetBitIterator(*this); - } - - FORCEINLINE int32 Num() const - { - return NumBits; - } - FORCEINLINE int32 Max() const - { - return MaxBits; - } - FORCEINLINE bool IsSet(int32 Index) const - { - return *FBitIterator(*this, Index); - } - FORCEINLINE void Set(const int32 Index, const bool Value, bool bIsSettingAllZero = false) - { - const int32 DWORDIndex = (Index >> ((int32)5)); - const int32 Mask = (1 << (Index & (((int32)32) - 1))); - - if (!bIsSettingAllZero) - NumBits = Index >= NumBits ? Index < MaxBits ? Index + 1 : NumBits : NumBits; - - FBitReference(Data[DWORDIndex], Mask).SetBit(Value); - } - FORCEINLINE void ZeroAll() - { - for (int i = 0; i < MaxBits; ++i) - { - Set(i, false, true); - } - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingActor.cpp b/dependencies/reboot/Project Reboot 3.0/BuildingActor.cpp deleted file mode 100644 index 157aae3..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingActor.cpp +++ /dev/null @@ -1,120 +0,0 @@ -#include "BuildingActor.h" - -#include "FortWeapon.h" -#include "BuildingSMActor.h" -#include "FortPlayerControllerAthena.h" -#include "FortPawn.h" -#include "FortWeaponMeleeItemDefinition.h" -#include "CurveTable.h" -#include "DataTable.h" -#include "FortResourceItemDefinition.h" -#include "FortKismetLibrary.h" -#include "DataTableFunctionLibrary.h" - -void ABuildingActor::OnDamageServerHook(ABuildingActor* BuildingActor, float Damage, FGameplayTagContainer DamageTags, - FVector Momentum, /* FHitResult */ __int64 HitInfo, APlayerController* InstigatedBy, AActor* DamageCauser, - /* FGameplayEffectContextHandle */ __int64 EffectContext) -{ - // LOG_INFO(LogDev, "Befor3e"); - - auto BuildingSMActor = Cast(BuildingActor); - auto PlayerController = Cast(InstigatedBy); - // auto Pawn = PlayerController ? PlayerController->GetMyFortPawn() : nullptr; - auto Weapon = Cast(DamageCauser); - - if (!BuildingSMActor) - return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); - - if (BuildingSMActor->IsDestroyed()) - return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); - - /* - - static auto LastDamageAmountOffset = BuildingSMActor->GetOffset("LastDamageAmount"); - static auto LastDamageHitOffset = BuildingSMActor->GetOffset("LastDamageHit", false) != -1 ? BuildingSMActor->GetOffset("LastDamageHit") : BuildingSMActor->GetOffset("LastDamageHitImpulseDir"); // idc - - const float PreviousLastDamageAmount = BuildingSMActor->Get(LastDamageAmountOffset); - const float PreviousLastDamageHit = BuildingSMActor->Get(LastDamageHitOffset); - const float CurrentBuildingHealth = BuildingActor->GetHealth(); - - BuildingSMActor->Get(LastDamageAmountOffset) = Damage; - BuildingSMActor->Get(LastDamageHitOffset) = CurrentBuildingHealth; - - */ - - if (!PlayerController || !Weapon) - return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); - - // if (!Pawn) - // return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); - - auto WeaponData = Cast(Weapon->GetWeaponData()); - - if (!WeaponData) - return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); - - UFortResourceItemDefinition* ItemDef = UFortKismetLibrary::K2_GetResourceItemDefinition(BuildingSMActor->GetResourceType()); - - if (!ItemDef) - return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); - - static auto BuildingResourceAmountOverrideOffset = BuildingSMActor->GetOffset("BuildingResourceAmountOverride"); - auto& BuildingResourceAmountOverride = BuildingSMActor->Get(BuildingResourceAmountOverrideOffset); - - int ResourceCount = 0; - - if (BuildingResourceAmountOverride.RowName.IsValid()) - { - // auto AssetManager = Cast(GEngine->AssetManager); - // auto GameState = Cast(GetWorld()->GetGameStateAthena); - UCurveTable* CurveTable = nullptr; // GameState->CurrentPlaylistInfo.BasePlaylist ? GameState->CurrentPlaylistInfo.BasePlaylist->ResourceRates.Get() : nullptr; - - // LOG_INFO(LogDev, "Before1"); - - if (!CurveTable) - CurveTable = FindObject(L"/Game/Athena/Balance/DataTables/AthenaResourceRates.AthenaResourceRates"); - - { - // auto curveMap = ((UDataTable*)CurveTable)->GetRowMap(); - - // LOG_INFO(LogDev, "Before {}", __int64(CurveTable)); - - float Out = UDataTableFunctionLibrary::EvaluateCurveTableRow(CurveTable, BuildingResourceAmountOverride.RowName, 0.f); - - // LOG_INFO(LogDev, "Out: {}", Out); - - const float DamageThatWillAffect = /* PreviousLastDamageHit > 0 && Damage > PreviousLastDamageHit ? PreviousLastDamageHit : */ Damage; - - float skid = Out / (BuildingActor->GetMaxHealth() / DamageThatWillAffect); - - ResourceCount = round(skid); - } - } - - if (ResourceCount <= 0) - { - return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); - } - - bool bIsWeakspot = Damage == 100.0f; - PlayerController->ClientReportDamagedResourceBuilding(BuildingSMActor, BuildingSMActor->GetResourceType(), ResourceCount, false, bIsWeakspot); - - bool bShouldUpdate = false; - WorldInventory->AddItem(ItemDef, &bShouldUpdate, ResourceCount); - - if (bShouldUpdate) - WorldInventory->Update(); - - return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext); -} - -UClass* ABuildingActor::StaticClass() -{ - static auto Class = FindObject(L"/Script/FortniteGame.BuildingActor"); - return Class; -} diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingActor.h b/dependencies/reboot/Project Reboot 3.0/BuildingActor.h deleted file mode 100644 index 5d72862..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingActor.h +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#include "Actor.h" -#include "reboot.h" // we want to prevent this but im to lazy to make cpp file -#include "PlayerController.h" - -#include "GameplayTagContainer.h" - -class ABuildingActor : public AActor -{ -public: - void InitializeBuildingActor(UObject* Controller, ABuildingActor* BuildingOwner, bool bUsePlayerBuildAnimations, UObject* ReplacedBuilding = nullptr) - { - struct { - UObject* BuildingOwner; // ABuildingActor - UObject* SpawningController; - bool bUsePlayerBuildAnimations; // I think this is not on some versions - UObject* ReplacedBuilding; // this also not on like below 18.00 - } IBAParams{ BuildingOwner, Controller, bUsePlayerBuildAnimations, ReplacedBuilding }; - - static auto fn = FindObject("/Script/FortniteGame.BuildingActor.InitializeKismetSpawnedBuildingActor"); - this->ProcessEvent(fn, &IBAParams); - } - - bool IsDestroyed() - { - static auto bDestroyedOffset = GetOffset("bDestroyed"); - static auto bDestroyedFieldMask = GetFieldMask(GetProperty("bDestroyed")); - return ReadBitfieldValue(bDestroyedOffset, bDestroyedFieldMask); - } - - void SilentDie() - { - static auto SilentDieFn = FindObject(L"/Script/FortniteGame.BuildingActor.SilentDie"); - bool bPropagateSilentDeath = false; // idfk - this->ProcessEvent(SilentDieFn, &bPropagateSilentDeath); - } - - float GetMaxHealth() - { - float MaxHealth = 0; - static auto fn = FindObject(L"/Script/FortniteGame.BuildingActor.GetMaxHealth"); - this->ProcessEvent(fn, &MaxHealth); - return MaxHealth; - } - - float GetHealthPercent() // aka GetHealth() / GetMaxHealth() - { - float HealthPercent = 0; - static auto fn = FindObject(L"/Script/FortniteGame.BuildingActor.GetHealthPercent"); - this->ProcessEvent(fn, &HealthPercent); - return HealthPercent; - } - - float GetHealth() - { - float Health = 0; - static auto fn = FindObject("/Script/FortniteGame.BuildingActor.GetHealth"); - this->ProcessEvent(fn, &Health); - return Health; - } - - void SetTeam(unsigned char InTeam) - { - static auto fn = nullptr; // FindObject(L"/Script/FortniteGame.BuildingActor.SetTeam"); - - if (!fn) - { - static auto TeamOffset = GetOffset("Team"); - Get(TeamOffset) = InTeam; - - static auto TeamIndexOffset = GetOffset("TeamIndex", false); - - if (TeamIndexOffset != -1) - Get(TeamIndexOffset) = InTeam; - } - else - { - this->ProcessEvent(fn, &InTeam); - } - } - - bool IsPlayerBuildable() - { - static auto bIsPlayerBuildableOffset = GetOffset("bIsPlayerBuildable"); - static auto bIsPlayerBuildableFieldMask = GetFieldMask(GetProperty("bIsPlayerBuildable")); - return ReadBitfieldValue(bIsPlayerBuildableOffset, bIsPlayerBuildableFieldMask); - } - - static inline void (*OnDamageServerOriginal)(ABuildingActor* BuildingActor, float Damage, FGameplayTagContainer DamageTags, - FVector Momentum, /* FHitResult */ __int64 HitInfo, APlayerController* InstigatedBy, AActor* DamageCauser, - /* FGameplayEffectContextHandle */ __int64 EffectContext); - - static void OnDamageServerHook(ABuildingActor* BuildingActor, float Damage, FGameplayTagContainer DamageTags, - FVector Momentum, /* FHitResult */ __int64 HitInfo, APlayerController* InstigatedBy, AActor* DamageCauser, - /* FGameplayEffectContextHandle */ __int64 EffectContext); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingContainer.cpp b/dependencies/reboot/Project Reboot 3.0/BuildingContainer.cpp deleted file mode 100644 index 2b1c47a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingContainer.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "BuildingContainer.h" -#include "FortPickup.h" -#include "FortLootPackage.h" -#include "FortGameModeAthena.h" -#include "gui.h" - -bool ABuildingContainer::SpawnLoot(AFortPawn* Pawn) -{ - if (!Pawn) - return false; - - this->ForceNetUpdate(); - - auto GameMode = Cast(GetWorld()->GetGameMode()); - - FVector LocationToSpawnLoot = this->GetActorLocation() + this->GetActorForwardVector() * this->GetLootSpawnLocation_Athena().X + this->GetActorRightVector() * this->GetLootSpawnLocation_Athena().Y + this->GetActorUpVector() * this->GetLootSpawnLocation_Athena().Z; - - auto RedirectedLootTier = GameMode->RedirectLootTier(GetSearchLootTierGroup()); - - // LOG_INFO(LogInteraction, "RedirectedLootTier: {}", RedirectedLootTier.ToString()); - - auto GameState = Cast(GetWorld()->GetGameState()); - - auto LootDrops = PickLootDrops(RedirectedLootTier, GameState->GetWorldLevel(), -1, bDebugPrintLooting); - - // LOG_INFO(LogInteraction, "LootDrops.size(): {}", LootDrops.size()); - - for (auto& lootDrop : LootDrops) - { - PickupCreateData CreateData; - CreateData.bToss = true; - // CreateData.PawnOwner = Pawn; - CreateData.ItemEntry = lootDrop.ItemEntry; - CreateData.SpawnLocation = LocationToSpawnLoot; - CreateData.SourceType = EFortPickupSourceTypeFlag::GetContainerValue(); - CreateData.bRandomRotation = true; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - auto NewPickup = AFortPickup::SpawnPickup(CreateData); - } - - if (!this->IsDestroyed()) - { - this->ForceNetUpdate(); - // a buncha other stuff - } - - return true; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingContainer.h b/dependencies/reboot/Project Reboot 3.0/BuildingContainer.h deleted file mode 100644 index 847251c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingContainer.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once - -#include "BuildingSMActor.h" -#include "FortPawn.h" - -class ABuildingContainer : public ABuildingSMActor -{ -public: - bool ShouldDestroyOnSearch() - { - static auto bDestroyContainerOnSearchOffset = GetOffset("bDestroyContainerOnSearch"); - static auto bDestroyContainerOnSearchFieldMask = GetFieldMask(GetProperty("bDestroyContainerOnSearch")); - return this->ReadBitfieldValue(bDestroyContainerOnSearchOffset, bDestroyContainerOnSearchFieldMask); - } - - FName& GetSearchLootTierGroup() - { - static auto SearchLootTierGroupOffset = this->GetOffset("SearchLootTierGroup"); - return Get(SearchLootTierGroupOffset); - } - - bool IsAlreadySearched() - { - static auto bAlreadySearchedOffset = this->GetOffset("bAlreadySearched"); - static auto bAlreadySearchedFieldMask = GetFieldMask(this->GetProperty("bAlreadySearched")); - return this->ReadBitfieldValue(bAlreadySearchedOffset, bAlreadySearchedFieldMask); - } - - FVector& GetLootSpawnLocation_Athena() - { - static auto LootSpawnLocation_AthenaOffset = this->GetOffset("LootSpawnLocation_Athena"); - return this->Get(LootSpawnLocation_AthenaOffset); - } - - void SetAlreadySearched(bool bNewValue, bool bOnRep = true) - { - static auto bAlreadySearchedOffset = this->GetOffset("bAlreadySearched"); - static auto bAlreadySearchedFieldMask = GetFieldMask(this->GetProperty("bAlreadySearched")); - this->SetBitfieldValue(bAlreadySearchedOffset, bAlreadySearchedFieldMask, bNewValue); - - if (bOnRep) - { - static auto OnRep_bAlreadySearchedFn = FindObject(L"/Script/FortniteGame.BuildingContainer.OnRep_bAlreadySearched"); - this->ProcessEvent(OnRep_bAlreadySearchedFn); - } - } - - FVector& GetLootSpawnLocation() - { - static auto LootSpawnLocationOffset = GetOffset("LootSpawnLocation"); - return Get(LootSpawnLocationOffset); - } - - float& GetLootNoiseRange() - { - static auto LootNoiseRangeOffset = GetOffset("LootNoiseRange"); - return Get(LootNoiseRangeOffset); - } - - void BounceContainer() - { - static auto BounceContainerFn = FindObject("/Script/FortniteGame.BuildingContainer.BounceContainer"); - this->ProcessEvent(BounceContainerFn); - } - - bool SpawnLoot(AFortPawn* Pawn); - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.BuildingContainer"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingFoundation.cpp b/dependencies/reboot/Project Reboot 3.0/BuildingFoundation.cpp deleted file mode 100644 index 83eccd4..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingFoundation.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "BuildingFoundation.h" -#include "FortGameModeAthena.h" - -void ABuildingFoundation::SetDynamicFoundationTransformHook(UObject* Context, FFrame& Stack, void* Ret) -{ - FTransform NewTransform; - Stack.StepCompiledIn(&NewTransform); - - auto BuildingFoundation = (ABuildingFoundation*)Context; - - LOG_INFO(LogDev, "Bruh: {}", BuildingFoundation->GetName()); - - SetFoundationTransform(BuildingFoundation, NewTransform); - - return SetDynamicFoundationTransformOriginal(Context, Stack, Ret); -} - -void ABuildingFoundation::SetDynamicFoundationEnabledHook(UObject* Context, FFrame& Stack, void* Ret) -{ - bool bEnabled; - Stack.StepCompiledIn(&bEnabled); - - // LOG_INFO(LogDev, "{} TELL MILXNOR IF THIS PRINTS: {}", Context->GetFullName(), bEnabled); - - auto BuildingFoundation = (ABuildingFoundation*)Context; - - ShowFoundation(BuildingFoundation, bEnabled); - - return SetDynamicFoundationEnabledOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingFoundation.h b/dependencies/reboot/Project Reboot 3.0/BuildingFoundation.h deleted file mode 100644 index 9711c67..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingFoundation.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include "BuildingSMActor.h" -#include "Stack.h" - -/* enum class EDynamicFoundationType : uint8 -{ - Static = 0, - StartEnabled_Stationary = 1, - StartEnabled_Dynamic = 2, - StartDisabled = 3, - EDynamicFoundationType_MAX = 4, -}; - -enum class EDynamicFoundationEnabledState : uint8_t -{ - Unknown = 0, - Enabled = 1, - Disabled = 2, - EDynamicFoundationEnabledState_MAX = 3 -}; - -enum class EDynamicFoundationType : uint8_t -{ - Static = 0, - StartEnabled_Stationary = 1, - StartEnabled_Dynamic = 2, - StartDisabled = 3, - EDynamicFoundationType_MAX = 4 -}; */ - -class ABuildingFoundation : public ABuildingSMActor -{ -public: - static inline void (*SetDynamicFoundationEnabledOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*SetDynamicFoundationTransformOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - static void SetDynamicFoundationTransformHook(UObject* Context, FFrame& Stack, void* Ret); - static void SetDynamicFoundationEnabledHook(UObject* Context, FFrame& Stack, void* Ret); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActor.h b/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActor.h deleted file mode 100644 index 8cb62fa..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActor.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "BuildingActor.h" - -class ABuildingGameplayActor : public ABuildingActor -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActorSpawnMachine.cpp b/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActorSpawnMachine.cpp deleted file mode 100644 index f6bf380..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActorSpawnMachine.cpp +++ /dev/null @@ -1,139 +0,0 @@ -#include "BuildingGameplayActorSpawnMachine.h" - -#include "FortPlayerControllerAthena.h" -#include "GameplayStatics.h" -#include "AthenaResurrectionComponent.h" -#include "FortGameStateAthena.h" -#include "FortGameModeAthena.h" - -void ABuildingGameplayActorSpawnMachine::FinishResurrection(int SquadId) -{ - static void (*FinishResurrectionOriginal)(ABuildingGameplayActorSpawnMachine* SpawnMachine, int SquadId) = decltype(FinishResurrectionOriginal)(Addresses::FinishResurrection); - - if (FinishResurrectionOriginal) - { - FinishResurrectionOriginal(this, SquadId); - } - else - { - - } -} - -void ABuildingGameplayActorSpawnMachine::RebootingDelegateHook(ABuildingGameplayActorSpawnMachine* SpawnMachine) -{ - auto GameMode = Cast(GetWorld()->GetGameMode()); - - LOG_INFO(LogDev, "RebootingDelegateHook!"); - - if (!SpawnMachine->GetResurrectLocation()) - { - LOG_WARN(LogRebooting, "Reboot van did not have a resurrection location!"); - return; - } - - LOG_INFO(LogDev, "PlayerIdsForResurrection.Num(): {}", SpawnMachine->GetPlayerIdsForResurrection().Num()); - - if (SpawnMachine->GetPlayerIdsForResurrection().Num() <= 0) - return; - - auto GameState = Cast(GetWorld()->GetGameState()); - - AFortPlayerControllerAthena* PlayerController = nullptr; - - if (auto TeamArrayContainer = GameState->GetTeamsArrayContainer()) - { - auto& SquadArray = TeamArrayContainer->SquadsArray.at(SpawnMachine->GetSquadId()); - - for (int i = 0; i < SquadArray.Num(); ++i) - { - auto StrongPlayerState = SquadArray.at(i).Get(); - - if (!StrongPlayerState) - continue; - - PlayerController = Cast(StrongPlayerState->GetOwner()); - - if (!PlayerController) - continue; - - if (PlayerController->InternalIndex == SpawnMachine->GetInstigatorPC().ObjectIndex) - continue; - - break; - } - } - - if (!PlayerController) - return; - - auto PlayerState = Cast(PlayerController->GetPlayerState()); - - if (!PlayerState) - return; - - auto ResurrectionComponent = PlayerController->GetResurrectionComponent(); - - if (!ResurrectionComponent) - return; - - static auto FortPlayerStartClass = FindObject(L"/Script/FortniteGame.FortPlayerStart"); - - if (true) // i dont think we actually need this - { - ResurrectionComponent->GetResurrectionLocation().ObjectIndex = SpawnMachine->GetResurrectLocation()->InternalIndex; - ResurrectionComponent->GetResurrectionLocation().ObjectSerialNumber = GetItemByIndex(SpawnMachine->GetResurrectLocation()->InternalIndex)->SerialNumber; - } - - auto StrongResurrectionLocation = ResurrectionComponent->GetResurrectionLocation().Get(); - - LOG_INFO(LogDev, "StrongResurrectionLocation: {} IsRespawnDataAvailable: {}", __int64(StrongResurrectionLocation), PlayerState->GetRespawnData()->IsRespawnDataAvailable()); - - if (!StrongResurrectionLocation) - return; - - PlayerState->GetRespawnData()->IsRespawnDataAvailable() = false; - PlayerController->SetPlayerIsWaiting(true); - // PlayerController->ServerRestartPlayer(); - - bool bEnterSkydiving = false; // TODO get from like curve table iirc idk or the variable - PlayerController->RespawnPlayerAfterDeath(bEnterSkydiving); - - AFortPlayerPawn* NewPawn = Cast(PlayerController->GetMyFortPawn()); - - LOG_INFO(LogDev, "NewPawn: {}", __int64(NewPawn)); - - if (!NewPawn) // Failed to restart player - { - LOG_INFO(LogRebooting, "Failed to restart the player!"); - return; - } - - PlayerController->ClientClearDeathNotification(); - - NewPawn->SetHealth(100); - NewPawn->SetMaxHealth(100); - - static auto RebootCounterOffset = PlayerState->GetOffset("RebootCounter"); - PlayerState->Get(RebootCounterOffset)++; - - static auto OnRep_RebootCounterFn = FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.OnRep_RebootCounter"); - PlayerState->ProcessEvent(OnRep_RebootCounterFn); - - auto OnPlayerPawnResurrectedFn = SpawnMachine->FindFunction("OnPlayerPawnResurrected"); - SpawnMachine->ProcessEvent(OnPlayerPawnResurrectedFn, &NewPawn); - - static void (*AddToAlivePlayersOriginal)(AFortGameModeAthena* GameMode, AFortPlayerControllerAthena* Player) = decltype(AddToAlivePlayersOriginal)(Addresses::AddToAlivePlayers); - - if (AddToAlivePlayersOriginal) - { - AddToAlivePlayersOriginal(GameMode, PlayerController); - } - - bool IsFinalPlayerToBeRebooted = true; - - if (IsFinalPlayerToBeRebooted) - { - SpawnMachine->FinishResurrection(PlayerState->GetSquadId()); - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActorSpawnMachine.h b/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActorSpawnMachine.h deleted file mode 100644 index 1a6187f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingGameplayActorSpawnMachine.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "BuildingGameplayActor.h" -#include "OnlineReplStructs.h" -#include "WeakObjectPtr.h" - -class ABuildingGameplayActorSpawnMachine : public ABuildingGameplayActor -{ -public: - TArray& GetPlayerIdsForResurrection() - { - static auto PlayerIdsForResurrectionOffset = GetOffset("PlayerIdsForResurrection"); - return Get>(PlayerIdsForResurrectionOffset); - } - - AActor*& GetResurrectLocation() // actually AFortPlayerStart - { - static auto ResurrectLocationOffset = GetOffset("ResurrectLocation"); - return Get(ResurrectLocationOffset); - } - - uint8& GetActiveTeam() - { - static auto ActiveTeamOffset = GetOffset("ActiveTeam"); - return Get(ActiveTeamOffset); - } - - uint8& GetSquadId() - { - static auto SquadIdOffset = GetOffset("SquadId"); - return Get(SquadIdOffset); - } - - TWeakObjectPtr GetInstigatorPC() - { - static auto InstigatorPCOffset = GetOffset("InstigatorPC"); - return Get>(InstigatorPCOffset); - } - - void FinishResurrection(int SquadId); - - static void RebootingDelegateHook(ABuildingGameplayActorSpawnMachine* SpawnMachine); - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.BuildingGameplayActorSpawnMachine"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingItemWeaponUpgradeActor.h b/dependencies/reboot/Project Reboot 3.0/BuildingItemWeaponUpgradeActor.h deleted file mode 100644 index 4bda5d7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingItemWeaponUpgradeActor.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "BuildingGameplayActor.h" - -class ABuildingItemWeaponUpgradeActor : public ABuildingGameplayActor // ABuildingItemCollectorActor -{ -public: - - static class UClass* StaticClass() - { - static UClass* Class = FindObject(L"/Script/FortniteGame.BuildingItemWeaponUpgradeActor"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingRift.h b/dependencies/reboot/Project Reboot 3.0/BuildingRift.h deleted file mode 100644 index 0e503cb..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingRift.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "BuildingActor.h" - -class ABuildingRift : public ABuildingActor -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingSMActor.cpp b/dependencies/reboot/Project Reboot 3.0/BuildingSMActor.cpp deleted file mode 100644 index b2f45c9..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingSMActor.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "BuildingSMActor.h" - -UClass* ABuildingSMActor::StaticClass() -{ - static auto Class = FindObject(L"/Script/FortniteGame.BuildingSMActor"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingSMActor.h b/dependencies/reboot/Project Reboot 3.0/BuildingSMActor.h deleted file mode 100644 index bcff2be..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingSMActor.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#include "BuildingActor.h" -#include "PlayerState.h" - -enum class EFortResourceType : uint8_t -{ - Wood = 0, - Stone = 1, - Metal = 2, - Permanite = 3, - None = 4, - EFortResourceType_MAX = 5 -}; - -class ABuildingSMActor : public ABuildingActor -{ -public: - bool IsPlayerPlaced() - { - static auto bPlayerPlacedOffset = GetOffset("bPlayerPlaced"); - static auto bPlayerPlacedFieldMask = GetFieldMask(this->GetProperty("bPlayerPlaced")); - return ReadBitfieldValue(bPlayerPlacedOffset, bPlayerPlacedFieldMask); - } - - void SetPlayerPlaced(bool NewValue) - { - static auto bPlayerPlacedOffset = GetOffset("bPlayerPlaced"); - static auto bPlayerPlacedFieldMask = GetFieldMask(this->GetProperty("bPlayerPlaced")); - this->SetBitfieldValue(bPlayerPlacedOffset, bPlayerPlacedFieldMask, NewValue); - } - - APlayerState*& GetEditingPlayer() - { - static auto EditingPlayerOffset = GetOffset("EditingPlayer"); - return Get(EditingPlayerOffset); - } - - int& GetCurrentBuildingLevel() - { - static auto CurrentBuildingLevelOffset = GetOffset("CurrentBuildingLevel"); - return Get(CurrentBuildingLevelOffset); - } - - EFortResourceType& GetResourceType() - { - static auto ResourceTypeOffset = GetOffset("ResourceType"); - return Get(ResourceTypeOffset); - } - - void SetEditingPlayer(APlayerState* NewEditingPlayer) // actually AFortPlayerStateZone - { - if (// AActor::HasAuthority() && - (!GetEditingPlayer() || !NewEditingPlayer) - ) - { - SetNetDormancy((ENetDormancy)(2 - (NewEditingPlayer != 0))); - // they do something here - GetEditingPlayer() = NewEditingPlayer; - } - } - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingStructuralSupportSystem.cpp b/dependencies/reboot/Project Reboot 3.0/BuildingStructuralSupportSystem.cpp deleted file mode 100644 index 9d8baef..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingStructuralSupportSystem.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "BuildingStructuralSupportSystem.h" - -#include "reboot.h" - -bool UBuildingStructuralSupportSystem::IsWorldLocValid(const FVector& WorldLoc) -{ - static auto IsWorldLocValidFn = FindObject("/Script/FortniteGame.BuildingStructuralSupportSystem.IsWorldLocValid"); - - if (!IsWorldLocValidFn) - return true; - - struct { FVector WorldLoc; bool Ret; } Params{ WorldLoc }; - - this->ProcessEvent(IsWorldLocValidFn, &Params); - - return Params.Ret; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingStructuralSupportSystem.h b/dependencies/reboot/Project Reboot 3.0/BuildingStructuralSupportSystem.h deleted file mode 100644 index 54f10c2..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingStructuralSupportSystem.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "Object.h" -#include "Vector.h" - -class UBuildingStructuralSupportSystem : public UObject -{ -public: - bool IsWorldLocValid(const FVector& WorldLoc); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingTrap.cpp b/dependencies/reboot/Project Reboot 3.0/BuildingTrap.cpp deleted file mode 100644 index 8a8fbf0..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingTrap.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "BuildingTrap.h" - -#include "GameplayStatics.h" -#include "FortPlayerStateAthena.h" diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingTrap.h b/dependencies/reboot/Project Reboot 3.0/BuildingTrap.h deleted file mode 100644 index f630f94..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingTrap.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "BuildingSMActor.h" - -class ABuildingTrap : public ABuildingSMActor -{ -public: - -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingWeapons.cpp b/dependencies/reboot/Project Reboot 3.0/BuildingWeapons.cpp deleted file mode 100644 index 2c86a43..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingWeapons.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "BuildingWeapons.h" - -#include "reboot.h" - -void AFortWeap_EditingTool::OnRep_EditActor() -{ - static auto OnRep_EditActorFn = FindObject("/Script/FortniteGame.FortWeap_EditingTool.OnRep_EditActor"); - this->ProcessEvent(OnRep_EditActorFn); -} - -UClass* AFortWeap_EditingTool::StaticClass() -{ - static auto Class = FindObject(L"/Script/FortniteGame.FortWeap_EditingTool"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/BuildingWeapons.h b/dependencies/reboot/Project Reboot 3.0/BuildingWeapons.h deleted file mode 100644 index c8d5473..0000000 --- a/dependencies/reboot/Project Reboot 3.0/BuildingWeapons.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "BuildingSMActor.h" -#include "FortWeapon.h" - -class AFortWeap_BuildingToolBase : public AFortWeapon -{ -}; - -class AFortWeap_BuildingTool : public AFortWeap_BuildingToolBase -{ -}; - -class AFortWeap_EditingTool : public AFortWeap_BuildingToolBase -{ -public: - ABuildingSMActor*& GetEditActor() - { - static auto EditActorOffset = GetOffset("EditActor"); - return Get(EditActorOffset); - } - - void OnRep_EditActor(); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Channel.h b/dependencies/reboot/Project Reboot 3.0/Channel.h deleted file mode 100644 index f110fd8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Channel.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "Object.h" - -class UChannel : public UObject -{ -public: - void StartBecomingDormant() - { - void (*StartBecomingDormantOriginal)(UChannel* Channel) = decltype(StartBecomingDormantOriginal)(this->VFTable[0x298 / 8]); - StartBecomingDormantOriginal(this); - } - - bool IsPendingDormancy() - { - static auto BitfieldOffset = GetOffset("Connection") + 8; - return ((PlaceholderBitfield*)(__int64(this) + BitfieldOffset))->Seventh; - } - - bool IsDormant() - { - static auto BitfieldOffset = GetOffset("Connection") + 8; - return ((PlaceholderBitfield*)(__int64(this) + BitfieldOffset))->Third; - } - - int32 IsNetReady(bool Saturate); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/CheatManager.cpp b/dependencies/reboot/Project Reboot 3.0/CheatManager.cpp deleted file mode 100644 index 70d51e3..0000000 --- a/dependencies/reboot/Project Reboot 3.0/CheatManager.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "CheatManager.h" - -#include "reboot.h" - -void UCheatManager::Teleport() -{ - static auto TeleportFn = FindObject(L"/Script/Engine.CheatManager.Teleport"); - this->ProcessEvent(TeleportFn); -} - -void UCheatManager::DestroyTarget() -{ - static auto DestroyTargetFn = FindObject("/Script/Engine.CheatManager.DestroyTarget"); - this->ProcessEvent(DestroyTargetFn); -} - -UClass* UCheatManager::StaticClass() -{ - static auto Class = FindObject(L"/Script/Engine.CheatManager"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/CheatManager.h b/dependencies/reboot/Project Reboot 3.0/CheatManager.h deleted file mode 100644 index f1ee34b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/CheatManager.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "Object.h" - -class UCheatManager : public UObject -{ -public: - void Teleport(); - void DestroyTarget(); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Class.cpp b/dependencies/reboot/Project Reboot 3.0/Class.cpp deleted file mode 100644 index c2dfa29..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Class.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include "Class.h" -#include "reboot.h" - -UObject* UClass::CreateDefaultObject() -{ - static std::unordered_map defaultAbilities; // normal class name, default ability. - - static int LastNum1 = 151; - - if (LastNum1 != Globals::AmountOfListens) - { - LastNum1 = Globals::AmountOfListens; - defaultAbilities.clear(); - } - - auto name = this->GetFullName(); - - if (name.contains("Default__")) - return this; - - auto defaultafqaf = defaultAbilities.find(name); - - UObject* DefaultObject = nullptr; - - if (defaultafqaf != defaultAbilities.end()) - { - DefaultObject = defaultafqaf->second; - } - else - { - // skunked class to default - auto ending = name.substr(name.find_last_of(".") + 1); - auto path = name.substr(0, name.find_last_of(".") + 1); - - path = path.substr(path.find_first_of(" ") + 1); - - auto DefaultAbilityName = std::format("{0}Default__{1}", path, ending); - - // std::cout << "DefaultAbilityName: " << DefaultAbilityName << '\n'; - - DefaultObject = FindObject(DefaultAbilityName); - defaultAbilities.emplace(name, DefaultObject); - } - - return DefaultObject; -} - -int UStruct::GetPropertiesSize() -{ - return *(int*)(__int64(this) + Offsets::PropertiesSize); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Class.h b/dependencies/reboot/Project Reboot 3.0/Class.h deleted file mode 100644 index 2b7b4cb..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Class.h +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include "Object.h" - -#include "addresses.h" -#include "UnrealString.h" -#include "Map.h" - -struct UField : UObject -{ - UField* Next; - // void* pad; void* pad2; -}; - -struct UFieldPadding : UObject -{ - UField* Next; - void* pad; void* pad2; -}; - -template -static inline PropertyType* GetNext(void* Field) -{ - return Fortnite_Version >= 12.10 ? *(PropertyType**)(__int64(Field) + 0x20) : ((UField*)Field)->Next; -} - -static inline FName* GetFNameOfProp(void* Property) -{ - FName* NamePrivate = nullptr; - - if (Fortnite_Version >= 12.10) - NamePrivate = (FName*)(__int64(Property) + 0x28); - else - NamePrivate = &((UField*)Property)->NamePrivate; - - return NamePrivate; -} - -class UStruct : public UField -{ -public: - int GetPropertiesSize(); - - UStruct* GetSuperStruct() { return *(UStruct**)(__int64(this) + Offsets::SuperStruct); } // idk if this is in UStruct - - TArray GetScript() { return *(TArray*)(__int64(this) + Offsets::Script); } -}; - -class UClass : public UStruct -{ -public: - UObject* CreateDefaultObject(); -}; - -class UFunction : public UStruct -{ -public: - void*& GetFunc() { return *(void**)(__int64(this) + Offsets::Func); } -}; - -class UEnum : public UField -{ -public: - int64 GetValue(const std::string& EnumMemberName) - { - auto Names = (TArray>*)(__int64(this) + sizeof(UField) + sizeof(FString)); - - for (int i = 0; i < Names->Num(); ++i) - { - auto& Pair = Names->At(i); - auto& Name = Pair.Key(); - auto Value = Pair.Value(); - - if (Name.ComparisonIndex.Value) - { - auto nameStr = Name.ToString(); - - if (nameStr.contains(EnumMemberName)) - return Value; - } - } - - return -1; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ContainerAllocationPolicies.h b/dependencies/reboot/Project Reboot 3.0/ContainerAllocationPolicies.h deleted file mode 100644 index 589d42f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ContainerAllocationPolicies.h +++ /dev/null @@ -1,117 +0,0 @@ -#pragma once - -#include "NumericLimits.h" - -template -class TInlineAllocator -{ -private: - template - struct alignas(Alignment) TAlignedBytes - { - unsigned char Pad[Size]; - }; - - template - struct TTypeCompatibleBytes : public TAlignedBytes - { - }; - -public: - template - class ForElementType - { - friend class TBitArray; - - private: - TTypeCompatibleBytes InlineData[NumElements]; - - ElementType* SecondaryData; - - public: - - FORCEINLINE int32 NumInlineBytes() const - { - return sizeof(ElementType) * NumElements; - } - FORCEINLINE int32 NumInlineBits() const - { - return NumInlineBytes() * 8; - } - - FORCEINLINE ElementType& operator[](int32 Index) - { - return *(ElementType*)(&InlineData[Index]); - } - FORCEINLINE const ElementType& operator[](int32 Index) const - { - return *(ElementType*)(&InlineData[Index]); - } - - FORCEINLINE void operator=(void* InElements) - { - SecondaryData = InElements; - } - - FORCEINLINE ElementType& GetInlineElement(int32 Index) - { - return *(ElementType*)(&InlineData[Index]); - } - FORCEINLINE const ElementType& GetInlineElement(int32 Index) const - { - return *(ElementType*)(&InlineData[Index]); - } - FORCEINLINE ElementType& GetSecondaryElement(int32 Index) - { - return SecondaryData[Index]; - } - FORCEINLINE const ElementType& GetSecondaryElement(int32 Index) const - { - return SecondaryData[Index]; - } - ElementType* GetInlineElements() const - { - return (ElementType*)InlineData; - } - FORCEINLINE ElementType* GetAllocation() const - { - return IfAThenAElseB(SecondaryData, GetInlineElements()); - } - }; -}; - - -FORCEINLINE /*FMEMORY_INLINE_FUNCTION_DECORATOR*/ size_t /*FMemory::*/QuantizeSize(SIZE_T Count, uint32 Alignment) -{ - return Count; - /* - if (!FMEMORY_INLINE_GMalloc) - { - return Count; - } - return FMEMORY_INLINE_GMalloc->QuantizeSize(Count, Alignment); */ -} - -enum -{ - DEFAULT_ALIGNMENT = 0 -}; - -template -FORCEINLINE SizeType DefaultCalculateSlackReserve(SizeType NumElements, SIZE_T BytesPerElement, bool bAllowQuantize, uint32 Alignment = DEFAULT_ALIGNMENT) -{ - SizeType Retval = NumElements; - // checkSlow(NumElements > 0); - if (bAllowQuantize) - { - auto Count = SIZE_T(Retval) * SIZE_T(BytesPerElement); - Retval = (SizeType)(QuantizeSize(Count, Alignment) / BytesPerElement); - // NumElements and MaxElements are stored in 32 bit signed integers so we must be careful not to overflow here. - if (NumElements > Retval) - { - Retval = TNumericLimits::Max(); - } - } - - return Retval; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Controller.cpp b/dependencies/reboot/Project Reboot 3.0/Controller.cpp deleted file mode 100644 index 7eedeab..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Controller.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "Controller.h" - -#include "reboot.h" - -AActor* AController::GetViewTarget() -{ - static auto GetViewTargetFn = FindObject("/Script/Engine.Controller.GetViewTarget"); - AActor* ViewTarget = nullptr; - this->ProcessEvent(GetViewTargetFn, &ViewTarget); - return ViewTarget; -} - -void AController::Possess(class APawn* Pawn) -{ - auto PossessFn = FindFunction("Possess"); - this->ProcessEvent(PossessFn, &Pawn); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Controller.h b/dependencies/reboot/Project Reboot 3.0/Controller.h deleted file mode 100644 index 52a1422..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Controller.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "Actor.h" - -class AController : public AActor -{ -public: - AActor* GetViewTarget(); - void Possess(class APawn* Pawn); - - FName& GetStateName() - { - static auto StateNameOffset = GetOffset("StateName"); - return Get(StateNameOffset); - } - - class APawn*& GetPawn() - { - static auto PawnOffset = this->GetOffset("Pawn"); - return this->Get(PawnOffset); - } - - class APlayerState*& GetPlayerState() - { - static auto PlayerStateOffset = this->GetOffset("PlayerState"); - return this->Get(PlayerStateOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/CurveTable.h b/dependencies/reboot/Project Reboot 3.0/CurveTable.h deleted file mode 100644 index ecba384..0000000 --- a/dependencies/reboot/Project Reboot 3.0/CurveTable.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - -#include "Object.h" -#include "NameTypes.h" - -#include "reboot.h" -#include "DataTable.h" - -enum class ECurveTableMode : unsigned char -{ - Empty, - SimpleCurves, - RichCurves -}; - -struct FSimpleCurveKey -{ - float Time; // 0x0000(0x0004) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float Value; // 0x0004(0x0004) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) -}; - -struct FIndexedCurve -{ - -}; - -struct FRealCurve : public FIndexedCurve -{ -}; - -struct FSimpleCurve : public FRealCurve -{ - TArray& GetKeys() - { - static auto KeysOffset = FindOffsetStruct("/Script/Engine.SimpleCurve", "Keys"); - return *(TArray*)(__int64(this) + KeysOffset); - } -}; - -class UCurveTable : public UObject -{ -public: - static int GetCurveTableSize() - { - static auto CurveTableClass = FindObject("/Script/Engine.CurveTable"); - return CurveTableClass->GetPropertiesSize(); - } - - ECurveTableMode GetCurveTableMode() const - { - static auto CurveTableModeOffset = GetCurveTableSize() - 8; - return *(ECurveTableMode*)(__int64(this) + CurveTableModeOffset); - } - - void* GetKey(const FName& RowName, int Index) - { - auto CurveTableMode = GetCurveTableMode(); - - // LOG_INFO(LogDev, "RowName {} CurveTableMode {} Size {}", RowName.ComparisonIndex.Value ? RowName.ToString() : "InvalidComparision", (int)CurveTableMode, GetCurveTableSize()); - - if (CurveTableMode == ECurveTableMode::SimpleCurves) - { - auto& RowMap = ((UDataTable*)this)->GetRowMap(); // its the same offset so - auto Curve = RowMap.Find(RowName); - auto& Keys = Curve->GetKeys(); - return Keys.Num() > Index ? &Curve->GetKeys().at(Index) : nullptr; - } - else if (CurveTableMode == ECurveTableMode::RichCurves) - { - LOG_INFO(LogDev, "RICHCURVE UNIMPLEMENTED!"); - } - - return nullptr; - } - - float GetValueOfKey(void* Key) - { - if (!Key) - return 0.f; - - auto CurveTableMode = GetCurveTableMode(); - - if (CurveTableMode == ECurveTableMode::SimpleCurves) return ((FSimpleCurveKey*)Key)->Value; - else if (CurveTableMode == ECurveTableMode::RichCurves) return 0.f; - - return 0.f; - } -}; - -struct FCurveTableRowHandle -{ - UCurveTable* CurveTable; - FName RowName; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/DataChannel.cpp b/dependencies/reboot/Project Reboot 3.0/DataChannel.cpp deleted file mode 100644 index 0502104..0000000 --- a/dependencies/reboot/Project Reboot 3.0/DataChannel.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "Channel.h" -#include "NetConnection.h" - -int32 UChannel::IsNetReady(bool Saturate) -{ - static auto NumOutRecOffset = 0x4C; - - if (*(int*)(__int64(this) + NumOutRecOffset) < 255) - { - static auto ConnectionOffset = GetOffset("Connection"); - auto Connection = Get(ConnectionOffset); - return Connection->IsNetReady(Saturate); - } - - return 0; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/DataTable.h b/dependencies/reboot/Project Reboot 3.0/DataTable.h deleted file mode 100644 index 06007e5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/DataTable.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "Object.h" -#include "reboot.h" - -#include "Map.h" - -struct FTableRowBase -{ - unsigned char UnknownData00[0x8]; // this is actually structural padding -}; - -class UDataTable : public UObject -{ -public: - template - TMap& GetRowMap() - { - static auto RowStructOffset = FindOffsetStruct("/Script/Engine.DataTable", "RowStruct"); - - return *(TMap*)(__int64(this) + (RowStructOffset + sizeof(UObject*))); // because after rowstruct is rowmap - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/Engine.DataTable"); - return Class; - } -}; - -struct FDataTableRowHandle -{ - UDataTable* DataTable; // 0x0000(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName RowName; // 0x0008(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) -}; - -template -struct RowNameAndRowData -{ - FName RowName; - StructType* RowData; -}; - -struct FDataTableCategoryHandle -{ - UDataTable* DataTable; // 0x0000(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName ColumnName; // 0x0008(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName RowContents; // 0x0010(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) -}; diff --git a/dependencies/reboot/Project Reboot 3.0/DataTableFunctionLibrary.cpp b/dependencies/reboot/Project Reboot 3.0/DataTableFunctionLibrary.cpp deleted file mode 100644 index c73bc62..0000000 --- a/dependencies/reboot/Project Reboot 3.0/DataTableFunctionLibrary.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "DataTableFunctionLibrary.h" - -#include "reboot.h" - -float UDataTableFunctionLibrary::EvaluateCurveTableRow(UCurveTable* CurveTable, FName RowName, float InXY, - const FString& ContextString, EEvaluateCurveTableResult* OutResult) -{ - static auto fn = FindObject(L"/Script/Engine.DataTableFunctionLibrary.EvaluateCurveTableRow"); - - float wtf{}; - EEvaluateCurveTableResult wtf1{}; - - struct { UCurveTable* CurveTable; FName RowName; float InXY; EEvaluateCurveTableResult OutResult; float OutXY; FString ContextString; } - UDataTableFunctionLibrary_EvaluateCurveTableRow_Params{CurveTable, RowName, InXY, wtf1, wtf, ContextString}; - - static auto DefaultClass = StaticClass(); - DefaultClass->ProcessEvent(fn, &UDataTableFunctionLibrary_EvaluateCurveTableRow_Params); - - if (OutResult) - *OutResult = UDataTableFunctionLibrary_EvaluateCurveTableRow_Params.OutResult; - - return UDataTableFunctionLibrary_EvaluateCurveTableRow_Params.OutXY; -} - -UClass* UDataTableFunctionLibrary::StaticClass() -{ - static auto Class = FindObject(L"/Script/Engine.DataTableFunctionLibrary"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/DataTableFunctionLibrary.h b/dependencies/reboot/Project Reboot 3.0/DataTableFunctionLibrary.h deleted file mode 100644 index a6d11c1..0000000 --- a/dependencies/reboot/Project Reboot 3.0/DataTableFunctionLibrary.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "Object.h" -#include "CurveTable.h" -#include "UnrealString.h" - -enum class EEvaluateCurveTableResult : uint8_t -{ - RowFound = 0, - RowNotFound = 1, - EEvaluateCurveTableResult_MAX = 2 -}; - -class UDataTableFunctionLibrary : public UObject -{ -public: - static float EvaluateCurveTableRow(UCurveTable* CurveTable, FName RowName, float InXY, - const FString& ContextString = FString(), EEvaluateCurveTableResult* OutResult = nullptr); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Decay.h b/dependencies/reboot/Project Reboot 3.0/Decay.h deleted file mode 100644 index 8818a3c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Decay.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "inc.h" - -#include "RemoveReference.h" -#include "RemoveCV.h" - -namespace UE4Decay_Private -{ - template - struct TDecayNonReference - { - typedef typename TRemoveCV::Type Type; - }; - - template - struct TDecayNonReference - { - typedef T* Type; - }; - - template - struct TDecayNonReference - { - typedef T* Type; - }; - - template - struct TDecayNonReference - { - typedef RetType(*Type)(Params...); - }; -} - -template -struct TDecay -{ - typedef typename UE4Decay_Private::TDecayNonReference::Type>::Type Type; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Delegate.h b/dependencies/reboot/Project Reboot 3.0/Delegate.h deleted file mode 100644 index 525577a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Delegate.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "DelegateBase.h" -#include "DelegateSignatureImpl.inl" - -#define FUNC_CONCAT( ... ) __VA_ARGS__ - -#define FUNC_DECLARE_DELEGATE( DelegateName, ReturnType, ... ) \ - typedef TBaseDelegate/*<__VA_ARGS__>*/ DelegateName; - -#define FUNC_DECLARE_DYNAMIC_DELEGATE( TWeakPtr, DynamicDelegateName, ExecFunction, FuncParamList, FuncParamPassThru, ... ) \ - class DynamicDelegateName : public TBaseDynamicDelegate \ - { \ - public: \ - DynamicDelegateName() \ - { \ - } \ - \ - }; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/DelegateBase.h b/dependencies/reboot/Project Reboot 3.0/DelegateBase.h deleted file mode 100644 index f657f0e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/DelegateBase.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "inc.h" - -#include "TypeCompatibleBytes.h" -#include "ContainerAllocationPolicies.h" - -#if !defined(_WIN32) || defined(_WIN64) -// Let delegates store up to 32 bytes which are 16-byte aligned before we heap allocate -typedef TAlignedBytes<16, 16> FAlignedInlineDelegateType; -#if USE_SMALL_DELEGATES -typedef FHeapAllocator FDelegateAllocatorType; -#else -typedef TInlineAllocator<2> FDelegateAllocatorType; -#endif -#else -// ... except on Win32, because we can't pass 16-byte aligned types by value, as some delegates are -// so we'll just keep it heap-allocated, which are always sufficiently aligned. -typedef TAlignedBytes<16, 8> FAlignedInlineDelegateType; -typedef FHeapAllocator FDelegateAllocatorType; -#endif - -class FDelegateBase -{ -public: - FDelegateAllocatorType::ForElementType DelegateAllocator; - int32 DelegateSize; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/DelegateCombinations.h b/dependencies/reboot/Project Reboot 3.0/DelegateCombinations.h deleted file mode 100644 index 4a28bbe..0000000 --- a/dependencies/reboot/Project Reboot 3.0/DelegateCombinations.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "Delegate.h" -#include "ObjectMacros.h" - -#define DECLARE_DELEGATE( DelegateName ) FUNC_DECLARE_DELEGATE( DelegateName, void ) -#define DECLARE_DYNAMIC_DELEGATE( DelegateName ) /* BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_DELEGATE) */ FUNC_DECLARE_DYNAMIC_DELEGATE( FWeakObjectPtr, DelegateName, DelegateName##_DelegateWrapper, , FUNC_CONCAT( *this ), void ) diff --git a/dependencies/reboot/Project Reboot 3.0/DelegateInstanceInterface.h b/dependencies/reboot/Project Reboot 3.0/DelegateInstanceInterface.h deleted file mode 100644 index a9c7f29..0000000 --- a/dependencies/reboot/Project Reboot 3.0/DelegateInstanceInterface.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -template -struct TMemFunPtrType; - -template -struct TMemFunPtrType -{ - typedef RetType(Class::* Type)(ArgTypes...); -}; - -template -struct TMemFunPtrType -{ - typedef RetType(Class::* Type)(ArgTypes...) const; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/DelegateSignatureImpl.inl b/dependencies/reboot/Project Reboot 3.0/DelegateSignatureImpl.inl deleted file mode 100644 index f04ec82..0000000 --- a/dependencies/reboot/Project Reboot 3.0/DelegateSignatureImpl.inl +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include "DelegateBase.h" -#include "ScriptDelegates.h" - -#include "DelegateInstanceInterface.h" -#include "RemoveReference.h" -#include "TypeWrapper.h" - -// template // (Milxnor) IDK IM SCUFFED -class TBaseDelegate : public FDelegateBase -{ -public: - // (Milxnor) YEAH NO - - /* - typedef typename TUnwrapType::Type RetValType; - - template - FUNCTION_CHECK_RETURN_START - inline static TBaseDelegate CreateRaw(UserClass* InUserObject, typename TMemFunPtrType::Type InFunc, VarTypes... Vars) - FUNCTION_CHECK_RETURN_END - { - // UE_STATIC_DEPRECATE(4.23, TIsConst::Value, "Binding a delegate with a const object pointer and non-const function is deprecated."); - - TBaseDelegate Result; - TBaseRawMethodDelegateInstance::Create(Result, InUserObject, InFunc, Vars...); - return Result; - } - template - FUNCTION_CHECK_RETURN_START - inline static TBaseDelegate CreateRaw(UserClass* InUserObject, typename TMemFunPtrType::Type InFunc, VarTypes... Vars) - FUNCTION_CHECK_RETURN_END - { - TBaseDelegate Result; - TBaseRawMethodDelegateInstance::Create(Result, InUserObject, InFunc, Vars...); - return Result; - } - - - template - inline void BindRaw(UserClass* InUserObject, typename TMemFunPtrType::Type InFunc, VarTypes... Vars) - { - // UE_STATIC_DEPRECATE(4.23, TIsConst::Value, "Binding a delegate with a const object pointer and non-const function is deprecated."); - - *this = CreateRaw(const_cast::Type*>(InUserObject), InFunc, Vars...); - } - template - inline void BindRaw(UserClass* InUserObject, typename TMemFunPtrType::Type InFunc, VarTypes... Vars) - { - *this = CreateRaw(InUserObject, InFunc, Vars...); - } */ -}; - -template -class TBaseDynamicDelegate : public TScriptDelegate -{ -public: - /** - * Default constructor - */ - TBaseDynamicDelegate() { } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/EnableIf.h b/dependencies/reboot/Project Reboot 3.0/EnableIf.h deleted file mode 100644 index 7159504..0000000 --- a/dependencies/reboot/Project Reboot 3.0/EnableIf.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -template -class TEnableIf; - -template -class TEnableIf -{ -public: - typedef Result Type; -}; - -template -class TEnableIf -{ }; diff --git a/dependencies/reboot/Project Reboot 3.0/Engine.h b/dependencies/reboot/Project Reboot 3.0/Engine.h deleted file mode 100644 index 361088b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Engine.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "World.h" -#include "NetDriver.h" - -#include "UnrealString.h" - -class UEngine : public UObject -{ -public: - static inline UNetDriver* (*Engine_CreateNetDriver)(UEngine* Engine, UWorld* InWorld, FName NetDriverDefinition); - - UNetDriver* CreateNetDriver(UWorld* InWorld, FName NetDriverDefinition) { return Engine_CreateNetDriver(this, InWorld, NetDriverDefinition); } -}; - -// static inline bool (*CreateNamedNetDriver)(UWorld* InWorld, FName NetDriverName, FName NetDriverDefinition); -// static inline UNetDriver* CreateNetDriver_Local(UEngine* Engine, FWorldContext& Context, FName NetDriverDefinition) \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/EngineTypes.cpp b/dependencies/reboot/Project Reboot 3.0/EngineTypes.cpp deleted file mode 100644 index 10ac534..0000000 --- a/dependencies/reboot/Project Reboot 3.0/EngineTypes.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "EngineTypes.h" - -#include "reboot.h" - -UStruct* FHitResult::GetStruct() -{ - static auto Struct = FindObject("/Script/Engine.HitResult"); - return Struct; -} - -int FHitResult::GetStructSize() -{ - return GetStruct()->GetPropertiesSize(); -} - -bool FHitResult::IsBlockingHit() -{ - // return true; - static auto bBlockingHitOffset = FindOffsetStruct("/Script/Engine.HitResult", "bBlockingHit"); - static auto bBlockingHitFieldMask = GetFieldMask(FindPropertyStruct("/Script/Engine.HitResult", "bBlockingHit")); - return ReadBitfield((PlaceholderBitfield*)(__int64(this) + bBlockingHitOffset), bBlockingHitFieldMask); -} - -FVector& FHitResult::GetLocation() -{ - static auto LocationOffset = FindOffsetStruct("/Script/Engine.HitResult", "Location"); - return *(FVector*)(__int64(this) + LocationOffset); -} - -void FHitResult::CopyFromHitResult(FHitResult* Other) -{ - this->GetLocation() = Other->GetLocation(); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/EngineTypes.h b/dependencies/reboot/Project Reboot 3.0/EngineTypes.h deleted file mode 100644 index 620a44f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/EngineTypes.h +++ /dev/null @@ -1,95 +0,0 @@ -#pragma once - -#include "Object.h" -#include "Vector.h" - -#include "DelegateCombinations.h" - -enum class ESpawnActorCollisionHandlingMethod : uint8 -{ - Undefined, - AlwaysSpawn, - AdjustIfPossibleButAlwaysSpawn, - AdjustIfPossibleButDontSpawnIfColliding, - DontSpawnIfColliding -}; - -struct FHitResult -{ - static class UStruct* GetStruct(); - static int GetStructSize(); - - bool IsBlockingHit(); - FVector& GetLocation(); - void CopyFromHitResult(FHitResult* Other); -}; - -struct FTimerHandle -{ - FTimerHandle() - : Handle(0) - { - } - - /** True if this handle was ever initialized by the timer manager */ - bool IsValid() const - { - return Handle != 0; - } - - /** Explicitly clear handle */ - void Invalidate() - { - Handle = 0; - } - - bool operator==(const FTimerHandle& Other) const - { - return Handle == Other.Handle; - } - - bool operator!=(const FTimerHandle& Other) const - { - return Handle != Other.Handle; - } - - /* FString ToString() const - { - return FString::Printf(TEXT("%llu"), Handle); - } */ - -// private: - static const uint32 IndexBits = 24; - static const uint32 SerialNumberBits = 40; - - static_assert(IndexBits + SerialNumberBits == 64, "The space for the timer index and serial number should total 64 bits"); - - static const int32 MaxIndex = (int32)1 << IndexBits; - static const uint64 MaxSerialNumber = (uint64)1 << SerialNumberBits; - - void SetIndexAndSerialNumber(int32 Index, uint64 SerialNumber) - { - // check(Index >= 0 && Index < MaxIndex); - // check(SerialNumber < MaxSerialNumber); - Handle = (SerialNumber << IndexBits) | (uint64)(uint32)Index; - } - - FORCEINLINE int32 GetIndex() const - { - return (int32)(Handle & (uint64)(MaxIndex - 1)); - } - - FORCEINLINE uint64 GetSerialNumber() const - { - return Handle >> IndexBits; - } - - uint64 Handle; - - /* friend uint32 GetTypeHash(const FTimerHandle& InHandle) - { - return GetTypeHash(InHandle.Handle); - } */ -}; - -DECLARE_DYNAMIC_DELEGATE(FTimerDynamicDelegate); \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/EnvQuery.h b/dependencies/reboot/Project Reboot 3.0/EnvQuery.h deleted file mode 100644 index cce6e3f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/EnvQuery.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "Object.h" - -class UEnvQuery : public UObject // UDataAsset -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/EnvQueryTypes.h b/dependencies/reboot/Project Reboot 3.0/EnvQueryTypes.h deleted file mode 100644 index 65972d1..0000000 --- a/dependencies/reboot/Project Reboot 3.0/EnvQueryTypes.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "NameTypes.h" - -enum class EAIParamType : uint8 -{ - Float, - Int, - Bool - // MAX UMETA(Hidden) -}; - -struct FEnvNamedValue // i dont thin kthis ever changes -{ - FName ParamName; - EAIParamType ParamType; - float Value; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ExpressionParserTypes.inl b/dependencies/reboot/Project Reboot 3.0/ExpressionParserTypes.inl deleted file mode 100644 index 7b9637e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ExpressionParserTypes.inl +++ /dev/null @@ -1 +0,0 @@ -#pragma once \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAIEncounterInfo.h b/dependencies/reboot/Project Reboot 3.0/FortAIEncounterInfo.h deleted file mode 100644 index f304569..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAIEncounterInfo.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include "Actor.h" -#include "EnvQuery.h" -#include "reboot.h" -#include "EnvQueryTypes.h" - -struct FEncounterEnvironmentQueryInfo // idk what file this actually goes in or if this struct ever actaully changes -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.EncounterEnvironmentQueryInfo"); - return Struct; - } - - static int GetPropertiesSize() { return GetStruct()->GetPropertiesSize(); } - - UEnvQuery*& GetEnvironmentQuery() - { - static auto EnvironmentQueryOffset = FindOffsetStruct("/Script/FortniteGame.EncounterEnvironmentQueryInfo", "EnvironmentQuery"); - return *(UEnvQuery**)(__int64(this) + EnvironmentQueryOffset); - } - - TArray& GetQueryParams() - { - static auto QueryParamsOffset = FindOffsetStruct("/Script/FortniteGame.EncounterEnvironmentQueryInfo", "QueryParams"); - return *(TArray*)(__int64(this) + QueryParamsOffset); - } - - bool& IsDirectional() - { - static auto bIsDirectionalOffset = FindOffsetStruct("/Script/FortniteGame.EncounterEnvironmentQueryInfo", "bIsDirectional"); - return *(bool*)(__int64(this) + bIsDirectionalOffset); - } -}; - -class UFortAIEncounterInfo : public UObject -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAbilitySet.h b/dependencies/reboot/Project Reboot 3.0/FortAbilitySet.h deleted file mode 100644 index 5a4a7b5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAbilitySet.h +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#include "AbilitySystemComponent.h" -#include "reboot.h" -#include "SoftObjectPtr.h" - -struct FGameplayEffectApplicationInfoHard -{ -public: - static UStruct* GetStruct() - { - static auto GameplayEffectApplicationInfoHardStruct = FindObject("/Script/FortniteGame.GameplayEffectApplicationInfoHard"); - return GameplayEffectApplicationInfoHardStruct; - } - - static int GetStructSize() - { - return GetStruct()->GetPropertiesSize(); - } - - UClass* GameplayEffect; // 0x0(0x8)(Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float Level; -}; - -struct FGameplayEffectApplicationInfo -{ - TSoftObjectPtr GameplayEffect; // 0x0000(0x0028) UNKNOWN PROPERTY: SoftClassProperty FortniteGame.GameplayEffectApplicationInfo.GameplayEffect - float Level; // 0x0028(0x0004) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - unsigned char UnknownData01[0x4]; // 0x002C(0x0004) MISSED OFFSET -}; - -class UFortAbilitySet : public UObject -{ -public: - TArray* GetGameplayAbilities() - { - static auto GameplayAbilitiesOffset = this->GetOffset("GameplayAbilities"); - return this->GetPtr>(GameplayAbilitiesOffset); - } - - TArray* GetGrantedGameplayEffects() - { - static auto GrantedGameplayEffectsOffset = this->GetOffset("GrantedGameplayEffects", false); - - if (GrantedGameplayEffectsOffset == -1) - return nullptr; - - return this->GetPtr>(GrantedGameplayEffectsOffset); - } - - void ApplyGrantedGameplayAffectsToAbilitySystem(UAbilitySystemComponent* AbilitySystemComponent) // i dont think this is proper - { - if (!FGameplayEffectApplicationInfoHard::GetStruct()) - return; - - auto GrantedGameplayEffects = GetGrantedGameplayEffects(); - - for (int i = 0; i < GrantedGameplayEffects->Num(); i++) - { - auto& EffectToGrant = GrantedGameplayEffects->at(i, FGameplayEffectApplicationInfoHard::GetStructSize()); - - if (!EffectToGrant.GameplayEffect) - { - continue; - } - - LOG_INFO(LogDev, "Giving GameplayEffect {}", EffectToGrant.GameplayEffect->GetFullName()); - - // UObject* GameplayEffect = EffectToGrant.GameplayEffect->CreateDefaultObject(); - FGameplayEffectContextHandle EffectContext{}; // AbilitySystemComponent->MakeEffectContext() - AbilitySystemComponent->ApplyGameplayEffectToSelf(EffectToGrant.GameplayEffect, EffectToGrant.Level, EffectContext); - } - } - - void GiveToAbilitySystem(UAbilitySystemComponent* AbilitySystemComponent, UObject* SourceObject = nullptr) - { - auto GameplayAbilities = GetGameplayAbilities(); - - for (int i = 0; i < GameplayAbilities->Num(); i++) - { - UClass* AbilityClass = GameplayAbilities->At(i); - - if (!AbilityClass) - continue; - - // LOG_INFO(LogDev, "Giving AbilityClass {}", AbilityClass->GetFullName()); - - AbilitySystemComponent->GiveAbilityEasy(AbilityClass, SourceObject); - } - - ApplyGrantedGameplayAffectsToAbilitySystem(AbilitySystemComponent); - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAbilitySet"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaAIBotCharacterCustomization.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaAIBotCharacterCustomization.h deleted file mode 100644 index ec0e04a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaAIBotCharacterCustomization.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "Object.h" - -class UFortAthenaAIBotCharacterCustomization : public UObject -{ -public: - FFortAthenaLoadout* GetCustomizationLoadout() - { - static auto CustomizationLoadoutOffset = GetOffset("CustomizationLoadout"); - return GetPtr(CustomizationLoadoutOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaAIBotCustomizationData.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaAIBotCustomizationData.h deleted file mode 100644 index ae2ac00..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaAIBotCustomizationData.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include "reboot.h" -#include "FortAthenaAIBotCharacterCustomization.h" - -class UFortAthenaAIBotCustomizationData : public UObject // UPrimaryDataAsset -{ -public: - UFortAthenaAIBotCharacterCustomization*& GetCharacterCustomization() - { - static auto CharacterCustomizationOffset = GetOffset("CharacterCustomization"); - return Get(CharacterCustomizationOffset); - } - - static void ApplyOverrideCharacterCustomizationHook(UFortAthenaAIBotCustomizationData* InBotData, AFortPlayerPawn* NewBot, __int64 idk) - { - LOG_INFO(LogDev, "ApplyOverrideCharacterCustomizationHook!"); - - auto CharacterCustomization = InBotData->GetCharacterCustomization(); - - auto Controller = NewBot->GetController(); - - LOG_INFO(LogDev, "Controller: {}", Controller->IsValidLowLevel() ? Controller->GetPathName() : "BadRead"); - - static auto CosmeticLoadoutBCOffset = Controller->GetOffset("CosmeticLoadoutBC"); - Controller->GetPtr(CosmeticLoadoutBCOffset)->GetCharacter() = CharacterCustomization->GetCustomizationLoadout()->GetCharacter(); - - auto PlayerStateAsFort = Cast(Controller->GetPlayerState()); - - static auto UpdatePlayerCustomCharacterPartsVisualizationFn = FindObject(L"/Script/FortniteGame.FortKismetLibrary.UpdatePlayerCustomCharacterPartsVisualization"); - PlayerStateAsFort->ProcessEvent(UpdatePlayerCustomCharacterPartsVisualizationFn, &PlayerStateAsFort); - - PlayerStateAsFort->ForceNetUpdate(); - NewBot->ForceNetUpdate(); - Controller->ForceNetUpdate(); - - // NewBot->GetCosmeticLoadout()->GetCharacter() = CharacterCustomization->GetCustomizationLoadout()->GetCharacter(); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortAthenaAIBotCustomizationData"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaCreativePortal.cpp b/dependencies/reboot/Project Reboot 3.0/FortAthenaCreativePortal.cpp deleted file mode 100644 index 29e393b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaCreativePortal.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "FortAthenaCreativePortal.h" - -#include "FortPlayerPawn.h" -#include "FortPlayerControllerAthena.h" - -void AFortAthenaCreativePortal::TeleportPlayerToLinkedVolumeHook(UObject* Context, FFrame& Stack, void* Ret) -{ - LOG_INFO(LogDev, "TeleportPlayerToLinkedVolumeHook!"); - - auto Portal = (AFortAthenaCreativePortal*)Context; // Cast? - - if (!Portal) - return TeleportPlayerToLinkedVolumeOriginal(Context, Stack, Ret); - - AFortPlayerPawn* PlayerPawn = nullptr; - bool bUseSpawnTags; - - Stack.StepCompiledIn(&PlayerPawn); - Stack.StepCompiledIn(&bUseSpawnTags); - - LOG_INFO(LogDev, "PlayerPawn: {}", __int64(PlayerPawn)); - - if (!PlayerPawn) - return TeleportPlayerToLinkedVolumeOriginal(Context, Stack, Ret); - - auto LinkedVolume = Portal->GetLinkedVolume(); - - LOG_INFO(LogDev, "LinkedVolume: {}", __int64(LinkedVolume)); - - if (!LinkedVolume) - return TeleportPlayerToLinkedVolumeOriginal(Context, Stack, Ret); - - auto Location = LinkedVolume->GetActorLocation(); - // Location.Z -= 10000; // proper 1:1 - PlayerPawn->TeleportTo(Location, FRotator()); - - return TeleportPlayerToLinkedVolumeOriginal(Context, Stack, Ret); -} - -void AFortAthenaCreativePortal::TeleportPlayerHook(UObject* Context, FFrame& Stack, void* Ret) -{ - auto Portal = (AFortAthenaCreativePortal*)Context; // Cast? - - if (!Portal) - return TeleportPlayerOriginal(Context, Stack, Ret); - - AFortPlayerPawn* PlayerPawn = nullptr; - FRotator TeleportRotation; - - Stack.StepCompiledIn(&PlayerPawn); - Stack.StepCompiledIn(&TeleportRotation); - - LOG_INFO(LogDev, "PlayerPawn: {}", __int64(PlayerPawn)); - - if (!PlayerPawn) - return TeleportPlayerOriginal(Context, Stack, Ret); - - static auto bReturnToCreativeHubOffset = Portal->GetOffset("bReturnToCreativeHub"); - auto bReturnToCreativeHub = Portal->Get(bReturnToCreativeHubOffset); - - LOG_INFO(LogDev, "bReturnToCreativeHub: {}", bReturnToCreativeHub); - - if (bReturnToCreativeHub) - { - auto Controller = Cast(PlayerPawn->GetController()); - - if (!Controller) - return TeleportPlayerOriginal(Context, Stack, Ret); - - AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook(Controller); - } - else - { - static auto TeleportLocationOffset = Portal->GetOffset("TeleportLocation"); - auto& TeleportLocation = Portal->Get(TeleportLocationOffset); - PlayerPawn->TeleportTo(TeleportLocation, TeleportRotation); - } - - return TeleportPlayerOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaCreativePortal.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaCreativePortal.h deleted file mode 100644 index e31b074..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaCreativePortal.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include "BuildingActor.h" -#include "FortVolume.h" -#include "Stack.h" - -struct FCreativeLoadedLinkData -{ - -}; - -class AFortAthenaCreativePortal : public ABuildingActor // ABuildingGameplayActor -{ -public: - static inline void (*TeleportPlayerToLinkedVolumeOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*TeleportPlayerOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - FCreativeLoadedLinkData* GetIslandInfo() - { - static auto CreativeLoadedLinkDataStruct = FindObject("/Script/FortniteGame.CreativeLoadedLinkData"); - - if (!CreativeLoadedLinkDataStruct) - return nullptr; - - static auto IslandInfoOffset = GetOffset("IslandInfo"); - return GetPtr(IslandInfoOffset); - } - - void* GetOwningPlayer() - { - static auto OwningPlayerOffset = GetOffset("OwningPlayer", false); - - if (OwningPlayerOffset == -1) - return nullptr; - - return GetPtr(OwningPlayerOffset); - } - - bool& GetPortalOpen() - { - static auto bPortalOpenOffset = GetOffset("bPortalOpen"); - return Get(bPortalOpenOffset); - } - - bool& GetUserInitiatedLoad() - { - static auto bUserInitiatedLoadOffset = GetOffset("bUserInitiatedLoad"); - return Get(bUserInitiatedLoadOffset); - } - - bool& GetInErrorState() - { - static auto bInErrorStateOffset = GetOffset("bInErrorState"); - return Get(bInErrorStateOffset); - } - - AFortVolume*& GetLinkedVolume() - { - static auto LinkedVolumeOffset = GetOffset("LinkedVolume"); - return Get(LinkedVolumeOffset); - } - - FString& GetCreatorName() - { - auto IslandInfo = GetIslandInfo(); - - if (!IslandInfo) - { - return *(FString*)0; - } - - static auto CreatorNameOffset = FindOffsetStruct("/Script/FortniteGame.CreativeLoadedLinkData", "CreatorName"); - return *(FString*)(__int64(IslandInfo) + CreatorNameOffset); - } - - static void TeleportPlayerToLinkedVolumeHook(UObject* Context, FFrame& Stack, void* Ret); - static void TeleportPlayerHook(UObject* Context, FFrame& Stack, void* Ret); - // hook TeleportPlayer ?? but do what with it -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMapInfo.cpp b/dependencies/reboot/Project Reboot 3.0/FortAthenaMapInfo.cpp deleted file mode 100644 index e19bc0b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMapInfo.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "FortAthenaMapInfo.h" -#include "GameplayStatics.h" -#include "FortAthenaSupplyDrop.h" -#include "FortGameModeAthena.h" -#include "Vector2D.h" - -FVector2D GenerateRandomVector2D(float Radius) -{ - float v3; - float v4; - - do - { - v3 = (float)((float)rand() * 0.000061037019) - 1.0; - v4 = (float)((float)rand() * 0.000061037019) - 1.0; - } while ((float)((float)(v4 * v4) + (float)(v3 * v3)) > 1.0); - - return FVector2D(v3 * Radius, v4 * Radius); -} - -FVector AFortAthenaMapInfo::PickSupplyDropLocation(FVector Center, float Radius) -{ - static FVector* (*PickSupplyDropLocationOriginal)(AFortAthenaMapInfo* MapInfo, FVector* outLocation, __int64 Center, float Radius) = decltype(PickSupplyDropLocationOriginal)(Addresses::PickSupplyDropLocation); - - if (!PickSupplyDropLocationOriginal) - return FVector(0, 0, 0); - - // LOG_INFO(LogDev, "GetAircraftDropVolume: {}", __int64(GetAircraftDropVolume())); - - FVector Out = FVector(0, 0, 0); - auto ahh = PickSupplyDropLocationOriginal(this, &Out, __int64(&Center), Radius); - return Out; -} - -void AFortAthenaMapInfo::SpawnLlamas() -{ - if (!GetLlamaClass()) - { - // LOG_INFO(LogDev, "No Llama Class, is this intended?"); - return; - } - - int AmountOfLlamasSpawned = 0; - auto AmountOfLlamasToSpawn = CalcuateCurveMinAndMax(GetLlamaQuantityMin(), GetLlamaQuantityMax(), 1); - - LOG_INFO(LogDev, "Attempting to spawn {} llamas.", AmountOfLlamasToSpawn); - - for (int i = 0; i < AmountOfLlamasToSpawn; i++) - { - int Radius = 100000; - FVector Location = PickSupplyDropLocation(FVector(1, 1, 10000), Radius); - - // LOG_INFO(LogDev, "Initial Llama at {} {} {}", Location.X, Location.Y, Location.Z); - - if (Location.CompareVectors(FVector(0, 0, 0))) - continue; - - FRotator RandomYawRotator = FRotator(); - RandomYawRotator.Yaw = (float)rand() * 0.010986663f; - - FTransform InitialSpawnTransform; - InitialSpawnTransform.Translation = Location; - InitialSpawnTransform.Rotation = RandomYawRotator.Quaternion(); - InitialSpawnTransform.Scale3D = FVector(1, 1, 1); - - auto LlamaStart = GetWorld()->SpawnActor(GetLlamaClass(), InitialSpawnTransform, - CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn, true)); - - // LOG_INFO(LogDev, "LlamaStart: {}", __int64(LlamaStart)); - - if (!LlamaStart) - continue; - - auto GroundLocation = LlamaStart->FindGroundLocationAt(InitialSpawnTransform.Translation); - - FTransform FinalSpawnTransform = InitialSpawnTransform; - FinalSpawnTransform.Translation = GroundLocation; - - LOG_INFO(LogDev, "Spawning Llama at {} {} {}", GroundLocation.X, GroundLocation.Y, GroundLocation.Z); - - UGameplayStatics::FinishSpawningActor(LlamaStart, FinalSpawnTransform); - AmountOfLlamasSpawned++; - } - - LOG_INFO(LogGame, "Spawned {} llamas.", AmountOfLlamasSpawned); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMapInfo.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMapInfo.h deleted file mode 100644 index 10b8773..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMapInfo.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once - -#include - -#include "Actor.h" - -#include "GameplayAbilityTypes.h" -#include "DataTableFunctionLibrary.h" -#include "SoftObjectPtr.h" - -static inline float CalcuateCurveMinAndMax(FScalableFloat* Min, FScalableFloat* Max, float Multiplier = 100.f) // returns 000 not 0.00 (forgot techinal name for this) -{ - float MinSpawnPercent = UDataTableFunctionLibrary::EvaluateCurveTableRow(Min->GetCurve().CurveTable, Min->GetCurve().RowName, 0); - float MaxSpawnPercent = UDataTableFunctionLibrary::EvaluateCurveTableRow(Max->GetCurve().CurveTable, Max->GetCurve().RowName, 0); - - std::random_device MinMaxRd; - std::mt19937 MinMaxGen(MinMaxRd()); - std::uniform_int_distribution<> MinMaxDis(MinSpawnPercent * Multiplier, MaxSpawnPercent * Multiplier + 1); // + 1 ? - - float SpawnPercent = MinMaxDis(MinMaxGen); - - return SpawnPercent; -} - -struct FBuildingGameplayActorSpawnDetails -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.BuildingGameplayActorSpawnDetails"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - FScalableFloat* GetSpawnHeight() - { - static auto SpawnHeightOffset = FindOffsetStruct("/Script/FortniteGame.BuildingGameplayActorSpawnDetails", "SpawnHeight"); - return (FScalableFloat*)(__int64(this) + SpawnHeightOffset); - } - - UClass*& GetBuildingGameplayActorClass() - { - static auto BuildingGameplayActorClassOffset = FindOffsetStruct("/Script/FortniteGame.BuildingGameplayActorSpawnDetails", "BuildingGameplayActorClass"); - return *(UClass**)(__int64(this) + BuildingGameplayActorClassOffset); - } - - UClass*& GetTargetActorClass() - { - static auto TargetActorClassOffset = FindOffsetStruct("/Script/FortniteGame.BuildingGameplayActorSpawnDetails", "TargetActorClass"); - return *(UClass**)(__int64(this) + TargetActorClassOffset); - } -}; - -struct FVehicleClassDetails -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.VehicleClassDetails"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - TSoftObjectPtr& GetVehicleClass() - { - static auto VehicleClassOffset = FindOffsetStruct("/Script/FortniteGame.VehicleClassDetails", "VehicleClass"); - return *(TSoftObjectPtr*)(__int64(this) + VehicleClassOffset); - } - - FScalableFloat* GetVehicleMinSpawnPercent() - { - static auto VehicleMinSpawnPercentOffset = FindOffsetStruct("/Script/FortniteGame.VehicleClassDetails", "VehicleMinSpawnPercent"); - return (FScalableFloat*)(__int64(this) + VehicleMinSpawnPercentOffset); - } - - FScalableFloat* GetVehicleMaxSpawnPercent() - { - static auto VehicleMaxSpawnPercentOffset = FindOffsetStruct("/Script/FortniteGame.VehicleClassDetails", "VehicleMaxSpawnPercent"); - return (FScalableFloat*)(__int64(this) + VehicleMaxSpawnPercentOffset); - } -}; - -class AFortAthenaMapInfo : public AActor -{ -public: - TArray& GetVehicleClassDetails() - { - static auto VehicleClassDetailsOffset = GetOffset("VehicleClassDetails"); - return Get>(VehicleClassDetailsOffset); - } - - UClass*& GetAmmoBoxClass() - { - static auto AmmoBoxClassOffset = GetOffset("AmmoBoxClass"); - return Get(AmmoBoxClassOffset); - } - - FScalableFloat* GetAmmoBoxMinSpawnPercent() - { - static auto AmmoBoxMinSpawnPercentOffset = GetOffset("AmmoBoxMinSpawnPercent"); - return GetPtr(AmmoBoxMinSpawnPercentOffset); - } - - FScalableFloat* GetAmmoBoxMaxSpawnPercent() - { - static auto AmmoBoxMaxSpawnPercentOffset = GetOffset("AmmoBoxMaxSpawnPercent"); - return GetPtr(AmmoBoxMaxSpawnPercentOffset); - } - - UClass*& GetTreasureChestClass() - { - static auto TreasureChestClassOffset = GetOffset("TreasureChestClass"); - return Get(TreasureChestClassOffset); - } - - FScalableFloat* GetTreasureChestMinSpawnPercent() - { - static auto TreasureChestMinSpawnPercentOffset = GetOffset("TreasureChestMinSpawnPercent"); - return GetPtr(TreasureChestMinSpawnPercentOffset); - } - - FScalableFloat* GetTreasureChestMaxSpawnPercent() - { - static auto TreasureChestMaxSpawnPercentOffset = GetOffset("TreasureChestMaxSpawnPercent"); - return GetPtr(TreasureChestMaxSpawnPercentOffset); - } - - TArray& GetBuildingGameplayActorSpawnDetails() - { - static auto BuildingGameplayActorSpawnDetailsOffset = GetOffset("BuildingGameplayActorSpawnDetails"); - return Get>(BuildingGameplayActorSpawnDetailsOffset); - } - - FScalableFloat* GetLlamaQuantityMin() - { - static auto LlamaQuantityMinOffset = GetOffset("LlamaQuantityMin"); - return GetPtr(LlamaQuantityMinOffset); - } - - FScalableFloat* GetLlamaQuantityMax() - { - static auto LlamaQuantityMaxOffset = GetOffset("LlamaQuantityMax"); - return GetPtr(LlamaQuantityMaxOffset); - } - - UClass* GetLlamaClass() - { - static auto LlamaClassOffset = GetOffset("LlamaClass", false); - - if (LlamaClassOffset == -1) - return nullptr; - - return Get(LlamaClassOffset); - } - - AActor*& GetAircraftDropVolume() // actually AVolume - { - static auto AircraftDropVolumeOffset = GetOffset("AircraftDropVolume"); - return Get(AircraftDropVolumeOffset); - } - - FVector PickSupplyDropLocation(FVector Center, float Radius); - void SpawnLlamas(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator.h deleted file mode 100644 index 4edc366..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include - -#include "Actor.h" - -#include "Stack.h" - -#include "ScriptInterface.h" -#include "FortGameStateAthena.h" -#include "GameplayStatics.h" - -class AFortAthenaMutator : public AActor // AFortGameplayMutator -{ -public: - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAthenaMutator"); - return Class; - } -}; - -static inline void LoopMutators(std::function Callback) -{ - auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), AFortAthenaMutator::StaticClass()); - - for (int i = 0; i < AllMutators.Num(); i++) - { - Callback((AFortAthenaMutator*)AllMutators.at(i)); - } - - AllMutators.Free(); -} - -template -static inline MutatorType* FindFirstMutator(UClass* MutatorClass = MutatorType::StaticClass()) -{ - auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), MutatorClass); - auto FirstMutator = AllMutators.Num() >= 1 ? AllMutators.at(0) : nullptr; - - AllMutators.Free(); - - return (MutatorType*)FirstMutator; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Barrier.cpp b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Barrier.cpp deleted file mode 100644 index bbd26f7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Barrier.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "FortAthenaMutator_Barrier.h" - -void AFortAthenaMutator_Barrier::OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret) -{ - auto GameState = Cast(GetWorld()->GetGameState()); - - if (!GameState) - return OnGamePhaseStepChangedOriginal(Context, Stack, Ret); - - LOG_INFO(LogDev, "OnGamePhaseStepChangedHook gamepadsl gwrigjsafjob fs: {}", (int)GameState->GetGamePhaseStep()); - - /* - TScriptInterface SafeZoneInterface; - EAthenaGamePhaseStep GamePhaseStep; - - static auto SafeZoneInterfaceOffset = FindOffsetStruct("/Script/FortniteGame.FortAthenaMutator_Barrier.OnGamePhaseStepChanged", "SafeZoneInterface", false); - - if (SafeZoneInterfaceOffset != -1) - Stack.StepCompiledIn(&SafeZoneInterface); - - Stack.StepCompiledIn(&GamePhaseStep); - - LOG_INFO(LogDev, "{} GamePhaseStep: {}", __FUNCTION__, (int)GamePhaseStep); - - if (GamePhaseStep == EAthenaGamePhaseStep::Warmup) - { - // idk when they spawn the barrier could also be warmup or something - } - else if (GamePhaseStep == EAthenaGamePhaseStep::BusLocked) - { - // idk if they spawn the heads on flying or locked - } - - */ - - return OnGamePhaseStepChangedOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Barrier.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Barrier.h deleted file mode 100644 index 4f823c8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Barrier.h +++ /dev/null @@ -1,87 +0,0 @@ -// Food Fight - -#pragma once - -#include "FortAthenaMutator.h" -#include "AthenaBigBaseWall.h" -#include "AthenaBarrierObjective.h" -#include "AthenaBarrierFlag.h" - -/* - -EVENT IDS (got on 10.40): - -WallComingDown - 1 -WallDown - 2 -// IDK REST COMPILER WAS TOO SMART -Intro - 9 -NoMoreRespawns - 10 - -*/ - -struct FBarrierTeamState // Idk if this actually changes -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.BarrierTeamState"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - EBarrierFoodTeam& GetFoodTeam() - { - static auto FoodTeamOffset = FindOffsetStruct("/Script/FortniteGame.BarrierTeamState", "FoodTeam"); - return *(EBarrierFoodTeam*)(__int64(this) + FoodTeamOffset); - } - - AAthenaBarrierFlag*& GetObjectiveFlag() - { - static auto ObjectiveFlagOffset = FindOffsetStruct("/Script/FortniteGame.BarrierTeamState", "ObjectiveFlag"); - return *(AAthenaBarrierFlag**)(__int64(this) + ObjectiveFlagOffset); - } - - AAthenaBarrierObjective*& GetObjectiveObject() - { - static auto ObjectiveObjectOffset = FindOffsetStruct("/Script/FortniteGame.BarrierTeamState", "ObjectiveObject"); - return *(AAthenaBarrierObjective**)(__int64(this) + ObjectiveObjectOffset); - } -}; - -class AFortAthenaMutator_Barrier : public AFortAthenaMutator -{ -public: - static inline void (*OnGamePhaseStepChangedOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - UClass* GetBigBaseWallClass() - { - static auto BigBaseWallClassOffset = GetOffset("BigBaseWallClass"); - return Get(BigBaseWallClassOffset); - } - - UClass* GetObjectiveFlagClass() - { - static auto ObjectiveFlagOffset = GetOffset("ObjectiveFlag"); - return Get(ObjectiveFlagOffset); - } - - AAthenaBigBaseWall*& GetBigBaseWall() - { - static auto BigBaseWallOffset = GetOffset("BigBaseWall"); - return Get(BigBaseWallOffset); - } - - FBarrierTeamState* GetTeam_0_State() - { - static auto Team_0_StateOffset = GetOffset("Team_0_State"); - return GetPtr(Team_0_StateOffset); - } - - FBarrierTeamState* GetTeam_1_State() - { - static auto Team_1_StateOffset = GetOffset("Team_1_State"); - return GetPtr(Team_1_StateOffset); - } - - static void OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Bots.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Bots.h deleted file mode 100644 index 3d8a128..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Bots.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "FortAthenaMutator.h" - -class AFortAthenaMutator_Bots : public AFortAthenaMutator // AFortAthenaMutator_SpawningPolicyEQS -{ -public: - class AFortPlayerPawnAthena* SpawnBot(UClass* BotPawnClass, AActor* InSpawnLocator, const FVector& InSpawnLocation, const FRotator& InSpawnRotation, bool bSnapToGround) - { - static auto SpawnBotFn = FindObject(L"/Script/FortniteGame.FortAthenaMutator_Bots.SpawnBot"); - - struct - { - UClass* BotPawnClass; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AActor* InSpawnLocator; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector InSpawnLocation; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FRotator InSpawnRotation; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - bool bSnapToGround; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AFortPlayerPawnAthena* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortAthenaMutator_Bots_SpawnBot_Params{ BotPawnClass, InSpawnLocator, InSpawnLocation, InSpawnRotation, bSnapToGround }; - - this->ProcessEvent(SpawnBotFn, &AFortAthenaMutator_Bots_SpawnBot_Params); - - return AFortAthenaMutator_Bots_SpawnBot_Params.ReturnValue; - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAthenaMutator_Bots"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Disco.cpp b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Disco.cpp deleted file mode 100644 index b1efd05..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Disco.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "FortAthenaMutator_Disco.h" - -void AFortAthenaMutator_Disco::OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret) -{ - /* TScriptInterface SafeZoneInterface; - EAthenaGamePhaseStep GamePhaseStep = EAthenaGamePhaseStep::BusFlying; - - static auto SafeZoneInterfaceOffset = FindOffsetStruct("/Script/FortniteGame.FortAthenaMutator_Disco.OnGamePhaseStepChanged", "SafeZoneInterface", false); - - if (SafeZoneInterfaceOffset != -1) - Stack.StepCompiledIn(&SafeZoneInterface); - - Stack.StepCompiledIn(&GamePhaseStep, true); */ - - // LOG_INFO(LogDev, "{} GamePhaseStep: {}", __FUNCTION__, (int)GamePhaseStep); - - return OnGamePhaseStepChangedOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Disco.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Disco.h deleted file mode 100644 index 33289f6..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Disco.h +++ /dev/null @@ -1,31 +0,0 @@ -// Disco Domination - -#pragma once - -#include "FortAthenaMutator.h" -#include "Array.h" - -struct FControlPointSpawnData -{ - -}; - -class AFortAthenaMutator_Disco : public AFortAthenaMutator -{ -public: - static inline void (*OnGamePhaseStepChangedOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - TArray& GetControlPointSpawnData() - { - static auto ControlPointSpawnDataOffset = GetOffset("ControlPointSpawnData"); - return Get>(ControlPointSpawnDataOffset); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortAthenaMutator_Disco"); - return Class; - } - - static void OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GG.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GG.h deleted file mode 100644 index 88df036..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GG.h +++ /dev/null @@ -1,93 +0,0 @@ -// Gun Game - -#pragma once - -#include "Actor.h" -#include "CurveTable.h" -#include "GameplayAbilityTypes.h" -#include "FortWeaponItemDefinition.h" -#include "Stack.h" -#include "FortPlayerStateAthena.h" -#include "FortAthenaMutator.h" - -struct FGunGameGunEntry -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.GunGameGunEntry"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - UFortWeaponItemDefinition*& GetWeapon() - { - static auto WeaponOffset = FindOffsetStruct("/Script/FortniteGame.GunGameGunEntry", "Weapon"); - return *(UFortWeaponItemDefinition**)(__int64(this) + WeaponOffset); - } - - FScalableFloat& GetEnabled() - { - static auto EnabledOffset = FindOffsetStruct("/Script/FortniteGame.GunGameGunEntry", "Enabled"); - return *(FScalableFloat*)(__int64(this) + EnabledOffset); - } - - FScalableFloat& GetAwardAtElim() - { - static auto AwardAtElimOffset = FindOffsetStruct("/Script/FortniteGame.GunGameGunEntry", "AwardAtElim"); - return *(FScalableFloat*)(__int64(this) + AwardAtElimOffset); - } -}; - -struct FGunGameGunEntries -{ - TArray Entries; // 0x0000(0x0010) (ZeroConstructor, NativeAccessSpecifierPublic) -}; - -struct FGunGamePlayerData -{ - TArray CurrentlyAssignedWeapons; // 0x0000(0x0010) (ZeroConstructor, NativeAccessSpecifierPublic) -}; - -class AFortAthenaMutator_GG : public AFortAthenaMutator -{ -public: - TArray& GetWeaponEntries() - { - static auto WeaponEntriesOffset = GetOffset("WeaponEntries"); - return Get>(WeaponEntriesOffset); - } - - TMap& GetAwardEntriesAtElimMap() - { - static auto AwardEntriesAtElimMapOffset = GetOffset("AwardEntriesAtElimMap"); - return Get>(AwardEntriesAtElimMapOffset); - } - - TMap& GetPlayerData() - { - static auto PlayerDataOffset = GetOffset("PlayerData"); - return Get>(PlayerDataOffset); - } - - FGunGameGunEntries GetEntriesFromAward(const FScalableFloat& AwardAtElim) - { - auto& AwardEntriesAtElimMap = GetAwardEntriesAtElimMap(); - - float Value = 0; // TODO Get from AwardAtElim - - for (auto& AwardEntry : AwardEntriesAtElimMap) - { - if (AwardEntry.First == Value) - { - return AwardEntry.Second; - } - } - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAthenaMutator_GG"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp deleted file mode 100644 index f5a1fd5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "FortAthenaMutator_GiveItemsAtGamePhaseStep.h" - -void AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret) -{ - LOG_INFO(LogDev, __FUNCTION__); - - return OnGamePhaseStepChangedOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GiveItemsAtGamePhaseStep.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GiveItemsAtGamePhaseStep.h deleted file mode 100644 index 067a78b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_GiveItemsAtGamePhaseStep.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -#include "Actor.h" -#include "CurveTable.h" -#include "GameplayAbilityTypes.h" -#include "FortWorldItemDefinition.h" -#include "Stack.h" -#include "FortAthenaMutator.h" - -struct FItemsToGive -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.ItemsToGive"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - UFortWorldItemDefinition*& GetItemToDrop() - { - static auto ItemToDropOffset = FindOffsetStruct("/Script/FortniteGame.ItemsToGive", "ItemToDrop"); - return *(UFortWorldItemDefinition**)(__int64(this) + ItemToDropOffset); - } - - FScalableFloat& GetNumberToGive() - { - static auto NumberToGiveOffset = FindOffsetStruct("/Script/FortniteGame.ItemsToGive", "NumberToGive"); - return *(FScalableFloat*)(__int64(this) + NumberToGiveOffset); - } -}; - -class AFortAthenaMutator_GiveItemsAtGamePhaseStep : public AFortAthenaMutator -{ -public: - static inline void (*OnGamePhaseStepChangedOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - uint8_t& GetPhaseToGiveItems() - { - static auto PhaseToGiveItemsOffset = GetOffset("PhaseToGiveItems"); - return Get(PhaseToGiveItemsOffset); - } - - TArray& GetItemsToGive() - { - static auto ItemsToGiveOffset = GetOffset("ItemsToGive"); - return Get>(ItemsToGiveOffset); - } - - static void OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret); - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAthenaMutator_GiveItemsAtGamePhaseStep"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Heist.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Heist.h deleted file mode 100644 index 8e8fede..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_Heist.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "FortAthenaMutator.h" -#include "GameplayAbilityTypes.h" -#include "reboot.h" - -struct FFortPieSliceSpawnData -{ - FScalableFloat SpawnDirection; // 0x0000(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic) - FScalableFloat SpawnDirectionDeviation; // 0x0020(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic) - FScalableFloat MinSpawnDistanceFromCenter; // 0x0040(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic) - FScalableFloat MaxSpawnDistanceFromCenter; // 0x0060(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic) -}; - -struct FHeistExitCraftSpawnData : public FFortPieSliceSpawnData -{ - FScalableFloat SpawnDelayTime; // 0x0080(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic) - FScalableFloat SafeZonePhaseWhenToSpawn; // 0x00A0(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic) - FScalableFloat SafeZonePhaseWhereToSpawn; // 0x00C0(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic) -}; - -class AFortAthenaMutator_Heist : public AFortAthenaMutator -{ -public: - /* TArray& GetHeistExitCraftSpawnData() - { - static auto HeistExitCraftSpawnDataOffset = GetOffset("HeistExitCraftSpawnData"); - return Get>(HeistExitCraftSpawnDataOffset); - } */ - - float& GetSpawnExitCraftTime() - { - static auto SpawnExitCraftTimeOffset = GetOffset("SpawnExitCraftTime"); - return Get(SpawnExitCraftTimeOffset); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortAthenaMutator_Heist"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_InventoryOverride.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_InventoryOverride.h deleted file mode 100644 index 324bfcb..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_InventoryOverride.h +++ /dev/null @@ -1,131 +0,0 @@ -#pragma once - -#include "FortAthenaMutator.h" - -enum class EAthenaLootDropOverride : uint8_t -{ - NoOverride = 0, - ForceDrop = 1, - ForceKeep = 2, - ForceDestroy = 3, - ForceDropUnlessRespawning = 4, - ForceDestroyUnlessRespawning = 5, - EAthenaLootDropOverride_MAX = 6 -}; - -enum class EAthenaInventorySpawnOverride : uint8_t -{ - NoOverride = 0, - Always = 1, - IntialSpawn = 2, - AircraftPhaseOnly = 3, - EAthenaInventorySpawnOverride_MAX = 4 -}; - -struct FItemLoadoutContainer -{ - TArray Loadout; -}; - -struct FItemLoadoutTeamMap -{ - unsigned char TeamIndex; // 0x0000(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - unsigned char LoadoutIndex; // 0x0001(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - EAthenaInventorySpawnOverride UpdateOverrideType; // 0x0002(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - EAthenaLootDropOverride DropAllItemsOverride; // 0x0003(0x0001) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) -}; - -class AFortAthenaMutator_InventoryOverride : public AFortAthenaMutator -{ -public: - TArray& GetInventoryLoadouts() - { - static auto InventoryLoadoutsOffset = GetOffset("InventoryLoadouts"); - return Get>(InventoryLoadoutsOffset); - } - - TArray* GetTeamLoadouts() - { - static auto TeamLoadoutsOffset = GetOffset("TeamLoadouts", false); - - if (TeamLoadoutsOffset == -1) - return nullptr; - - return GetPtr>(TeamLoadoutsOffset); - } - - FItemLoadoutTeamMap GetLoadoutTeamForTeamIndex(uint8_t TeamIndex) - { - auto TeamLoadouts = GetTeamLoadouts(); - - if (!TeamLoadouts) - return FItemLoadoutTeamMap(); - - for (int i = 0; i < TeamLoadouts->Num(); i++) - { - auto& TeamLoadout = TeamLoadouts->at(i); - - if (TeamLoadout.TeamIndex == TeamIndex) - return TeamLoadout; - } - - return FItemLoadoutTeamMap(); - } - - FItemLoadoutContainer GetLoadoutContainerForTeamIndex(uint8_t TeamIndex) - { - auto LoadoutTeam = GetLoadoutTeamForTeamIndex(TeamIndex); - - if (LoadoutTeam.TeamIndex == TeamIndex) - { - auto& InventoryLoadouts = GetInventoryLoadouts(); - - if (InventoryLoadouts.Num() - 1 < LoadoutTeam.LoadoutIndex) - return FItemLoadoutContainer(); - - return InventoryLoadouts.at(LoadoutTeam.LoadoutIndex); - } - - return FItemLoadoutContainer(); - } - - EAthenaInventorySpawnOverride& GetInventoryUpdateOverride(uint8_t TeamIndex = 255) - { - if (TeamIndex != 255) - { - auto LoadoutTeam = GetLoadoutTeamForTeamIndex(TeamIndex); - - if (LoadoutTeam.TeamIndex == TeamIndex) - { - if (LoadoutTeam.UpdateOverrideType != EAthenaInventorySpawnOverride::NoOverride) - return LoadoutTeam.UpdateOverrideType; - } - } - - static auto InventoryUpdateOverrideOffset = GetOffset("InventoryUpdateOverride"); - return Get(InventoryUpdateOverrideOffset); - } - - EAthenaLootDropOverride& GetDropAllItemsOverride(uint8_t TeamIndex = 255) - { - if (TeamIndex != 255) - { - auto LoadoutTeam = GetLoadoutTeamForTeamIndex(TeamIndex); - - if (LoadoutTeam.TeamIndex == TeamIndex) - { - if (LoadoutTeam.DropAllItemsOverride != EAthenaLootDropOverride::NoOverride) - return LoadoutTeam.DropAllItemsOverride; - } - } - - static auto DropAllItemsOverrideOffset = GetOffset("DropAllItemsOverride"); - return Get(DropAllItemsOverrideOffset); - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAthenaMutator_InventoryOverride"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_InventoryOverride_Bucket.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_InventoryOverride_Bucket.h deleted file mode 100644 index 0a45c2d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_InventoryOverride_Bucket.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "FortAthenaMutator_InventoryOverride.h" -#include "GameplayAbilityTypes.h" -#include "CurveTable.h" -#include "FortItemDefinition.h" -#include "FortInventory.h" - -struct FHotfixableInventoryOverrideItem -{ -public: - FScalableFloat Count; // 0x0(0x20)(Edit, BlueprintVisible, NativeAccessSpecifierPublic) - UFortItemDefinition* Item; // 0x20(0x8)(Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) -}; - -struct FItemLoadoutContainer -{ -public: - FScalableFloat bEnabled; // 0x0(0x20)(Edit, DisableEditOnInstance, NativeAccessSpecifierPublic) - TArray Loadout; // 0x20(0x10)(ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - TArray LoadoutList; // 0x30(0x10)(Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, HasGetValueTypeHash, NativeAccessSpecifierPublic) -}; - -struct FItemLoadoutBucket -{ -public: - FScalableFloat bEnabled; // 0x0(0x20)(Edit, DisableEditOnInstance, NativeAccessSpecifierPublic) - TArray Loadouts; // 0x20(0x10)(Edit, ZeroConstructor, DisableEditOnInstance, HasGetValueTypeHash, NativeAccessSpecifierPublic) - uint8 Pad_3D83[0x8]; // Fixing Size Of Struct [ Dumper-7 ] -}; - -class AFortAthenaMutator_InventoryOverride_Bucket : public AFortAthenaMutator_InventoryOverride -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_ItemDropOnDeath.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_ItemDropOnDeath.h deleted file mode 100644 index f946e33..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_ItemDropOnDeath.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "FortAthenaMutator.h" -#include "GameplayAbilityTypes.h" -#include "CurveTable.h" -#include "FortWorldItemDefinition.h" -#include "FortInventory.h" - -struct FItemsToDropOnDeath -{ - UFortWorldItemDefinition* ItemToDrop; // 0x0000(0x0008) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FScalableFloat NumberToDrop; // 0x0008(0x0020) (Edit, NativeAccessSpecifierPublic) -}; - -class AFortAthenaMutator_ItemDropOnDeath : public AFortAthenaMutator -{ -public: - TArray& GetItemsToDrop() - { - static auto ItemsToDropOffset = GetOffset("ItemsToDrop"); - return Get>(ItemsToDropoOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_LoadoutSwap.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_LoadoutSwap.h deleted file mode 100644 index d798076..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_LoadoutSwap.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "FortAthenaMutator.h" - -class AFortAthenaMutator_LoadoutSwap : public AFortAthenaMutator -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_TDM.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_TDM.h deleted file mode 100644 index dde86fd..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaMutator_TDM.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "FortAthenaMutator.h" - -#include "reboot.h" - -class AFortAthenaMutator_TDM : public AFortAthenaMutator -{ -public: - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAthenaMutator_TDM"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaNpcPatrollingComponent.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaNpcPatrollingComponent.h deleted file mode 100644 index 9423cf5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaNpcPatrollingComponent.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "ActorComponent.h" - -#include "FortAthenaPatrolPath.h" - -#include "reboot.h" - -class UFortAthenaNpcPatrollingComponent : public UActorComponent -{ -public: - void SetPatrolPath(AFortAthenaPatrolPath* NewPatrolPath) - { - static auto SetPatrolPathFn = FindObject(L"/Script/FortniteGame.FortAthenaNpcPatrollingComponent:SetPatrolPath"); - this->ProcessEvent(SetPatrolPathFn, &NewPatrolPath); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortAthenaNpcPatrollingComponent"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaPatrolPath.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaPatrolPath.h deleted file mode 100644 index 873b00d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaPatrolPath.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "Actor.h" - -class AFortAthenaPatrolPath : public AActor -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaSKPushCannon.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaSKPushCannon.h deleted file mode 100644 index bd45120..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaSKPushCannon.h +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once - -#include "Actor.h" - -#include "FortAthenaVehicle.h" -#include "reboot.h" - -class AFortAthenaSKPushCannon : public AFortAthenaVehicle // : public AFortAthenaSKPushVehicle -{ -public: - bool IsPushCannonBP() - { - static auto PushCannonBP = FindObject("/Game/Athena/DrivableVehicles/PushCannon.PushCannon_C"); // We should loadobject it. - return this->IsA(PushCannonBP); - } - - void MultiCastPushCannonLaunchedPlayer() - { - static auto MultiCastPushCannonLaunchedPlayerFn = FindObject("/Script/FortniteGame.FortAthenaSKPushCannon.MultiCastPushCannonLaunchedPlayer"); - this->ProcessEvent(MultiCastPushCannonLaunchedPlayerFn); - } - - void OnLaunchPawn(AFortPlayerPawn* Pawn, FVector LaunchDir) - { - static auto OnLaunchPawnFn = IsPushCannonBP() ? FindObject("/Game/Athena/DrivableVehicles/PushCannon.PushCannon_C.OnLaunchPawn") : FindObject("/Script/FortniteGame.FortAthenaSKPushCannon.OnLaunchPawn"); - struct - { - AFortPlayerPawn* Pawn; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - struct FVector LaunchDir; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortAthenaSKPushCannon_OnLaunchPawn_Params{ Pawn, LaunchDir }; - - this->ProcessEvent(OnLaunchPawnFn, &AFortAthenaSKPushCannon_OnLaunchPawn_Params); - } - - void OnPreLaunchPawn(AFortPlayerPawn* Pawn, FVector LaunchDir) - { - static auto OnPreLaunchPawnFn = IsPushCannonBP() ? FindObject("/Game/Athena/DrivableVehicles/PushCannon.PushCannon_C.OnPreLaunchPawn") : FindObject("/Script/FortniteGame.FortAthenaSKPushCannon.OnPreLaunchPawn"); - struct - { - AFortPlayerPawn* Pawn; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector LaunchDir; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortAthenaSKPushCannon_OnPreLaunchPawn_Params{ Pawn, LaunchDir }; - - this->ProcessEvent(OnPreLaunchPawnFn, &AFortAthenaSKPushCannon_OnPreLaunchPawn_Params); - } - - void ShootPawnOut(const FVector& LaunchDir) - { - auto PawnToShoot = this->GetPawnAtSeat(1); - - LOG_INFO(LogDev, "PawnToShoot: {}", __int64(PawnToShoot)); - - if (!PawnToShoot) - return; - - this->OnPreLaunchPawn(PawnToShoot, LaunchDir); - PawnToShoot->ServerOnExitVehicle(ETryExitVehicleBehavior::ForceAlways); - this->OnLaunchPawn(PawnToShoot, LaunchDir); - this->MultiCastPushCannonLaunchedPlayer(); - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAthenaSKPushCannon"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaSupplyDrop.cpp b/dependencies/reboot/Project Reboot 3.0/FortAthenaSupplyDrop.cpp deleted file mode 100644 index 5e8687f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaSupplyDrop.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "FortAthenaSupplyDrop.h" -#include "FortGameStateAthena.h" - -FVector AFortAthenaSupplyDrop::FindGroundLocationAt(FVector InLocation) -{ - static auto FindGroundLocationAtFn = FindObject(L"/Script/FortniteGame.FortAthenaSupplyDrop.FindGroundLocationAt"); - - struct - { - FVector InLocation; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortAthenaSupplyDrop_FindGroundLocationAt_Params{ InLocation }; - - this->ProcessEvent(FindGroundLocationAtFn, &AFortAthenaSupplyDrop_FindGroundLocationAt_Params); - - return AFortAthenaSupplyDrop_FindGroundLocationAt_Params.ReturnValue; -} - -AFortPickup* AFortAthenaSupplyDrop::SpawnPickupFromItemEntryHook(UObject* Context, FFrame& Stack, AFortPickup** Ret) -{ - LOG_INFO(LogDev, __FUNCTION__); - return SpawnPickupFromItemEntryOriginal(Context, Stack, Ret); -} - -AFortPickup* AFortAthenaSupplyDrop::SpawnGameModePickupHook(UObject* Context, FFrame& Stack, AFortPickup** Ret) -{ - UFortWorldItemDefinition* ItemDefinition = nullptr; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UClass* PickupClass = nullptr; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int NumberToSpawn; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AFortPawn* TriggeringPawn = nullptr; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Position; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Direction; - - Stack.StepCompiledIn(&ItemDefinition); - Stack.StepCompiledIn(&PickupClass); - Stack.StepCompiledIn(&NumberToSpawn); - Stack.StepCompiledIn(&TriggeringPawn); - Stack.StepCompiledIn(&Position); - Stack.StepCompiledIn(&Direction); - - SpawnGameModePickupOriginal(Context, Stack, Ret); - - if (!ItemDefinition || !PickupClass) - return nullptr; - - LOG_INFO(LogDev, "Spawning GameModePickup with ItemDefinition: {}", ItemDefinition->GetFullName()); - - auto GameState = Cast(GetWorld()->GetGameState()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1, MAX_DURABILITY, ItemDefinition->GetFinalLevel(GameState->GetWorldLevel())); - CreateData.SpawnLocation = Position; - CreateData.PawnOwner = TriggeringPawn; - CreateData.Source = EFortPickupSpawnSource::GetSupplyDropValue(); - CreateData.OverrideClass = PickupClass; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - *Ret = AFortPickup::SpawnPickup(CreateData); - return *Ret; -} - -AFortPickup* AFortAthenaSupplyDrop::SpawnPickupHook(UObject* Context, FFrame& Stack, AFortPickup** Ret) -{ - UFortWorldItemDefinition* ItemDefinition = nullptr; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int NumberToSpawn; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AFortPawn* TriggeringPawn = nullptr; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Position; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Direction; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - - Stack.StepCompiledIn(&ItemDefinition); - Stack.StepCompiledIn(&NumberToSpawn); - Stack.StepCompiledIn(&TriggeringPawn); - Stack.StepCompiledIn(&Position); - Stack.StepCompiledIn(&Direction); - - SpawnPickupOriginal(Context, Stack, Ret); - - if (!ItemDefinition) - return nullptr; - - auto GameState = Cast(GetWorld()->GetGameState()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1, MAX_DURABILITY, ItemDefinition->GetFinalLevel(GameState->GetWorldLevel())); - CreateData.SpawnLocation = Position; - CreateData.PawnOwner = TriggeringPawn; - CreateData.Source = EFortPickupSpawnSource::GetSupplyDropValue(); - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - *Ret = AFortPickup::SpawnPickup(CreateData); - return *Ret; -} - diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaSupplyDrop.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaSupplyDrop.h deleted file mode 100644 index 2fbc176..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaSupplyDrop.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "BuildingGameplayActor.h" - -#include "FortPickup.h" -#include "Stack.h" - -class AFortAthenaSupplyDrop : public ABuildingGameplayActor -{ -public: - static inline AFortPickup* (*SpawnPickupOriginal)(UObject* Context, FFrame& Stack, AFortPickup** Ret); - static inline AFortPickup* (*SpawnGameModePickupOriginal)(UObject* Context, FFrame& Stack, AFortPickup** Ret); - static inline AFortPickup* (*SpawnPickupFromItemEntryOriginal)(UObject* Context, FFrame& Stack, AFortPickup** Ret); - - FVector FindGroundLocationAt(FVector InLocation); - - static AFortPickup* SpawnPickupFromItemEntryHook(UObject* Context, FFrame& Stack, AFortPickup** Ret); - static AFortPickup* SpawnGameModePickupHook(UObject* Context, FFrame& Stack, AFortPickup** Ret); - static AFortPickup* SpawnPickupHook(UObject* Context, FFrame& Stack, AFortPickup** Ret); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicle.cpp b/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicle.cpp deleted file mode 100644 index d69505b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicle.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "FortAthenaVehicle.h" - -UFortWeaponItemDefinition* AFortAthenaVehicle::GetVehicleWeaponForSeat(int SeatIdx) -{ - static auto GetSeatWeaponComponentFn = FindObject("/Script/FortniteGame.FortAthenaVehicle.GetSeatWeaponComponent"); - - UFortWeaponItemDefinition* VehicleWeaponDefinition = nullptr; - - LOG_INFO(LogDev, "SeatIndex: {}", SeatIdx); - - UObject* WeaponComponent = nullptr; - - if (GetSeatWeaponComponentFn) - { - struct { int SeatIndex; UObject* ReturnValue; } AFortAthenaVehicle_GetSeatWeaponComponent_Params{}; - - this->ProcessEvent(GetSeatWeaponComponentFn, &AFortAthenaVehicle_GetSeatWeaponComponent_Params); - - WeaponComponent = AFortAthenaVehicle_GetSeatWeaponComponent_Params.ReturnValue; - - if (!WeaponComponent) - return VehicleWeaponDefinition; - - static auto WeaponSeatDefinitionStructSize = FindObject("/Script/FortniteGame.WeaponSeatDefinition")->GetPropertiesSize(); - static auto VehicleWeaponOffset = FindOffsetStruct("/Script/FortniteGame.WeaponSeatDefinition", "VehicleWeapon"); - static auto SeatIndexOffset = FindOffsetStruct("/Script/FortniteGame.WeaponSeatDefinition", "SeatIndex"); - static auto WeaponSeatDefinitionsOffset = WeaponComponent->GetOffset("WeaponSeatDefinitions"); - auto& WeaponSeatDefinitions = WeaponComponent->Get>(WeaponSeatDefinitionsOffset); - - for (int i = 0; i < WeaponSeatDefinitions.Num(); i++) - { - auto WeaponSeat = WeaponSeatDefinitions.AtPtr(i, WeaponSeatDefinitionStructSize); - - if (*(int*)(__int64(WeaponSeat) + SeatIndexOffset) != SeatIdx) - continue; - - VehicleWeaponDefinition = *(UFortWeaponItemDefinition**)(__int64(WeaponSeat) + VehicleWeaponOffset); - - break; - } - } - else - { - static auto FerretWeaponItemDefinition = FindObject("/Game/Athena/Items/Weapons/Ferret_Weapon.Ferret_Weapon"); - static auto OctopusWeaponItemDefinition = FindObject("/Game/Athena/Items/Weapons/Vehicles/WID_Octopus_Weapon.WID_Octopus_Weapon"); - static auto InCannonWeaponItemDefinition = FindObject("/Game/Athena/Items/Weapons/Vehicles/ShipCannon_Weapon_InCannon.ShipCannon_Weapon_InCannon"); - static auto CannonWeaponItemDefinition = FindObject("/Game/Athena/Items/Weapons/Vehicles/ShipCannon_Weapon.ShipCannon_Weapon"); - static auto TurretWeaponItemDefinition = FindObject("/Game/Athena/Items/Traps/MountedTurret/MountedTurret_Weapon.MountedTurret_Weapon"); - - auto ReceivingActorName = this->GetName(); - - if (SeatIdx == 0) - { - if (ReceivingActorName.contains("Ferret")) // plane - { - VehicleWeaponDefinition = FerretWeaponItemDefinition; - } - } - - if (ReceivingActorName.contains("Octopus")) // baller - { - VehicleWeaponDefinition = OctopusWeaponItemDefinition; - } - - else if (ReceivingActorName.contains("Cannon")) // cannon - { - VehicleWeaponDefinition = SeatIdx == 1 ? InCannonWeaponItemDefinition : CannonWeaponItemDefinition; - } - - else if (ReceivingActorName.contains("MountedTurret")) - { - VehicleWeaponDefinition = TurretWeaponItemDefinition; - } - } - - return VehicleWeaponDefinition; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicle.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicle.h deleted file mode 100644 index 6fd53d9..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicle.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "Actor.h" - -#include "reboot.h" -#include "FortWeaponItemDefinition.h" - -class AFortAthenaVehicle : public AActor// : public AFortPhysicsPawn // Super changes based on version -{ -public: - class AFortPlayerPawn* GetPawnAtSeat(int SeatIdx) - { - static auto GetPawnAtSeatFn = FindObject("/Script/FortniteGame.FortAthenaVehicle.GetPawnAtSeat"); - struct { int SeatIdx; class AFortPlayerPawn* ReturnValue; } GetPawnAtSeat_Params{SeatIdx}; - this->ProcessEvent(GetPawnAtSeatFn, &GetPawnAtSeat_Params); - - return GetPawnAtSeat_Params.ReturnValue; - } - - int FindSeatIndex(class AFortPlayerPawn* PlayerPawn) - { - static auto FindSeatIndexFn = FindObject("/Script/FortniteGame.FortAthenaVehicle.FindSeatIndex"); - struct { AFortPlayerPawn* PlayerPawn; int ReturnValue; } AFortAthenaVehicle_FindSeatIndex_Params{ PlayerPawn }; - this->ProcessEvent(FindSeatIndexFn, &AFortAthenaVehicle_FindSeatIndex_Params); - - return AFortAthenaVehicle_FindSeatIndex_Params.ReturnValue; - } - - UFortWeaponItemDefinition* GetVehicleWeaponForSeat(int SeatIdx); - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortAthenaVehicle"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicleSpawner.cpp b/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicleSpawner.cpp deleted file mode 100644 index 104d04f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicleSpawner.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "FortAthenaVehicleSpawner.h" - -#include "vehicles.h" - -void AFortAthenaVehicleSpawner::SpawnVehicleHook(AFortAthenaVehicleSpawner* VehicleSpawner) -{ - // literally doesnt get called!!!! - - // LOG_INFO(LogDev, "omgonmg call!!!!\n\n"); - // SpawnVehicleFromSpawner(VehicleSpawner); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicleSpawner.h b/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicleSpawner.h deleted file mode 100644 index 35823dc..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortAthenaVehicleSpawner.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "Actor.h" - -class AFortAthenaVehicleSpawner : public AActor -{ -public: - static void SpawnVehicleHook(AFortAthenaVehicleSpawner* VehicleSpawner); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortBotNameSettings.h b/dependencies/reboot/Project Reboot 3.0/FortBotNameSettings.h deleted file mode 100644 index 54a4fff..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortBotNameSettings.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "reboot.h" - -#include "Text.h" - -enum class EBotNamingMode : uint8 // idk if this changes -{ - RealName = 0, - SkinName = 1, - Anonymous = 2, - Custom = 3, - EBotNamingMode_MAX = 4, -}; - -class UFortBotNameSettings : public UObject -{ -public: - EBotNamingMode& GetNamingMode() - { - static auto NamingModeOffset = GetOffset("NamingMode"); - return Get(NamingModeOffset); - } - - FText& GetOverrideName() - { - static auto OverrideNameOffset = GetOffset("OverrideName"); - return Get(OverrideNameOffset); - } - - bool ShouldAddPlayerIDSuffix() - { - static auto bAddPlayerIDSuffixOffset = GetOffset("bAddPlayerIDSuffix"); - return Get(bAddPlayerIDSuffixOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortDagwoodVehicle.h b/dependencies/reboot/Project Reboot 3.0/FortDagwoodVehicle.h deleted file mode 100644 index d7f8028..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortDagwoodVehicle.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "FortAthenaVehicle.h" - -class AFortDagwoodVehicle : public AFortAthenaVehicle // AFortAthenaSKMotorVehicle -{ -public: - void SetFuel(float NewFuel) - { - static auto SetFuelFn = FindObject(L"/Script/ValetRuntime.FortDagwoodVehicle.SetFuel"); - this->ProcessEvent(SetFuelFn, &NewFuel); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/ValetRuntime.FortDagwoodVehicle"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortDecoItemDefinition.cpp b/dependencies/reboot/Project Reboot 3.0/FortDecoItemDefinition.cpp deleted file mode 100644 index 7c2bd4d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortDecoItemDefinition.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "FortDecoItemDefinition.h" - -UClass* UFortDecoItemDefinition::StaticClass() -{ - static auto ptr = FindObject("/Script/FortniteGame.FortDecoItemDefinition"); - return ptr; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortDecoItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortDecoItemDefinition.h deleted file mode 100644 index 09fdf17..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortDecoItemDefinition.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "FortWeaponItemDefinition.h" - -class UFortDecoItemDefinition : public UFortWeaponItemDefinition -{ -public: - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGadgetItemDefinition.cpp b/dependencies/reboot/Project Reboot 3.0/FortGadgetItemDefinition.cpp deleted file mode 100644 index dd79434..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGadgetItemDefinition.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "FortGadgetItemDefinition.h" -#include "FortAbilitySet.h" -#include "SoftObjectPath.h" -#include "FortPlayerStateAthena.h" -#include "addresses.h" -#include "FortPlayerPawnAthena.h" -#include "FortPlayerControllerAthena.h" - -void UFortGadgetItemDefinition::UnequipGadgetData(AFortPlayerController* PlayerController, UFortItem* Item) -{ - static auto FortInventoryOwnerInterfaceClass = FindObject("/Script/FortniteGame.FortInventoryOwnerInterface"); - __int64 (*RemoveGadgetDataOriginal)(UFortGadgetItemDefinition* a1, __int64 a2, UFortItem* a3) = decltype(RemoveGadgetDataOriginal)(Addresses::RemoveGadgetData); - RemoveGadgetDataOriginal(this, __int64(PlayerController->GetInterfaceAddress(FortInventoryOwnerInterfaceClass)), Item); - - if (auto CosmeticLoadoutPC = PlayerController->GetCosmeticLoadout()) - { - if (auto CharacterToApply = CosmeticLoadoutPC->GetCharacter()) - { - ApplyCID(Cast(PlayerController->GetMyFortPawn()), CharacterToApply); // idk why no automatic - } - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGadgetItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortGadgetItemDefinition.h deleted file mode 100644 index a663894..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGadgetItemDefinition.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "FortWorldItemDefinition.h" -#include "FortPlayerController.h" -#include "AttributeSet.h" -#include "SoftObjectPtr.h" - -class UFortGadgetItemDefinition : public UFortWorldItemDefinition -{ -public: - bool ShouldDropAllItemsOnEquip() - { - static auto bDropAllOnEquipOffset = GetOffset("bDropAllOnEquip", false); - - if (bDropAllOnEquipOffset == -1) - return false; - - static auto bDropAllOnEquipFieldMask = GetFieldMask(GetProperty("bDropAllOnEquip")); - return ReadBitfieldValue(bDropAllOnEquipOffset, bDropAllOnEquipFieldMask); - } - - bool ShouldDestroyGadgetWhenTrackedAttributesIsZero() - { - static auto bDestroyGadgetWhenTrackedAttributesIsZeroOffset = GetOffset("bDestroyGadgetWhenTrackedAttributesIsZero", false); - - if (bDestroyGadgetWhenTrackedAttributesIsZeroOffset == -1) - return false; - - static auto bDestroyGadgetWhenTrackedAttributesIsZeroFieldMask = GetFieldMask(GetProperty("bDestroyGadgetWhenTrackedAttributesIsZero")); - return ReadBitfieldValue(bDestroyGadgetWhenTrackedAttributesIsZeroOffset, bDestroyGadgetWhenTrackedAttributesIsZeroFieldMask); - } - - TArray& GetTrackedAttributes() - { - static auto TrackedAttributesOffset = GetOffset("TrackedAttributes"); - return Get>(TrackedAttributesOffset); - } - - UAttributeSet* GetAttributeSet() - { - static auto AttributeSetOffset = this->GetOffset("AttributeSet", false); - - if (AttributeSetOffset == -1) - return nullptr; - - auto& AttributeSetSoft = this->Get>(AttributeSetOffset); - - static auto AttributeClass = FindObject("/Script/GameplayAbilities.AttributeSet"); - return AttributeSetSoft.Get(AttributeClass, true); - } - - void UnequipGadgetData(AFortPlayerController* PlayerController, UFortItem* Item); - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortGadgetItemDefinition"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameMode.cpp b/dependencies/reboot/Project Reboot 3.0/FortGameMode.cpp deleted file mode 100644 index 69cbf7e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameMode.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "FortGameMode.h" - -void AFortGameMode::SetCurrentPlaylistName(UObject* Playlist) // Techinally it takes in a fname -{ - if (!Playlist) - { - LOG_WARN(LogGame, "AFortGameMode::SetCurrentPlaylistName: Invalid playlist."); - return; - } - - static auto PlaylistNameOffset = Playlist->GetOffset("PlaylistName"); - static auto PlaylistIdOffset = Playlist->GetOffset("PlaylistId"); - - static auto CurrentPlaylistNameOffset = GetOffset("CurrentPlaylistName"); - static auto CurrentPlaylistIdOffset = GetOffset("CurrentPlaylistId"); - - Get(CurrentPlaylistNameOffset) = Playlist->Get(PlaylistNameOffset); - Get(CurrentPlaylistIdOffset) = Playlist->Get(PlaylistIdOffset); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameMode.h b/dependencies/reboot/Project Reboot 3.0/FortGameMode.h deleted file mode 100644 index 6cf34b5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameMode.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "GameMode.h" - -class AFortGameMode : public AGameMode -{ -public: - void SetCurrentPlaylistName(UObject* Playlist); // Techinally it takes in a fname -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameModeAthena.cpp b/dependencies/reboot/Project Reboot 3.0/FortGameModeAthena.cpp deleted file mode 100644 index 36b64c7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameModeAthena.cpp +++ /dev/null @@ -1,1531 +0,0 @@ -#include "FortGameModeAthena.h" - -#include "FortPlayerControllerAthena.h" -#include "FortPlaysetItemDefinition.h" -#include "FortAthenaCreativePortal.h" -#include "BuildingContainer.h" -#include "MegaStormManager.h" -#include "FortLootPackage.h" -#include "FortPlayerPawn.h" -#include "FortPickup.h" -#include "bots.h" - -#include "FortAbilitySet.h" -#include "NetSerialization.h" -#include "GameplayStatics.h" -#include "DataTableFunctionLibrary.h" -#include "LevelStreamingDynamic.h" -#include "KismetStringLibrary.h" -#include "SoftObjectPtr.h" -#include "discord.h" -#include "BuildingGameplayActorSpawnMachine.h" -#include "BP_IslandScripting.h" - -#include "vehicles.h" -#include "globals.h" -#include "events.h" -#include "FortPlaylistAthena.h" -#include "reboot.h" -#include "ai.h" -#include "Map.h" -#include "OnlineReplStructs.h" -#include "BGA.h" -#include "vendingmachine.h" -#include "FortAthenaMutator.h" -#include "calendar.h" -#include "gui.h" -#include - -static UFortPlaylistAthena* GetPlaylistToUse() -{ - // LOG_DEBUG(LogDev, "PlaylistName: {}", PlaylistName); - - auto Playlist = FindObject(PlaylistName); - - if (Globals::bGoingToPlayEvent) - { - if (Fortnite_Version != 12.61) - { - auto EventPlaylist = GetEventPlaylist(); - - if (!EventPlaylist) - { - LOG_ERROR(LogPlaylist, "No event playlist! Turning off going to play event"); - Globals::bGoingToPlayEvent = false; - } - else - { - Playlist = EventPlaylist; - } - } - } - - // SET OVERRIDE PLAYLIST DOWN HERE - - if (Globals::bCreative) - Playlist = FindObject(L"/Game/Athena/Playlists/Creative/Playlist_PlaygroundV2.Playlist_PlaygroundV2"); - - return Playlist; -} - -enum class EFortAthenaPlaylist : uint8_t -{ - AthenaSolo = 0, - AthenaDuo = 1, - AthenaSquad = 2, - EFortAthenaPlaylist_MAX = 3 -}; - -EFortAthenaPlaylist GetPlaylistForOldVersion() -{ - return PlaylistName.contains("Solo") ? EFortAthenaPlaylist::AthenaSolo : PlaylistName.contains("Duo") - ? EFortAthenaPlaylist::AthenaDuo : PlaylistName.contains("Squad") - ? EFortAthenaPlaylist::AthenaSquad : EFortAthenaPlaylist::AthenaSolo; -} - -FName AFortGameModeAthena::RedirectLootTier(const FName& LootTier) -{ - static auto RedirectAthenaLootTierGroupsOffset = this->GetOffset("RedirectAthenaLootTierGroups", false); - - if (RedirectAthenaLootTierGroupsOffset == -1) - { - static auto Loot_TreasureFName = UKismetStringLibrary::Conv_StringToName(L"Loot_Treasure"); - static auto Loot_AmmoFName = UKismetStringLibrary::Conv_StringToName(L"Loot_Ammo"); - - if (LootTier == Loot_TreasureFName) - return UKismetStringLibrary::Conv_StringToName(L"Loot_AthenaTreasure"); - - if (LootTier == Loot_AmmoFName) - return UKismetStringLibrary::Conv_StringToName(L"Loot_AthenaAmmoLarge"); - - return LootTier; - } - - auto& RedirectAthenaLootTierGroups = Get>(RedirectAthenaLootTierGroupsOffset); - - for (auto& Pair : RedirectAthenaLootTierGroups) - { - auto& Key = Pair.Key(); - auto& Value = Pair.Value(); - - // LOG_INFO(LogDev, "[{}] {} {}", i, Key.ComparisonIndex.Value ? Key.ToString() : "NULL", Key.ComparisonIndex.Value ? Value.ToString() : "NULL"); - - if (Key == LootTier) - return Value; - } - - return LootTier; -} - -UClass* AFortGameModeAthena::GetVehicleClassOverride(UClass* DefaultClass) -{ - static auto GetVehicleClassOverrideFn = FindObject(L"/Script/FortniteGame.FortGameModeAthena.GetVehicleClassOverride"); - - if (!GetVehicleClassOverrideFn) - return DefaultClass; - - struct { UClass* DefaultClass; UClass* ReturnValue; } GetVehicleClassOverride_Params{DefaultClass}; - - this->ProcessEvent(GetVehicleClassOverrideFn, &GetVehicleClassOverride_Params); - - return GetVehicleClassOverride_Params.ReturnValue; -} - -void AFortGameModeAthena::SkipAircraft() -{ - // reversed from 10.40 - - auto GameState = GetGameStateAthena(); - - static auto bGameModeWillSkipAircraftOffset = GameState->GetOffset("bGameModeWillSkipAircraft", false); - - if (bGameModeWillSkipAircraftOffset != -1) // hmm? - GameState->Get(bGameModeWillSkipAircraftOffset) = true; - - static auto OnAircraftExitedDropZoneFn = FindObject(L"/Script/FortniteGame.FortGameModeAthena.OnAircraftExitedDropZone"); - - static auto AircraftsOffset = GameState->GetOffset("Aircrafts", false); - - if (AircraftsOffset == -1) - { - static auto AircraftOffset = GameState->GetOffset("Aircraft"); - this->ProcessEvent(OnAircraftExitedDropZoneFn, &GameState->Get(AircraftOffset)); - } - else - { - auto Aircrafts = GameState->GetPtr>(AircraftsOffset); - - for (int i = 0; i < Aircrafts->Num(); i++) - { - this->ProcessEvent(OnAircraftExitedDropZoneFn, &Aircrafts->at(i)); - } - } -} - -void AFortGameModeAthena::HandleSpawnRateForActorClass(UClass* ActorClass, float SpawnPercentage) -{ - TArray AllActors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ActorClass); - - int AmmoBoxesToDelete = std::round(AllActors.Num() - ((AllActors.Num()) * (SpawnPercentage / 100))); - - while (AmmoBoxesToDelete) - { - AllActors.at(rand() % AllActors.Num())->K2_DestroyActor(); - AmmoBoxesToDelete--; - } -} - -void AFortGameModeAthena::StartAircraftPhase() -{ - if (Addresses::StartAircraftPhase) - { - static void (*StartAircraftPhaseOriginal)(AFortGameModeAthena*, bool bDoNotSpawnAircraft) = decltype(StartAircraftPhaseOriginal)(Addresses::StartAircraftPhase); - StartAircraftPhaseOriginal(this, false); // love the double negative fortnite - } - else - { - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startaircraft", nullptr); - } -} - -void AFortGameModeAthena::PauseSafeZone(bool bPaused) -{ - auto GameState = GetGameStateAthena(); - - static auto bSafeZonePausedOffset = GameState->GetOffset("bSafeZonePaused"); - GameState->IsSafeZonePaused() = bPaused; - - auto SafeZoneIndicator = GetSafeZoneIndicator(); - - if (!SafeZoneIndicator) - return; - - static auto TimeRemainingWhenPhasePausedOffset = this->GetOffset("TimeRemainingWhenPhasePaused"); - - if (bPaused) - this->Get(TimeRemainingWhenPhasePausedOffset) = SafeZoneIndicator->GetSafeZoneFinishShrinkTime() - GameState->GetServerWorldTimeSeconds(); - else - SafeZoneIndicator->GetSafeZoneFinishShrinkTime() = GameState->GetServerWorldTimeSeconds() + this->Get(TimeRemainingWhenPhasePausedOffset); -} - -void AFortGameModeAthena::OnAircraftEnteredDropZoneHook(AFortGameModeAthena* GameModeAthena, AActor* Aircraft) -{ - LOG_INFO(LogDev, "OnAircraftEnteredDropZoneHook!"); - - OnAircraftEnteredDropZoneOriginal(GameModeAthena, Aircraft); - - if (Globals::bLateGame.load()) - { - auto GameState = Cast(GameModeAthena->GetGameState()); - GameState->SkipAircraft(); - } -} - -bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* GameMode) -{ - Globals::bHitReadyToStartMatch = true; - - auto GameState = GameMode->GetGameStateAthena(); - - auto SetPlaylist = [&GameState, &GameMode](UObject* Playlist, bool bOnRep) -> void { - if (Fortnite_Version >= 6.10) - { - auto CurrentPlaylistInfo = GameState->GetPtr("CurrentPlaylistInfo"); - - static auto PlaylistReplicationKeyOffset = FindOffsetStruct("/Script/FortniteGame.PlaylistPropertyArray", "PlaylistReplicationKey"); - static auto BasePlaylistOffset = FindOffsetStruct("/Script/FortniteGame.PlaylistPropertyArray", "BasePlaylist"); - static auto OverridePlaylistOffset = FindOffsetStruct("/Script/FortniteGame.PlaylistPropertyArray", "OverridePlaylist"); - - *(UObject**)(__int64(CurrentPlaylistInfo) + BasePlaylistOffset) = Playlist; - *(UObject**)(__int64(CurrentPlaylistInfo) + OverridePlaylistOffset) = Playlist; - - (*(int*)(__int64(CurrentPlaylistInfo) + PlaylistReplicationKeyOffset))++; - CurrentPlaylistInfo->MarkArrayDirty(); - - auto aeuh = *(UObject**)(__int64(CurrentPlaylistInfo) + BasePlaylistOffset); - - if (aeuh) - { - GameMode->SetCurrentPlaylistName(aeuh); - - /* if (Fortnite_Version >= 13) - { - static auto LastSafeZoneIndexOffset = aeuh->GetOffset("LastSafeZoneIndex"); - - if (LastSafeZoneIndexOffset != -1) - { - *(int*)(__int64(aeuh) + LastSafeZoneIndexOffset) = 0; - } - } */ - } - } - else - { - static auto CurrentPlaylistDataOffset = GameState->GetOffset("CurrentPlaylistData", false); - - if (CurrentPlaylistDataOffset != -1) - GameState->Get(CurrentPlaylistDataOffset) = Playlist; - } - - if (bOnRep) - GameState->OnRep_CurrentPlaylistInfo(); - }; - - /* auto& LocalPlayers = GetLocalPlayers(); - - if (LocalPlayers.Num() && LocalPlayers.Data) - { - LocalPlayers.Remove(0); - } */ - - static int LastNum2 = 1; - - if (AmountOfRestarts != LastNum2) - { - LastNum2 = AmountOfRestarts; - - LOG_INFO(LogDev, "Presetup!"); - - if (false) - { - SetupAIGoalManager(); - SetupAIDirector(); - SetupServerBotManager(); - } - // SetupNavConfig(UKismetStringLibrary::Conv_StringToName(L"MANG")); - - /* - - static auto WorldManagerOffset = GameState->GetOffset("WorldManager", false); - - if (WorldManagerOffset != -1) // needed? - { - auto WorldManager = GameState->Get(WorldManagerOffset); - - if (WorldManager) - { - static auto WorldManagerStateOffset = WorldManager->GetOffset("WorldManagerState", false); - - if (WorldManagerStateOffset != -1) // needed? - { - enum class EFortWorldManagerState : uint8_t - { - WMS_Created = 0, - WMS_QueryingWorld = 1, - WMS_WorldQueryComplete = 2, - WMS_CreatingNewWorld = 3, - WMS_LoadingExistingWorld = 4, - WMS_Running = 5, - WMS_Failed = 6, - WMS_MAX = 7 - }; - - LOG_INFO(LogDev, "Old WorldManager State: {}", (int)WorldManager->Get(WorldManagerStateOffset)); - WorldManager->Get(WorldManagerStateOffset) = EFortWorldManagerState::WMS_Running; // needed? right time? - } - } - } - - */ - - static auto WarmupRequiredPlayerCountOffset = GameMode->GetOffset("WarmupRequiredPlayerCount"); - GameMode->Get(WarmupRequiredPlayerCountOffset) = 1; - - static auto CurrentPlaylistDataOffset = GameState->GetOffset("CurrentPlaylistData", false); - - if (CurrentPlaylistDataOffset != -1 || Fortnite_Version >= 6) // idk when they switched off id - { - auto PlaylistToUse = GetPlaylistToUse(); - - if (!PlaylistToUse) - { - LOG_ERROR(LogPlaylist, "Failed to find playlist! Proceeding, but will probably not work as expected!"); - } - else - { - if (Fortnite_Version >= 4) - { - SetPlaylist(PlaylistToUse, true); - - auto CurrentPlaylist = GameState->GetCurrentPlaylist(); - LOG_INFO(LogDev, "Set playlist to {}!", CurrentPlaylist->IsValidLowLevel() ? CurrentPlaylist->GetFullName() : "Invalid"); - } - } - } - else - { - auto OldPlaylist = GetPlaylistForOldVersion(); - } - - auto Fortnite_Season = std::floor(Fortnite_Version); - - // if (false) // Manual foundation showing - { - if (Fortnite_Season >= 7 && Fortnite_Season <= 10) - { - if (Fortnite_Season == 7) - { - ShowFoundation(FindObject("/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Athena_POI_25x36")); // Polar Peak - ShowFoundation(FindObject("/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.ShopsNew")); // Tilted Tower Shops, is this 7.40 specific? - } - - else if (Fortnite_Season == 8) - { - auto Volcano = FindObject(("/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Athena_POI_50x53_Volcano")); - ShowFoundation(Volcano); - } - - else if (Fortnite_Season == 10) - { - if (Fortnite_Version >= 10.20) - { - auto Island = FindObject("/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Athena_StreamingTest16"); - ShowFoundation(Island); - } - } - } - - if (Fortnite_Version == 17.50) { - auto FarmAfter = FindObject(("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.farmbase_2")); - ShowFoundation(FarmAfter); - - auto FarmPhase = FindObject(("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.Farm_Phase_03")); // Farm Phases (Farm_Phase_01, Farm_Phase_02 and Farm_Phase_03) - ShowFoundation(FarmPhase); - } - - if (Fortnite_Version == 17.40) { - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.CoralPhase_02")); // Coral Castle Phases (CoralPhase_01, CoralPhase_02 and CoralPhase_03) - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.LF_Athena_16x16_Foundation_0")); // CoralFoundation_01 - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.LF_Athena_16x16_Foundation6")); // CoralFoundation_05 - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.LF_Athena_16x16_Foundation3")); // CoralFoundation_07 - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.LF_Athena_16x16_Foundation2_1")); // CoralFoundation_10 - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.LF_Athena_16x16_Foundation4")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.LF_Athena_16x16_Foundation5")); - } - - if (Fortnite_Version == 17.30) { - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_Mother.Apollo_Mother.PersistentLevel.Slurpy_Phase03")); // There are 1, 2 and 3 - } - - if (Fortnite_Season == 13) - { - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.Lobby_Foundation")); - - // SpawnIsland->RepData->Soemthing = FoundationSetup->LobbyLocation; - } - - if (Fortnite_Version == 12.41) - { - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.LF_Athena_POI_19x19_2")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.BP_Jerky_Head6_18")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.BP_Jerky_Head5_14")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.BP_Jerky_Head3_8")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.BP_Jerky_Head_2")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.BP_Jerky_Head4_11")); - } - - if (Fortnite_Version == 11.31) - { - // There are also christmas trees & stuff but we need to find a better way to stream that because there's a lot. - - if (false) // If the client loads this, it says the package doesnt exist... - { - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.LF_5x5_Galileo_Ferry_1")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.LF_5x5_Galileo_Ferry_2")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.LF_5x5_Galileo_Ferry_3")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.LF_5x5_Galileo_Ferry_4")); - ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.LF_5x5_Galileo_Ferry_5")); - } - } - - GET_PLAYLIST(GameState); - - if (CurrentPlaylist) - { - static auto AdditionalLevelsOffset = CurrentPlaylist->GetOffset("AdditionalLevels", false); - - if (AdditionalLevelsOffset != -1) - { - auto& AdditionalLevels = CurrentPlaylist->Get>>(AdditionalLevelsOffset); - - static auto AdditionalLevelsServerOnlyOffset = CurrentPlaylist->GetOffset("AdditionalLevelsServerOnly", false); - - if (AdditionalLevelsServerOnlyOffset != -1) - { - /* TArray>& AdditionalLevelsServerOnly = CurrentPlaylist->Get>>(AdditionalLevelsServerOnlyOffset); - LOG_INFO(LogPlaylist, "Loading {} playlist server levels.", AdditionalLevelsServerOnly.Num()); - - for (int i = 0; i < AdditionalLevelsServerOnly.Num(); i++) - { - FName LevelFName = AdditionalLevelsServerOnly.at(i).SoftObjectPtr.ObjectID.AssetPathName; - auto LevelNameStr = LevelFName.ToString(); - LOG_INFO(LogPlaylist, "Loading server level {}.", LevelNameStr); - auto LevelNameWStr = std::wstring(LevelNameStr.begin(), LevelNameStr.end()); - - GameState->AddToAdditionalPlaylistLevelsStreamed(LevelFName, true); - } */ - } - - LOG_INFO(LogPlaylist, "Loading {} playlist levels.", AdditionalLevels.Num()); - - for (int i = 0; i < AdditionalLevels.Num(); i++) - { - FName LevelFName = AdditionalLevels.at(i).SoftObjectPtr.ObjectID.AssetPathName; - auto LevelNameStr = LevelFName.ToString(); - LOG_INFO(LogPlaylist, "Loading level {}.", LevelNameStr); - auto LevelNameWStr = std::wstring(LevelNameStr.begin(), LevelNameStr.end()); - - GameState->AddToAdditionalPlaylistLevelsStreamed(LevelFName); - - /* - - Alright so us calling the OnRep for the level to stream I believe is a bit scuffy, but it's fine. - On newer versions there is another array of ULevelStreaming, and this gets used to see if all the playlist levels are visible. - That array doesn't get filled with the OnRep as I think the array is server only. - I am not sure if this array does anything, but theres a function that checks the array and it gets used especially in mutators. - Funny thing, AFortGameModeAthena::ReadyToStartMatch does not return true unless all of the levels in the array is fully streamed in, but since it's empty it passes. - - */ - - // There is another array of the ULevelStreaming, and I don't think this gets filled by the OnRep (since really our way is hacky as the OnRep has the implementation) - } - - static auto OnRep_AdditionalPlaylistLevelsStreamedFn = FindObject(L"/Script/FortniteGame.FortGameState.OnRep_AdditionalPlaylistLevelsStreamed"); - - if (OnRep_AdditionalPlaylistLevelsStreamedFn) - GameState->ProcessEvent(OnRep_AdditionalPlaylistLevelsStreamedFn); - } - } - } - - if (Fortnite_Version == 7.30) - { - if (true) // idfk if the stage only showed on marshmello playlist - { - auto PleasantParkIdk = FindObject(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.PleasentParkFestivus"); - ShowFoundation(PleasantParkIdk); - } - else - { - auto PleasantParkGround = FindObject(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.PleasentParkDefault"); - ShowFoundation(PleasantParkGround); - } - } - - if (Fortnite_Season == 6) - { - if (Fortnite_Version > 6.10) - { - auto Lake = FindObject(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Lake1"); - auto Lake2 = FindObject(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Lake2"); - - Fortnite_Version <= 6.21 ? ShowFoundation(Lake) : ShowFoundation(Lake2); - } - else - { - auto Lake = FindObject(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Athena_StreamingTest12"); - ShowFoundation(Lake); - } - - auto FloatingIsland = Fortnite_Version <= 6.10 ? FindObject(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_Athena_StreamingTest13") : - FindObject(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.LF_FloatingIsland"); - - ShowFoundation(FloatingIsland); - - auto IslandScripting = ABP_IslandScripting_C::GetIslandScripting(); - - if (IslandScripting) - { - IslandScripting->Initialize(); - } - } - - if (Fortnite_Version == 14.60 && Globals::bGoingToPlayEvent) - { - ShowFoundation(FindObject(L"/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.Lobby_Foundation3")); // Aircraft Carrier - } - - auto TheBlock = FindObject(L"/Game/Athena/Maps/Athena_POI_Foundations.Athena_POI_Foundations.PersistentLevel.SLAB_2"); // SLAB_3 is blank - - if (TheBlock) - ShowFoundation(TheBlock); - - static auto GameState_AirCraftBehaviorOffset = GameState->GetOffset("AirCraftBehavior", false); - - if (GameState_AirCraftBehaviorOffset != -1) - { - GET_PLAYLIST(GameState); - - if (CurrentPlaylist) - { - static auto Playlist_AirCraftBehaviorOffset = CurrentPlaylist->GetOffset("AirCraftBehavior", false); - - if (Playlist_AirCraftBehaviorOffset != -1) - { - GameState->Get(GameState_AirCraftBehaviorOffset) = CurrentPlaylist->Get(Playlist_AirCraftBehaviorOffset); - } - } - } - - static auto bWorldIsReadyOffset = GameMode->GetOffset("bWorldIsReady"); - SetBitfield(GameMode->GetPtr(bWorldIsReadyOffset), 1, true); // idk when we actually set this - - // Calendar::SetSnow(1000); - - static auto DefaultRebootMachineHotfixOffset = GameState->GetOffset("DefaultRebootMachineHotfix", false); - - if (DefaultRebootMachineHotfixOffset != -1) - { - LOG_INFO(LogDev, "before: {}", GameState->Get(DefaultRebootMachineHotfixOffset)); - GameState->Get(DefaultRebootMachineHotfixOffset) = 1; // idk i dont think we need to set - } - - LOG_INFO(LogDev, "Finished presetup!"); - - Globals::bInitializedPlaylist = true; - } - - static int LastNum6 = 1; - - if (AmountOfRestarts != LastNum6) - { - LastNum6 = AmountOfRestarts; - - if (Globals::bGoingToPlayEvent && DoesEventRequireLoading()) - { - bool bb; - LoadEvent(&bb); - - if (!bb) - LastNum6 = -1; - } - } - - static int LastNum5 = 1; - - if (AmountOfRestarts != LastNum5 && LastNum6 == AmountOfRestarts) // Make sure we loaded the event. - { - LastNum5 = AmountOfRestarts; - - if (Globals::bGoingToPlayEvent) - { - bool bb; - CallOnReadys(&bb); - - if (!bb) - LastNum5 = -1; - } - } - - static auto FortPlayerStartCreativeClass = FindObject(L"/Script/FortniteGame.FortPlayerStartCreative"); - static auto FortPlayerStartWarmupClass = FindObject(L"/Script/FortniteGame.FortPlayerStartWarmup"); - TArray Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), Globals::bCreative ? FortPlayerStartCreativeClass : FortPlayerStartWarmupClass); - - int ActorsNum = Actors.Num(); - - Actors.Free(); - - if (ActorsNum == 0) - return false; - - // I don't think this map info check is proper.. We can loop through the Actors in the World's PersistentLevel and check if there is a MapInfo, if there is then we can wait, else don't. - - auto MapInfo = GameState->GetMapInfo(); - - if (!MapInfo && Engine_Version >= 421) - return false; - - static int LastNum = 1; - - if (AmountOfRestarts != LastNum) - { - LastNum = AmountOfRestarts; - - LOG_INFO(LogDev, "Initializing!"); - - if (Fortnite_Version == 3) - SetPlaylist(GetPlaylistToUse(), true); - - LOG_INFO(LogDev, "GameMode 0x{:x}", __int64(GameMode)); - - bool bShouldSkipAircraft = false; - - GET_PLAYLIST(GameState); - - if (CurrentPlaylist) - { - static auto bSkipAircraftOffset = CurrentPlaylist->GetOffset("bSkipAircraft", false); - - if (bSkipAircraftOffset != -1) - bShouldSkipAircraft = CurrentPlaylist->Get(bSkipAircraftOffset); - } - - float Duration = bShouldSkipAircraft ? 0 : 100000; - float EarlyDuration = Duration; - - float TimeSeconds = GameState->GetServerWorldTimeSeconds(); // UGameplayStatics::GetTimeSeconds(GetWorld()); - - static auto WarmupCountdownEndTimeOffset = GameState->GetOffset("WarmupCountdownEndTime"); - static auto WarmupCountdownStartTimeOffset = GameState->GetOffset("WarmupCountdownStartTime"); - static auto WarmupCountdownDurationOffset = GameMode->GetOffset("WarmupCountdownDuration"); - static auto WarmupEarlyCountdownDurationOffset = GameMode->GetOffset("WarmupEarlyCountdownDuration"); - - GameState->Get(WarmupCountdownEndTimeOffset) = TimeSeconds + Duration; - GameMode->Get(WarmupCountdownDurationOffset) = Duration; - - GameState->Get(WarmupCountdownStartTimeOffset) = TimeSeconds; - GameMode->Get(WarmupEarlyCountdownDurationOffset) = EarlyDuration; - - static auto GameSessionOffset = GameMode->GetOffset("GameSession"); - auto GameSession = GameMode->Get(GameSessionOffset); - - static auto MaxPlayersOffset = GameSession->GetOffset("MaxPlayers"); - GameSession->Get(MaxPlayersOffset) = 100; - - GameState->OnRep_CurrentPlaylistInfo(); // ? - - // Calendar::SetSnow(1000); - - static auto bAlwaysDBNOOffset = GameMode->GetOffset("bAlwaysDBNO"); - // GameMode->Get(bAlwaysDBNOOffset) = true; - - static auto GameState_AirCraftBehaviorOffset = GameState->GetOffset("AirCraftBehavior", false); - - if (GameState_AirCraftBehaviorOffset != -1) - { - if (CurrentPlaylist) - { - static auto Playlist_AirCraftBehaviorOffset = CurrentPlaylist->GetOffset("AirCraftBehavior", false); - - if (Playlist_AirCraftBehaviorOffset != -1) - { - GameState->Get(GameState_AirCraftBehaviorOffset) = CurrentPlaylist->Get(Playlist_AirCraftBehaviorOffset); - } - } - } - - LOG_INFO(LogDev, "Initialized!"); - } - - static auto TeamsOffset = GameState->GetOffset("Teams"); - auto& Teams = GameState->Get>(TeamsOffset); - - if (Teams.Num() <= 0) - return false; - - static int LastNum3 = 1; - - if (AmountOfRestarts != LastNum3) - { - LastNum3 = AmountOfRestarts; - ++Globals::AmountOfListens; - - LOG_INFO(LogNet, "Attempting to listen!"); - - GetWorld()->Listen(); - - LOG_INFO(LogNet, "WorldLevel {}", GameState->GetWorldLevel()); - - if (Globals::AmountOfListens == 1) // we only want to do this one time. - { - if (bEnableRebooting) - { - auto GameSessionDedicatedAthenaPatch = Memcury::Scanner::FindPattern("3B 41 38 7F ? 48 8B D0 48 8B 41 30 4C 39 04 D0 75 ? 48 8D 96", false).Get(); // todo check this sig more - - if (GameSessionDedicatedAthenaPatch) - { - PatchBytes(GameSessionDedicatedAthenaPatch, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }); - } - else - { - auto S19Patch = Memcury::Scanner::FindPattern("74 1A 48 8D 97 ? ? ? ? 49 8B CF E8 ? ? ? ? 88 87 ? ? ? ? E9", false).Get(); - - if (S19Patch) - { - PatchByte(S19Patch, 0x75); - } - else - { - auto S18Patch = Memcury::Scanner::FindPattern("75 02 33 F6 41 BE ? ? ? ? 48 85 F6 74 17 48 8D 93").Get(); - - if (S18Patch) - { - PatchByte(S18Patch, 0x74); - } - } - } - - if (bEnableRebooting) - { - HookInstruction(Addresses::RebootingDelegate, (PVOID)ABuildingGameplayActorSpawnMachine::RebootingDelegateHook, "/Script/Engine.PlayerController.SetVirtualJoystickVisibility", ERelativeOffsets::LEA, FindObject("/Script/FortniteGame.Default__BuildingGameplayActorSpawnMachine")); - } - - LOG_INFO(LogDev, "Patched GameSession!"); - } - } - - if (auto TeamsArrayContainer = GameState->GetTeamsArrayContainer()) - { - GET_PLAYLIST(GameState); - - int AllTeamsNum = Teams.Num(); // CurrentPlaylist ? - - LOG_INFO(LogDev, "AllTeamsNum: {}", AllTeamsNum); - - // We aren't "freeing", it's just not zero'd I guess? - - LOG_INFO(LogDev, "TeamsArrayContainer->TeamsArray.Num() Before: {}", TeamsArrayContainer->TeamsArray.Num()); - LOG_INFO(LogDev, "TeamsArrayContainer->SquadsArray.Num() Before: {}", TeamsArrayContainer->SquadsArray.Num()); - - /* - if (TeamsArrayContainer->TeamsArray.Num() != AllTeamsNum) - { - LOG_INFO(LogDev, "Filling TeamsArray!"); - TeamsArrayContainer->TeamsArray.Free(); - TeamsArrayContainer->TeamsArray.AddUninitialized(AllTeamsNum); - } - - if (TeamsArrayContainer->SquadsArray.Num() != AllTeamsNum) - { - LOG_INFO(LogDev, "Filling SquadsArray!"); - TeamsArrayContainer->SquadsArray.Free(); - TeamsArrayContainer->SquadsArray.AddUninitialized(AllTeamsNum); - } - */ - - for (int i = 0; i < TeamsArrayContainer->TeamsArray.Num(); i++) - { - TeamsArrayContainer->TeamsArray.at(i).Free(); - } - - for (int i = 0; i < TeamsArrayContainer->SquadsArray.Num(); i++) - { - TeamsArrayContainer->SquadsArray.at(i).Free(); - } - - TeamsArrayContainer->TeamIndexesArray.Free(); - - for (int i = 0; i < TeamsArrayContainer->TeamsArray.Num(); i++) - { - TeamsArrayContainer->TeamIndexesArray.Add(INT_MAX); // Bro what - } - - TeamsArrayContainer->SquadIdsArray.Free(); - - for (int i = 0; i < TeamsArrayContainer->SquadsArray.Num(); i++) - { - TeamsArrayContainer->SquadIdsArray.Add(INT_MAX); // Bro what - } - } - - auto AllRebootVans = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ABuildingGameplayActorSpawnMachine::StaticClass()); - - for (int i = 0; i < AllRebootVans.Num(); i++) - { - auto CurrentRebootVan = (ABuildingGameplayActorSpawnMachine*)AllRebootVans.at(i); - static auto FortPlayerStartClass = FindObject(L"/Script/FortniteGame.FortPlayerStart"); - CurrentRebootVan->GetResurrectLocation() = CurrentRebootVan->GetClosestActor(FortPlayerStartClass, 450); - } - - AllRebootVans.Free(); - - if (Engine_Version >= 500) - { - GameState->Get("DefaultParachuteDeployTraceForGroundDistance") = 10000; - } - - if (AmountOfBotsToSpawn != 0) - { - Bots::SpawnBotsAtPlayerStarts(AmountOfBotsToSpawn); - } - - UptimeWebHook.send_message(std::format("Server up! {} {}", Fortnite_Version, PlaylistName)); // PlaylistName sometimes isn't always what we use! - - if (std::floor(Fortnite_Version) == 5) - { - auto NewFn = FindObject(L"/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C.New"); - - if (NewFn && (Fortnite_Version == 5.30 ? !Globals::bGoingToPlayEvent : true)) - { - auto Loader = GetEventLoader("/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C"); - - LOG_INFO(LogDev, "Loader: {}", __int64(Loader)); - - if (Loader) - { - int32 NewParam = 1; - // Loader->ProcessEvent(NextFn, &NewParam); - Loader->ProcessEvent(NewFn, &NewParam); - } - } - } - - std::vector WorldNamesToStreamAllFoundationsIn; // wtf - - if (Fortnite_Version == 6.21) - { - WorldNamesToStreamAllFoundationsIn.push_back("/Temp/Game/Athena/Maps/POI/Athena_POI_Lake_002_5d9a86c8.Athena_POI_Lake_002:PersistentLevel."); - } - - if (Fortnite_Version == 7.30) - { - // idk what one we actually need - WorldNamesToStreamAllFoundationsIn.push_back("/Temp/Game/Athena/Maps/POI/Athena_POI_CommunityPark_003_77acf920"); - WorldNamesToStreamAllFoundationsIn.push_back("/Temp/Game/Athena/Maps/POI/Athena_POI_CommunityPark_003_M_5c711338"); - } - - if (WorldNamesToStreamAllFoundationsIn.size() > 0) - { - auto ObjectNum = ChunkedObjects ? ChunkedObjects->Num() : UnchunkedObjects ? UnchunkedObjects->Num() : 0; - - for (int i = 0; i < ObjectNum; i++) - { - auto CurrentObject = GetObjectByIndex(i); - - if (!CurrentObject) - continue; - - static auto BuildingFoundationClass = FindObject(L"/Script/FortniteGame.BuildingFoundation"); - - if (!CurrentObject->IsA(BuildingFoundationClass)) - continue; - - auto CurrentObjectFullName = CurrentObject->GetFullName(); // We can do GetPathName() and starts with but eh. - - for (int z = 0; z < WorldNamesToStreamAllFoundationsIn.size(); z++) - { - if (CurrentObject->GetFullName().contains(WorldNamesToStreamAllFoundationsIn.at(z))) - { - // I think we only have to set bServerStreamedInLevel. - ShowFoundation((AActor*)CurrentObject); - continue; - } - } - } - } - - Globals::bStartedListening = true; - } - - bool Ret = false; - - if (Engine_Version >= 424) // returning true is stripped on c2+ - { - static auto WarmupRequiredPlayerCountOffset = GameMode->GetOffset("WarmupRequiredPlayerCount"); - - if (GameState->GetPlayersLeft() >= GameMode->Get(WarmupRequiredPlayerCountOffset)) - { - // if (MapInfo) - { - // static auto FlightInfosOffset = MapInfo->GetOffset("FlightInfos"); - - // if (MapInfo->Get>(FlightInfosOffset).ArrayNum > 0) - { - // LOG_INFO(LogDev, "ReadyToStartMatch Return Address: 0x{:x}", __int64(_ReturnAddress()) - __int64(GetModuleHandleW(0))); - Ret = true; - } - } - } - } - - if (!Ret) - Ret = Athena_ReadyToStartMatchOriginal(GameMode); - - if (Ret) - { - LOG_INFO(LogDev, "Athena_ReadyToStartMatchOriginal RET!"); // if u dont see this, not good - } - - return Ret; -} - -int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint8 preferredTeam, AActor* Controller) -{ -#if 0 - static int bruh = 3; - return bruh++; -#endif - bool bIsBot = false; - - auto PlayerState = ((APlayerController*)Controller)->GetPlayerState(); - - if (!PlayerState) - { - LOG_ERROR(LogGame, "Player has no playerstate!"); - return 0; - } - - if (PlayerState) - { - bIsBot = PlayerState->IsBot(); - } - - // VERY BASIC IMPLEMENTATION - - // LOG_INFO(LogTeams, "PickTeam called!"); - - auto GameState = Cast(GameMode->GetGameState()); - - static auto CurrentPlaylistDataOffset = GameState->GetOffset("CurrentPlaylistData", false); - - UFortPlaylist* Playlist = nullptr; - - bool bVersionHasPlaylist = false; - - if (CurrentPlaylistDataOffset != -1 || Fortnite_Version >= 6) - { - bVersionHasPlaylist = true; - Playlist = CurrentPlaylistDataOffset == -1 && Fortnite_Version < 6 ? nullptr : GameState->GetCurrentPlaylist(); - } - - static int DefaultFirstTeam = 3; - - bool bShouldSpreadTeams = false; - - if (Playlist) - { - static auto bIsLargeTeamGameOffset = Playlist->GetOffset("bIsLargeTeamGame"); - bool bIsLargeTeamGame = Playlist->Get(bIsLargeTeamGameOffset); - bShouldSpreadTeams = bIsLargeTeamGame; - } - - // bShouldSpreadTeams = true; - - static int CurrentTeamMembers = 0; // bad - static int Current = DefaultFirstTeam; - static int NextTeamIndex = DefaultFirstTeam; - - static int LastNum = 1; - - if (Globals::AmountOfListens != LastNum) - { - LastNum = Globals::AmountOfListens; - - Current = DefaultFirstTeam; - NextTeamIndex = DefaultFirstTeam; - CurrentTeamMembers = 0; - } - - // std::cout << "Dru!\n"; - - int MaxSquadSize = 1; - int TeamsNum = 0; - - if (bVersionHasPlaylist) - { - if (!Playlist) - { - CurrentTeamMembers = 0; - // LOG_INFO(LogTeams, "Player is going on team {} with {} members (No Playlist).", Current, CurrentTeamMembers); - CurrentTeamMembers++; - return Current++; - } - - static auto MaxSquadSizeOffset = Playlist->GetOffset("MaxSquadSize"); - MaxSquadSize = Playlist->Get(MaxSquadSizeOffset); - - static auto bShouldSpreadTeamsOffset = Playlist->GetOffset("bShouldSpreadTeams", false); - - if (bShouldSpreadTeamsOffset != -1) - { - // bShouldSpreadTeams = Playlist->Get(bShouldSpreadTeamsOffset); - } - - static auto MaxTeamCountOffset = Playlist->GetOffset("MaxTeamCount", false); - - if (MaxTeamCountOffset != -1) - TeamsNum = Playlist->Get(MaxTeamCountOffset); - } - else - { - auto OldPlaylist = GetPlaylistForOldVersion(); - MaxSquadSize = OldPlaylist == EFortAthenaPlaylist::AthenaSolo ? 1 - : OldPlaylist == EFortAthenaPlaylist::AthenaDuo ? 2 - : OldPlaylist == EFortAthenaPlaylist::AthenaSquad ? 4 - : 1; - - TeamsNum = 100; - } - - // LOG_INFO(LogTeams, "Before team assigning NextTeamIndex: {} CurrentTeamMembers: {}", NextTeamIndex, CurrentTeamMembers); - - if (!bShouldSpreadTeams) - { - if (CurrentTeamMembers >= MaxSquadSize) - { - NextTeamIndex++; - CurrentTeamMembers = 0; - } - } - else - { - // Basically, this goes through all the teams, and whenever we hit the last team, we go back to the first. - - auto Idx = NextTeamIndex - 2; // 1-100 - - if (CurrentTeamMembers >= 1) // We spread every player. - { - if (Idx >= TeamsNum) - NextTeamIndex = DefaultFirstTeam; - else - NextTeamIndex++; - - CurrentTeamMembers = 0; - } - } - - LOG_INFO(LogTeams, "Spreading Teams {} [{}] Player is going on team {} with {} members.", bShouldSpreadTeams, TeamsNum, NextTeamIndex, CurrentTeamMembers); - - CurrentTeamMembers++; - - auto PlayerStateObjectItem = GetItemByIndex(PlayerState->InternalIndex); - - TWeakObjectPtr WeakPlayerState{}; - WeakPlayerState.ObjectIndex = PlayerState->InternalIndex; - WeakPlayerState.ObjectSerialNumber = PlayerStateObjectItem ? PlayerStateObjectItem->SerialNumber : 0; - - if (PlayerStateObjectItem) - { - if (auto TeamsArrayContainer = GameState->GetTeamsArrayContainer()) - { - TArray>* TeamArray = TeamsArrayContainer->TeamsArray.IsValidIndex(NextTeamIndex) ? TeamsArrayContainer->TeamsArray.AtPtr(NextTeamIndex) : nullptr; - LOG_INFO(LogDev, "TeamsArrayContainer->TeamsArray.Num(): {}", TeamsArrayContainer->TeamsArray.Num()); - - if (TeamArray) - { - LOG_INFO(LogDev, "TeamArray.Num(): {}", TeamArray->Num()); - TeamArray->Add(WeakPlayerState); - } - } - } - - return NextTeamIndex; -} - -void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena* GameMode, AActor* NewPlayerActor) -{ - if (NewPlayerActor == GetLocalPlayerController()) // we dont really need this but it also functions as a nullptr check usually - return; - - auto GameState = GameMode->GetGameStateAthena(); - - static auto CurrentPlaylistDataOffset = GameState->GetOffset("CurrentPlaylistData", false); - auto CurrentPlaylist = CurrentPlaylistDataOffset == -1 && Fortnite_Version < 6 ? nullptr : GameState->GetCurrentPlaylist(); - - LOG_INFO(LogPlayer, "HandleStartingNewPlayer!"); - - if (Globals::bAutoRestart) - { - static int LastNum123 = 15; - - if (GetWorld()->GetNetDriver()->GetClientConnections().Num() >= NumRequiredPlayersToStart && LastNum123 != Globals::AmountOfListens) - { - LastNum123 = Globals::AmountOfListens; - - float Duration = AutoBusStartSeconds; - float EarlyDuration = Duration; - - float TimeSeconds = UGameplayStatics::GetTimeSeconds(GetWorld()); - - static auto WarmupCountdownEndTimeOffset = GameState->GetOffset("WarmupCountdownEndTime"); - static auto WarmupCountdownStartTimeOffset = GameState->GetOffset("WarmupCountdownStartTime"); - static auto WarmupCountdownDurationOffset = GameMode->GetOffset("WarmupCountdownDuration"); - static auto WarmupEarlyCountdownDurationOffset = GameMode->GetOffset("WarmupEarlyCountdownDuration"); - - GameState->Get(WarmupCountdownEndTimeOffset) = TimeSeconds + Duration; - GameMode->Get(WarmupCountdownDurationOffset) = Duration; - - GameState->Get(WarmupCountdownStartTimeOffset) = TimeSeconds; - GameMode->Get(WarmupEarlyCountdownDurationOffset) = EarlyDuration; - - LOG_INFO(LogDev, "Auto starting bus in {}.", AutoBusStartSeconds); - } - } - - // if (Engine_Version < 427) - { - static int LastNum69 = 19451; - - if (LastNum69 != Globals::AmountOfListens) - { - LastNum69 = Globals::AmountOfListens; - - // is there spawn percentage for vending machines? - - bool bShouldDestroyVendingMachines = Fortnite_Version < 3.4 || Engine_Version >= 424; - - if (!bShouldDestroyVendingMachines) - { - if (Globals::bFillVendingMachines) - FillVendingMachines(); - } - else - { - auto VendingMachineClass = FindObject("/Game/Athena/Items/Gameplay/VendingMachine/B_Athena_VendingMachine.B_Athena_VendingMachine_C"); - auto AllVendingMachines = UGameplayStatics::GetAllActorsOfClass(GetWorld(), VendingMachineClass); - - for (int i = 0; i < AllVendingMachines.Num(); i++) - { - auto VendingMachine = (ABuildingItemCollectorActor*)AllVendingMachines.at(i); - - if (!VendingMachine) - continue; - - VendingMachine->K2_DestroyActor(); - } - - AllVendingMachines.Free(); - } - - if (Fortnite_Version < 19) // fr idk what i did too lazy to debug - SpawnBGAs(); - - // Handle spawn rate - - auto MapInfo = GameState->GetMapInfo(); - - if (MapInfo) - { - if (Fortnite_Version >= 3.3) - { - MapInfo->SpawnLlamas(); - } - - if (false) - { - float AmmoBoxMinSpawnPercent = UDataTableFunctionLibrary::EvaluateCurveTableRow( - MapInfo->GetAmmoBoxMinSpawnPercent()->GetCurve().CurveTable, MapInfo->GetAmmoBoxMinSpawnPercent()->GetCurve().RowName, 0 - ); - - float AmmoBoxMaxSpawnPercent = UDataTableFunctionLibrary::EvaluateCurveTableRow( - MapInfo->GetAmmoBoxMaxSpawnPercent()->GetCurve().CurveTable, MapInfo->GetAmmoBoxMaxSpawnPercent()->GetCurve().RowName, 0 - ); - - LOG_INFO(LogDev, "AmmoBoxMinSpawnPercent: {} AmmoBoxMaxSpawnPercent: {}", AmmoBoxMinSpawnPercent, AmmoBoxMaxSpawnPercent); - - std::random_device AmmoBoxRd; - std::mt19937 AmmoBoxGen(AmmoBoxRd()); - std::uniform_int_distribution<> AmmoBoxDis(AmmoBoxMinSpawnPercent * 100, AmmoBoxMaxSpawnPercent * 100 + 1); // + 1 ? - - float AmmoBoxSpawnPercent = AmmoBoxDis(AmmoBoxGen); - - HandleSpawnRateForActorClass(MapInfo->GetAmmoBoxClass(), AmmoBoxSpawnPercent); - } - } - - LOG_INFO(LogDev, "Spawning loot!"); - - auto SpawnIsland_FloorLoot = FindObject(L"/Game/Athena/Environments/Blueprints/Tiered_Athena_FloorLoot_Warmup.Tiered_Athena_FloorLoot_Warmup_C"); - auto BRIsland_FloorLoot = FindObject(L"/Game/Athena/Environments/Blueprints/Tiered_Athena_FloorLoot_01.Tiered_Athena_FloorLoot_01_C"); - - TArray SpawnIsland_FloorLoot_Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), SpawnIsland_FloorLoot); - TArray BRIsland_FloorLoot_Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), BRIsland_FloorLoot); - - auto SpawnIslandTierGroup = UKismetStringLibrary::Conv_StringToName(L"Loot_AthenaFloorLoot_Warmup"); - auto BRIslandTierGroup = UKismetStringLibrary::Conv_StringToName(L"Loot_AthenaFloorLoot"); - - uint8 SpawnFlag = EFortPickupSourceTypeFlag::GetContainerValue(); - - bool bTest = false; - bool bPrintWarmup = bDebugPrintFloorLoot; - - for (int i = 0; i < SpawnIsland_FloorLoot_Actors.Num(); i++) - { - ABuildingContainer* CurrentActor = (ABuildingContainer*)SpawnIsland_FloorLoot_Actors.at(i); - auto Location = CurrentActor->GetActorLocation() + CurrentActor->GetActorForwardVector() * CurrentActor->GetLootSpawnLocation_Athena().X + CurrentActor->GetActorRightVector() * CurrentActor->GetLootSpawnLocation_Athena().Y + CurrentActor->GetActorUpVector() * CurrentActor->GetLootSpawnLocation_Athena().Z; - - std::vector LootDrops = PickLootDrops(SpawnIslandTierGroup, GameState->GetWorldLevel(), -1, bPrintWarmup); - - for (auto& LootDrop : LootDrops) - { - PickupCreateData CreateData; - CreateData.bToss = true; - CreateData.ItemEntry = LootDrop.ItemEntry; - CreateData.SpawnLocation = Location; - CreateData.SourceType = SpawnFlag; - CreateData.bRandomRotation = true; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - auto Pickup = AFortPickup::SpawnPickup(CreateData); - } - - if (!bTest) - CurrentActor->K2_DestroyActor(); - } - - bool bPrintIsland = bDebugPrintFloorLoot; - - int spawned = 0; - - for (int i = 0; i < BRIsland_FloorLoot_Actors.Num(); i++) - { - ABuildingContainer* CurrentActor = (ABuildingContainer*)BRIsland_FloorLoot_Actors.at(i); - spawned++; - - // LOG_INFO(LogDev, "Test: {}", CurrentActor->GetSearchLootTierGroup().ToString()); - - auto Location = CurrentActor->GetActorLocation() + CurrentActor->GetActorForwardVector() * CurrentActor->GetLootSpawnLocation_Athena().X + CurrentActor->GetActorRightVector() * CurrentActor->GetLootSpawnLocation_Athena().Y + CurrentActor->GetActorUpVector() * CurrentActor->GetLootSpawnLocation_Athena().Z; - - std::vector LootDrops = PickLootDrops(BRIslandTierGroup, GameState->GetWorldLevel(), -1, bPrintIsland); - - for (auto& LootDrop : LootDrops) - { - PickupCreateData CreateData; - CreateData.bToss = true; - CreateData.ItemEntry = LootDrop.ItemEntry; - CreateData.SpawnLocation = Location; - CreateData.SourceType = SpawnFlag; - CreateData.bRandomRotation = true; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - auto Pickup = AFortPickup::SpawnPickup(CreateData); - } - - if (!bTest) - CurrentActor->K2_DestroyActor(); - } - - SpawnIsland_FloorLoot_Actors.Free(); - BRIsland_FloorLoot_Actors.Free(); - - LOG_INFO(LogDev, "Spawned loot!"); - } - } - - if (Engine_Version >= 423 && Fortnite_Version <= 12.61) // 423+ we need to spawn manually and vehicle sync doesn't work on >S13. - { - static int LastNum420 = 114; - - if (LastNum420 != Globals::AmountOfListens) - { - LastNum420 = Globals::AmountOfListens; - - SpawnVehicles2(); - } - } - - auto NewPlayer = (AFortPlayerControllerAthena*)NewPlayerActor; - - auto PlayerStateAthena = NewPlayer->GetPlayerStateAthena(); - - if (!PlayerStateAthena) - return Athena_HandleStartingNewPlayerOriginal(GameMode, NewPlayerActor); - - static auto CharacterPartsOffset = PlayerStateAthena->GetOffset("CharacterParts", false); - static auto CustomCharacterPartsStruct = FindObject(L"/Script/FortniteGame.CustomCharacterParts"); - auto CharacterParts = PlayerStateAthena->GetPtr<__int64>(CharacterPartsOffset); - - static auto PartsOffset = FindOffsetStruct("/Script/FortniteGame.CustomCharacterParts", "Parts", false); - auto Parts = (UObject**)(__int64(CharacterParts) + PartsOffset); // UCustomCharacterPart* Parts[0x6] - - static auto CustomCharacterPartClass = FindObject(L"/Script/FortniteGame.CustomCharacterPart"); - - if (Globals::bNoMCP) - { - if (CharacterPartsOffset != -1) // && CustomCharacterPartsStruct) - { - static auto headPart = LoadObject("/Game/Characters/CharacterParts/Female/Medium/Heads/F_Med_Head1.F_Med_Head1", CustomCharacterPartClass); - static auto bodyPart = LoadObject("/Game/Characters/CharacterParts/Female/Medium/Bodies/F_Med_Soldier_01.F_Med_Soldier_01", CustomCharacterPartClass); - static auto backpackPart = LoadObject("/Game/Characters/CharacterParts/Backpacks/NoBackpack.NoBackpack", CustomCharacterPartClass); - - Parts[(int)EFortCustomPartType::Head] = headPart; - Parts[(int)EFortCustomPartType::Body] = bodyPart; - Parts[(int)EFortCustomPartType::Backpack] = backpackPart; - - static auto OnRep_CharacterPartsFn = FindObject(L"/Script/FortniteGame.FortPlayerState.OnRep_CharacterParts"); - PlayerStateAthena->ProcessEvent(OnRep_CharacterPartsFn); - } - } - - NewPlayer->GetMatchReport() = (UAthenaPlayerMatchReport*)UGameplayStatics::SpawnObject(UAthenaPlayerMatchReport::StaticClass(), NewPlayer); // idk when to do this - - static auto SquadIdOffset = PlayerStateAthena->GetOffset("SquadId", false); - - if (SquadIdOffset != -1) - PlayerStateAthena->GetSquadId() = PlayerStateAthena->GetTeamIndex() - NumToSubtractFromSquadId; // wrong place to do this - - TWeakObjectPtr WeakPlayerState{}; - WeakPlayerState.ObjectIndex = PlayerStateAthena->InternalIndex; - WeakPlayerState.ObjectSerialNumber = GetItemByIndex(PlayerStateAthena->InternalIndex)->SerialNumber; - - if (auto TeamsArrayContainer = GameState->GetTeamsArrayContainer()) - { - auto& SquadArray = TeamsArrayContainer->SquadsArray.at(PlayerStateAthena->GetSquadId()); - SquadArray.Add(WeakPlayerState); - } - - GameState->AddPlayerStateToGameMemberInfo(PlayerStateAthena); - - LOG_INFO(LogDev, "New player going on TeamIndex {} with SquadId {}", PlayerStateAthena->GetTeamIndex(), SquadIdOffset != -1 ? PlayerStateAthena->GetSquadId() : -1); - - // idk if this is needed - - static auto bHasServerFinishedLoadingOffset = NewPlayer->GetOffset("bHasServerFinishedLoading"); - NewPlayer->Get(bHasServerFinishedLoadingOffset) = true; - - static auto OnRep_bHasServerFinishedLoadingFn = FindObject(L"/Script/FortniteGame.FortPlayerController.OnRep_bHasServerFinishedLoading"); - NewPlayer->ProcessEvent(OnRep_bHasServerFinishedLoadingFn); - - static auto bHasStartedPlayingOffset = PlayerStateAthena->GetOffset("bHasStartedPlaying"); - static auto bHasStartedPlayingFieldMask = GetFieldMask(PlayerStateAthena->GetProperty("bHasStartedPlaying")); - PlayerStateAthena->SetBitfieldValue(bHasStartedPlayingOffset, bHasStartedPlayingFieldMask, true); - - static auto OnRep_bHasStartedPlayingFn = FindObject(L"/Script/FortniteGame.FortPlayerState.OnRep_bHasStartedPlaying"); - PlayerStateAthena->ProcessEvent(OnRep_bHasStartedPlayingFn); - - PlayerStateAthena->GetWorldPlayerId() = PlayerStateAthena->GetPlayerID(); - - auto PlayerAbilitySet = GetPlayerAbilitySet(); - auto AbilitySystemComponent = PlayerStateAthena->GetAbilitySystemComponent(); - - if (PlayerAbilitySet) - { - PlayerAbilitySet->GiveToAbilitySystem(AbilitySystemComponent); - } - - static auto PlayerCameraManagerOffset = NewPlayer->GetOffset("PlayerCameraManager"); - auto PlayerCameraManager = NewPlayer->Get(PlayerCameraManagerOffset); - - if (PlayerCameraManager) - { - static auto ViewRollMinOffset = PlayerCameraManager->GetOffset("ViewRollMin"); - PlayerCameraManager->Get(ViewRollMinOffset) = 0; - - static auto ViewRollMaxOffset = PlayerCameraManager->GetOffset("ViewRollMax"); - PlayerCameraManager->Get(ViewRollMaxOffset) = 0; - } - - if (Globals::bCreative) - { - static auto CreativePortalManagerOffset = GameState->GetOffset("CreativePortalManager"); - auto CreativePortalManager = GameState->Get(CreativePortalManagerOffset); - - static auto AvailablePortalsOffset = CreativePortalManager->GetOffset("AvailablePortals", false); - - AFortAthenaCreativePortal* Portal = nullptr; - - if (AvailablePortalsOffset != -1) - { - auto& AvailablePortals = CreativePortalManager->Get>(AvailablePortalsOffset); - - if (AvailablePortals.Num() > 0) - { - Portal = (AFortAthenaCreativePortal*)AvailablePortals.at(0); - AvailablePortals.Remove(0); - - static auto UsedPortalsOffset = CreativePortalManager->GetOffset("UsedPortals"); - auto& UsedPortals = CreativePortalManager->Get>(UsedPortalsOffset); - UsedPortals.Add(Portal); - } - else - { - LOG_WARN(LogCreative, "AvaliablePortals size is 0!"); - } - } - else - { - static auto AllPortalsOffset = CreativePortalManager->GetOffset("AllPortals"); - auto& AllPortals = CreativePortalManager->Get>(AllPortalsOffset); - - for (int i = 0; i < AllPortals.size(); i++) - { - auto CurrentPortal = AllPortals.at(i); - - if (!CurrentPortal->GetLinkedVolume() || CurrentPortal->GetLinkedVolume()->GetVolumeState() == EVolumeState::Ready) - continue; - - Portal = CurrentPortal; - break; - } - } - - if (Portal) - { - // Portal->GetCreatorName() = PlayerStateAthena->GetPlayerName(); - - auto OwningPlayer = Portal->GetOwningPlayer(); - - static auto UniqueIdOffset = PlayerStateAthena->GetOffset("UniqueId"); - auto PlayerStateUniqueId = PlayerStateAthena->GetPtr(UniqueIdOffset); - - if (OwningPlayer != nullptr) - { - CopyStruct(OwningPlayer, PlayerStateUniqueId, FUniqueNetIdRepl::GetSizeOfStruct()); - // *(FUniqueNetIdReplExperimental*)OwningPlayer = PlayerStateUniqueId; - } - - Portal->GetPortalOpen() = true; - - static auto PlayersReadyOffset = Portal->GetOffset("PlayersReady", false); - - if (PlayersReadyOffset != -1) - { - auto& PlayersReady = Portal->Get>(PlayersReadyOffset); - PlayersReady.AddPtr(PlayerStateUniqueId, FUniqueNetIdRepl::GetSizeOfStruct()); // im not even sure what this is for - } - - static auto bUserInitiatedLoadOffset = Portal->GetOffset("bUserInitiatedLoad", false); - - if (bUserInitiatedLoadOffset != -1) - Portal->GetUserInitiatedLoad() = true; - - Portal->GetInErrorState() = false; - - static auto OwnedPortalOffset = NewPlayer->GetOffset("OwnedPortal"); - NewPlayer->Get(OwnedPortalOffset) = Portal; - - NewPlayer->GetCreativePlotLinkedVolume() = Portal->GetLinkedVolume(); - - // OnRep_CreativePlotLinkedVolume ? - - Portal->GetLinkedVolume()->GetVolumeState() = EVolumeState::Ready; - - static auto IslandPlayset = FindObject("/Game/Playsets/PID_Playset_60x60_Composed.PID_Playset_60x60_Composed"); - - if (auto Volume = NewPlayer->GetCreativePlotLinkedVolume()) - { - // if (IslandPlayset) - // Volume->UpdateSize({ (float)IslandPlayset->Get("SizeX"), (float)IslandPlayset->Get("SizeY"), (float)IslandPlayset->Get("SizeZ") }); - - static auto FortLevelSaveComponentClass = FindObject("/Script/FortniteGame.FortLevelSaveComponent"); - auto LevelSaveComponent = (UObject*)Volume->GetComponentByClass(FortLevelSaveComponentClass); - - if (LevelSaveComponent) - { - static auto AccountIdOfOwnerOffset = LevelSaveComponent->GetOffset("AccountIdOfOwner"); - LevelSaveComponent->GetPtr(AccountIdOfOwnerOffset)->CopyFromAnotherUniqueId(PlayerStateUniqueId); - // CopyStruct(LevelSaveComponent->GetPtr(AccountIdOfOwnerOffset), PlayerStateUniqueId, FUniqueNetIdRepl::GetSizeOfStruct()); - // LevelSaveComponent->Get(AccountIdOfOwnerOffset) = PlayerStateUniqueId; - - static auto bIsLoadedOffset = LevelSaveComponent->GetOffset("bIsLoaded"); - LevelSaveComponent->Get(bIsLoadedOffset) = true; - } - } - - UFortPlaysetItemDefinition::ShowPlayset(IslandPlayset, Portal->GetLinkedVolume()); - - LOG_INFO(LogCreative, "Initialized player portal!"); - } - else - { - LOG_INFO(LogCreative, "Failed to find an open portal!"); - } - } - - LOG_INFO(LogDev, "HandleStartingNewPlayer end"); - - if (Engine_Version <= 420) - { - static auto OverriddenBackpackSizeOffset = NewPlayer->GetOffset("OverriddenBackpackSize"); - LOG_INFO(LogDev, "NewPlayer->Get(OverriddenBackpackSizeOffset): {}", NewPlayer->Get(OverriddenBackpackSizeOffset)); - NewPlayer->Get(OverriddenBackpackSizeOffset) = 5; - } - - return Athena_HandleStartingNewPlayerOriginal(GameMode, NewPlayerActor); -} - -void AFortGameModeAthena::SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK) -{ - LOG_INFO(LogDev, "OverridePhaseMaybeIDFK: {}", OverridePhaseMaybeIDFK); - return SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); -} diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameModeAthena.h b/dependencies/reboot/Project Reboot 3.0/FortGameModeAthena.h deleted file mode 100644 index 0a8bab5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameModeAthena.h +++ /dev/null @@ -1,275 +0,0 @@ -#pragma once - -#include "FortGameModePvPBase.h" -#include "FortGameStateAthena.h" -#include "KismetStringLibrary.h" -#include "reboot.h" -#include "BuildingSMActor.h" -#include "FortSafeZoneIndicator.h" -#include "GameplayStatics.h" -#include "FortAbilitySet.h" -#include "FortPlayerControllerAthena.h" -#include "FortItemDefinition.h" - -struct FAircraftFlightInfo -{ - float& GetTimeTillDropStart() - { - static auto TimeTillDropStartOffset = FindOffsetStruct("/Script/FortniteGame.AircraftFlightInfo", "TimeTillDropStart"); - return *(float*)(__int64(this) + TimeTillDropStartOffset); - } - - FVector& GetFlightStartLocation() - { - static auto FlightStartLocationOffset = FindOffsetStruct("/Script/FortniteGame.AircraftFlightInfo", "FlightStartLocation"); - return *(FVector*)(__int64(this) + FlightStartLocationOffset); - } - - float& GetFlightSpeed() - { - static auto FlightSpeedOffset = FindOffsetStruct("/Script/FortniteGame.AircraftFlightInfo", "FlightSpeed"); - return *(float*)(__int64(this) + FlightSpeedOffset); - } - - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.AircraftFlightInfo"); - return Struct; - } - - static int GetStructSize() - { - return GetStruct()->GetPropertiesSize(); - } -}; - -static void SetFoundationTransform(AActor* BuildingFoundation, const FTransform& Transform) -{ - static auto DynamicFoundationRepDataOffset = BuildingFoundation->GetOffset("DynamicFoundationRepData", false); - - static auto DynamicFoundationTransformOffset = BuildingFoundation->GetOffset("DynamicFoundationTransform", false); - - if (DynamicFoundationTransformOffset != -1) // needed check? - { - *BuildingFoundation->GetPtr(DynamicFoundationTransformOffset) = Transform; - } - - if (DynamicFoundationRepDataOffset != -1) - { - auto DynamicFoundationRepData = BuildingFoundation->GetPtr(DynamicFoundationRepDataOffset); - - static auto RotationOffset = FindOffsetStruct("/Script/FortniteGame.DynamicBuildingFoundationRepData", "Rotation"); - static auto TranslationOffset = FindOffsetStruct("/Script/FortniteGame.DynamicBuildingFoundationRepData", "Translation"); - - if (DynamicFoundationTransformOffset != -1) // needed check? - { - auto DynamicFoundationTransform = BuildingFoundation->GetPtr(DynamicFoundationTransformOffset); - - if (Fortnite_Version >= 13) - *(FRotator*)(__int64(DynamicFoundationRepData) + RotationOffset) = DynamicFoundationTransform->Rotation.Rotator(); - else - *(FQuat*)(__int64(DynamicFoundationRepData) + RotationOffset) = DynamicFoundationTransform->Rotation; - - *(FVector*)(__int64(DynamicFoundationRepData) + TranslationOffset) = DynamicFoundationTransform->Translation; - } - - static auto OnRep_DynamicFoundationRepDataFn = FindObject(L"/Script/FortniteGame.BuildingFoundation.OnRep_DynamicFoundationRepData"); - BuildingFoundation->ProcessEvent(OnRep_DynamicFoundationRepDataFn); - } -} - -static inline UFortAbilitySet* GetPlayerAbilitySet() -{ - // There are some variables that contain this but it changes through versions soo.. - - static auto GameplayAbilitySet = (UFortAbilitySet*)(Fortnite_Version >= 8.30 - ? LoadObject(L"/Game/Abilities/Player/Generic/Traits/DefaultPlayer/GAS_AthenaPlayer.GAS_AthenaPlayer", UFortAbilitySet::StaticClass()) - : LoadObject(L"/Game/Abilities/Player/Generic/Traits/DefaultPlayer/GAS_DefaultPlayer.GAS_DefaultPlayer", UFortAbilitySet::StaticClass())); - - return GameplayAbilitySet; -} - -static void ShowFoundation(AActor* BuildingFoundation, bool bShow = true) -{ - if (!BuildingFoundation) - { - LOG_WARN(LogGame, "Attempting to show invalid building foundation."); - return; - } - - LOG_INFO(LogDev, "{} {}", bShow ? "Showing" : "Hiding", BuildingFoundation->GetName()); - - bool bServerStreamedInLevelValue = bShow; // ?? - - static auto bServerStreamedInLevelFieldMask = GetFieldMask(BuildingFoundation->GetProperty("bServerStreamedInLevel")); - static auto bServerStreamedInLevelOffset = BuildingFoundation->GetOffset("bServerStreamedInLevel"); - BuildingFoundation->SetBitfieldValue(bServerStreamedInLevelOffset, bServerStreamedInLevelFieldMask, bServerStreamedInLevelValue); - - static auto bFoundationEnabledOffset = BuildingFoundation->GetOffset("bFoundationEnabled", false); - - if (bFoundationEnabledOffset != -1) - { - static auto bFoundationEnabledFieldMask = GetFieldMask(BuildingFoundation->GetProperty("bFoundationEnabled")); - BuildingFoundation->SetBitfieldValue(bFoundationEnabledOffset, bFoundationEnabledFieldMask, bShow); - - // theres a onrep too - } - - static auto StartDisabled = 3; - static auto StartEnabled_Dynamic = 2; - static auto Static = 0; - - static auto DynamicFoundationTypeOffset = BuildingFoundation->GetOffset("DynamicFoundationType", false); - - if (DynamicFoundationTypeOffset != -1) - BuildingFoundation->Get(DynamicFoundationTypeOffset) = bShow ? Static : StartDisabled; - - /* static auto bShowHLODWhenDisabledOffset = BuildingFoundation->GetOffset("bShowHLODWhenDisabled", false); - - if (bShowHLODWhenDisabledOffset != -1) - { - static auto bShowHLODWhenDisabledFieldMask = GetFieldMask(BuildingFoundation->GetProperty("bShowHLODWhenDisabled")); - BuildingFoundation->SetBitfieldValue(bShowHLODWhenDisabledOffset, bShowHLODWhenDisabledFieldMask, true); - } */ - - static auto OnRep_ServerStreamedInLevelFn = FindObject(L"/Script/FortniteGame.BuildingFoundation.OnRep_ServerStreamedInLevel"); - BuildingFoundation->ProcessEvent(OnRep_ServerStreamedInLevelFn); - - static auto Enabled = 1; - static auto Disabled = 2; - - static auto FoundationEnabledStateOffset = BuildingFoundation->GetOffset("FoundationEnabledState", false); - - LOG_INFO(LogDev, "BuildingFoundation->Get(FoundationEnabledStateOffset) Prev: {}", (int)BuildingFoundation->Get(FoundationEnabledStateOffset)); - - if (FoundationEnabledStateOffset != -1) - BuildingFoundation->Get(FoundationEnabledStateOffset) = bShow ? Enabled : Disabled; - - static auto LevelToStreamOffset = BuildingFoundation->GetOffset("LevelToStream"); - auto& LevelToStream = BuildingFoundation->Get(LevelToStreamOffset); - - /* if (bShow) - { - UGameplayStatics::LoadStreamLevel(GetWorld(), LevelToStream, true, false, FLatentActionInfo()); - } - else - { - UGameplayStatics::UnloadStreamLevel(GetWorld(), LevelToStream, FLatentActionInfo(), false); - } */ - - static auto OnRep_LevelToStreamFn = FindObject(L"/Script/FortniteGame.BuildingFoundation.OnRep_LevelToStream"); - BuildingFoundation->ProcessEvent(OnRep_LevelToStreamFn); - - static auto DynamicFoundationRepDataOffset = BuildingFoundation->GetOffset("DynamicFoundationRepData", false); - - if (DynamicFoundationRepDataOffset != -1) - { - auto DynamicFoundationRepData = BuildingFoundation->GetPtr(DynamicFoundationRepDataOffset); - - static auto EnabledStateOffset = FindOffsetStruct("/Script/FortniteGame.DynamicBuildingFoundationRepData", "EnabledState"); - *(uint8_t*)(__int64(DynamicFoundationRepData) + EnabledStateOffset) = bShow ? Enabled : Disabled; - - if (false) - { - static auto TranslationOffset = FindOffsetStruct("/Script/FortniteGame.DynamicBuildingFoundationRepData", "Translation"); - static auto RotationOffset = FindOffsetStruct("/Script/FortniteGame.DynamicBuildingFoundationRepData", "Rotation"); - - *(FVector*)(__int64(DynamicFoundationRepData) + TranslationOffset) = BuildingFoundation->GetActorLocation(); - - const FRotator BuildingRotation = BuildingFoundation->GetActorRotation(); - - if (Fortnite_Version >= 13) - *(FRotator*)(__int64(DynamicFoundationRepData) + RotationOffset) = BuildingRotation; - else - *(FQuat*)(__int64(DynamicFoundationRepData) + RotationOffset) = BuildingRotation.Quaternion(); - - static auto OnRep_DynamicFoundationRepDataFn = FindObject(L"/Script/FortniteGame.BuildingFoundation.OnRep_DynamicFoundationRepData"); - BuildingFoundation->ProcessEvent(OnRep_DynamicFoundationRepDataFn); - } - else - { - SetFoundationTransform(BuildingFoundation, BuildingFoundation->GetTransform()); - } - } - - BuildingFoundation->FlushNetDormancy(); - BuildingFoundation->ForceNetUpdate(); -} - -static void StreamLevel(const std::string& LevelName, FVector Location = {}) -{ - static auto BuildingFoundation3x3Class = FindObject(L"/Script/FortniteGame.BuildingFoundation3x3"); - FTransform Transform{}; - Transform.Scale3D = { 1, 1, 1 }; - Transform.Translation = Location; - auto BuildingFoundation = GetWorld()->SpawnActor(BuildingFoundation3x3Class, Transform); - - if (!BuildingFoundation) - { - LOG_ERROR(LogGame, "Failed to spawn BuildingFoundation for streaming!"); - return; - } - - static auto FoundationNameOffset = FindOffsetStruct("/Script/FortniteGame.BuildingFoundationStreamingData", "FoundationName"); - static auto FoundationLocationOffset = FindOffsetStruct("/Script/FortniteGame.BuildingFoundationStreamingData", "FoundationLocation"); - static auto StreamingDataOffset = BuildingFoundation->GetOffset("StreamingData"); - static auto LevelToStreamOffset = BuildingFoundation->GetOffset("LevelToStream"); - - auto StreamingData = BuildingFoundation->GetPtr<__int64>(StreamingDataOffset); - - *(FName*)(__int64(StreamingData) + FoundationNameOffset) = UKismetStringLibrary::Conv_StringToName(std::wstring(LevelName.begin(), LevelName.end()).c_str()); - *(FVector*)(__int64(StreamingData) + FoundationLocationOffset) = Location; - - *(FName*)(__int64(BuildingFoundation) + LevelToStreamOffset) = UKismetStringLibrary::Conv_StringToName(std::wstring(LevelName.begin(), LevelName.end()).c_str()); - - static auto OnRep_LevelToStreamFn = FindObject(L"/Script/FortniteGame.BuildingFoundation.OnRep_LevelToStream"); - BuildingFoundation->ProcessEvent(OnRep_LevelToStreamFn); - - ShowFoundation(BuildingFoundation); -} - -class AFortGameModeAthena : public AFortGameModePvPBase -{ -public: - static inline bool (*Athena_ReadyToStartMatchOriginal)(AFortGameModeAthena* GameMode); - static inline void (*Athena_HandleStartingNewPlayerOriginal)(AFortGameModeAthena* GameMode, AActor* NewPlayer); - static inline void (*SetZoneToIndexOriginal)(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK); - static inline void (*OnAircraftEnteredDropZoneOriginal)(AFortGameModeAthena* GameModeAthena, AActor* Aircraft); - - AFortSafeZoneIndicator*& GetSafeZoneIndicator() - { - static auto SafeZoneIndicatorOffset = GetOffset("SafeZoneIndicator"); - return Get(SafeZoneIndicatorOffset); - } - - AFortGameStateAthena* GetGameStateAthena() - { - return (AFortGameStateAthena*)GetGameState(); - } - - TArray& GetStartingItems() // really in zone - { - static auto StartingItemsOffset = GetOffset("StartingItems"); - return Get>(StartingItemsOffset); - } - - TArray& GetAlivePlayers() - { - static auto AlivePlayersOffset = GetOffset("AlivePlayers"); - return Get>(AlivePlayersOffset); - } - - FName RedirectLootTier(const FName& LootTier); - UClass* GetVehicleClassOverride(UClass* DefaultClass); - void SkipAircraft(); - void PauseSafeZone(bool bPaused = true); - void StartAircraftPhase(); - - static void HandleSpawnRateForActorClass(UClass* ActorClass, float SpawnPercentage); // idk where to put - - static void OnAircraftEnteredDropZoneHook(AFortGameModeAthena* GameModeAthena, AActor* Aircraft); - static bool Athena_ReadyToStartMatchHook(AFortGameModeAthena* GameMode); - static int Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint8 preferredTeam, AActor* Controller); - static void Athena_HandleStartingNewPlayerHook(AFortGameModeAthena* GameMode, AActor* NewPlayerActor); - static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameModePickup.h b/dependencies/reboot/Project Reboot 3.0/FortGameModePickup.h deleted file mode 100644 index f8db792..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameModePickup.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "FortPickup.h" - -class AFortGameModePickup : public AFortPickup//Athena -{ -public: - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortGameModePickup"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameModePvPBase.h b/dependencies/reboot/Project Reboot 3.0/FortGameModePvPBase.h deleted file mode 100644 index e049d5f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameModePvPBase.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "FortGameModeZone.h" - -class AFortGameModePvPBase : public AFortGameModeZone -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameModeZone.cpp b/dependencies/reboot/Project Reboot 3.0/FortGameModeZone.cpp deleted file mode 100644 index 3ad8413..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameModeZone.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "FortGameModeZone.h" - -#include "KismetStringLibrary.h" - -#include "reboot.h" - -UClass* AFortGameModeZone::StaticClass() -{ - static auto Class = FindObject(L"/Script/FortniteGame.FortGameModeZone"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameModeZone.h b/dependencies/reboot/Project Reboot 3.0/FortGameModeZone.h deleted file mode 100644 index c54a53c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameModeZone.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "FortGameMode.h" - -#include "Engine.h" - -class AFortGameModeZone : public AFortGameMode -{ -public: - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameSessionDedicatedAthena.cpp b/dependencies/reboot/Project Reboot 3.0/FortGameSessionDedicatedAthena.cpp deleted file mode 100644 index 4fb4c0b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameSessionDedicatedAthena.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "FortGameSessionDedicatedAthena.h" -#include "GameplayStatics.h" -#include "FortPlayerStateAthena.h" - -#include "FortPlayerControllerAthena.h" -#include "OnlineReplStructs.h" -#include "gui.h" - -uint8 AFortGameSessionDedicatedAthena::GetSquadIdForCurrentPlayerHook(AFortGameSessionDedicatedAthena* GameSessionDedicated, void* UniqueId) -{ - LOG_INFO(LogDev, "GetSquadIdForCurrentPlayerHook!"); - - TArray CONTRTOLLERS = UGameplayStatics::GetAllActorsOfClass(GetWorld(), AFortPlayerControllerAthena::StaticClass()); - - auto OwnerUniqueId = (FUniqueNetIdRepl*)UniqueId; - - LOG_INFO(LogDev, "OwnerUniqueId->GetReplicationBytes().Num(): {}", OwnerUniqueId->GetReplicationBytes().Num()); - - /* - - for (int i = 0; i < OwnerUniqueId->GetReplicationBytes().Num(); i++) - { - LOG_INFO(LogDev, "[{}] Byte: 0x{:x}", i, OwnerUniqueId->GetReplicationBytes().at(i)); - } - - */ - - for (int i = 0; i < CONTRTOLLERS.Num(); i++) - { - auto Controller = (AFortPlayerControllerAthena*)CONTRTOLLERS.at(i); - auto PlayerState = Cast(Controller->GetPlayerState()); - - if (!PlayerState) - continue; - - // return PlayerState->GetTeamIndex() - NumToSubtractFromSquadId; - - static auto UniqueIdOffset = PlayerState->GetOffset("UniqueId"); - - // if (IsBadReadPtr(PlayerState->GetPtr(UniqueIdOffset))) - // continue; - - LOG_INFO(LogDev, "PS PlayerState->GetPtr(UniqueIdOffset)->GetReplicationBytes().Num(): {}", PlayerState->GetPtr(UniqueIdOffset)->GetReplicationBytes().Num()); - - if (PlayerState->GetPtr(UniqueIdOffset)->IsIdentical(OwnerUniqueId)) - { - LOG_INFO(LogDev, "Found {}!", PlayerState->GetPlayerName().ToString()); - return PlayerState->GetTeamIndex() - NumToSubtractFromSquadId; - } - } - - CONTRTOLLERS.Free(); - - LOG_INFO(LogDev, "Failed to find SquadId!"); - - return 0; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameSessionDedicatedAthena.h b/dependencies/reboot/Project Reboot 3.0/FortGameSessionDedicatedAthena.h deleted file mode 100644 index 88dcda8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameSessionDedicatedAthena.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "reboot.h" - -class AFortGameSessionDedicatedAthena : public AActor -{ -public: - static uint8 GetSquadIdForCurrentPlayerHook(AFortGameSessionDedicatedAthena* GameSessionDedicated, void* UniqueId); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameStateAthena.cpp b/dependencies/reboot/Project Reboot 3.0/FortGameStateAthena.cpp deleted file mode 100644 index be75c24..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameStateAthena.cpp +++ /dev/null @@ -1,400 +0,0 @@ -#include "FortGameStateAthena.h" - -#include "reboot.h" -#include "FortPlayerStateAthena.h" -#include "FortGameModeAthena.h" -#include "FortAthenaMutator.h" -#include "gui.h" -#include "LevelStreamingDynamic.h" - -void AFortGameStateAthena::AddPlayerStateToGameMemberInfo(AFortPlayerStateAthena* PlayerState) -{ - static auto GameMemberInfoArrayOffset = this->GetOffset("GameMemberInfoArray", false); - - if (GameMemberInfoArrayOffset == -1) - return; - - static auto UniqueIdOffset = PlayerState->GetOffset("UniqueId"); - auto PlayerStateUniqueId = PlayerState->GetPtr(UniqueIdOffset); - - struct FUniqueNetIdWrapper - { - unsigned char UnknownData00[0x1]; // 0x0000(0x0001) MISSED OFFSET - }; - - struct FUniqueNetIdReplExperimental : public FUniqueNetIdWrapper - { - unsigned char UnknownData00[0x17]; // 0x0001(0x0017) MISSED OFFSET - TArray ReplicationBytes; // 0x0018(0x0010) (ZeroConstructor, Transient, Protected, NativeAccessSpecifierProtected) - }; - - struct FGameMemberInfo : public FFastArraySerializerItem - { - unsigned char SquadId; // 0x000C(0x0001) (ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - unsigned char TeamIndex; // 0x000D(0x0001) (ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - unsigned char UnknownData00[0x2]; // 0x000E(0x0002) MISSED OFFSET - FUniqueNetIdReplExperimental MemberUniqueId; // 0x0010(0x0028) (HasGetValueTypeHash, NativeAccessSpecifierPublic) - }; - - static auto GameMemberInfoStructSize = 0x38; - // LOG_INFO(LogDev, "Compare: 0x{:x} 0x{:x}", GameMemberInfoStructSize, sizeof(FGameMemberInfo)); - - auto GameMemberInfo = Alloc<__int64>(GameMemberInfoStructSize); - - ((FFastArraySerializerItem*)GameMemberInfo)->MostRecentArrayReplicationKey = -1; - ((FFastArraySerializerItem*)GameMemberInfo)->ReplicationID = -1; - ((FFastArraySerializerItem*)GameMemberInfo)->ReplicationKey = -1; - - if (false) - { - static auto GameMemberInfo_SquadIdOffset = 0x000C; - static auto GameMemberInfo_TeamIndexOffset = 0x000D; - static auto GameMemberInfo_MemberUniqueIdOffset = 0x0010; - static auto UniqueIdSize = FUniqueNetIdRepl::GetSizeOfStruct(); - - *(uint8*)(__int64(GameMemberInfo) + GameMemberInfo_SquadIdOffset) = PlayerState->GetSquadId(); - *(uint8*)(__int64(GameMemberInfo) + GameMemberInfo_TeamIndexOffset) = PlayerState->GetTeamIndex(); - CopyStruct((void*)(__int64(GameMemberInfo) + GameMemberInfo_MemberUniqueIdOffset), PlayerStateUniqueId, UniqueIdSize); - } - else - { - ((FGameMemberInfo*)GameMemberInfo)->SquadId = PlayerState->GetSquadId(); - ((FGameMemberInfo*)GameMemberInfo)->TeamIndex = PlayerState->GetTeamIndex(); - ((FGameMemberInfo*)GameMemberInfo)->MemberUniqueId = PlayerState->Get(UniqueIdOffset); - // ((FUniqueNetIdRepl*)&((FGameMemberInfo*)GameMemberInfo)->MemberUniqueId)->CopyFromAnotherUniqueId(PlayerStateUniqueId); - } - - static auto GameMemberInfoArray_MembersOffset = FindOffsetStruct("/Script/FortniteGame.GameMemberInfoArray", "Members"); - auto GameMemberInfoArray = this->GetPtr(GameMemberInfoArrayOffset); - - ((TArray*)(__int64(GameMemberInfoArray) + GameMemberInfoArray_MembersOffset))->AddPtr( - (FGameMemberInfo*)GameMemberInfo, GameMemberInfoStructSize - ); - - GameMemberInfoArray->MarkArrayDirty(); -} - -void AFortGameStateAthena::SkipAircraft() -{ - // return UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"skipaircraft", nullptr); - - if (GetGamePhase() != EAthenaGamePhase::Aircraft) - return; - - // this->bGameModeWillSkipAircraft = true; - - auto GetAircrafts = [&]() -> std::vector - { - static auto AircraftsOffset = this->GetOffset("Aircrafts", false); - std::vector Aircrafts; - - if (AircraftsOffset == -1) - { - // GameState->Aircraft - - static auto FortAthenaAircraftClass = FindObject(L"/Script/FortniteGame.FortAthenaAircraft"); - auto AllAircrafts = UGameplayStatics::GetAllActorsOfClass(GetWorld(), FortAthenaAircraftClass); - - for (int i = 0; i < AllAircrafts.Num(); i++) - { - Aircrafts.push_back(AllAircrafts.at(i)); - } - - AllAircrafts.Free(); - } - else - { - const auto& GameStateAircrafts = this->Get>(AircraftsOffset); - - for (int i = 0; i < GameStateAircrafts.Num(); i++) - { - Aircrafts.push_back(GameStateAircrafts.at(i)); - } - } - - return Aircrafts; - }; - - auto GameMode = Cast(GetWorld()->GetGameMode()); - - for (auto Aircraft : GetAircrafts()) - { - // haha skunked we should do GetAircraft!! - static auto OnAircraftExitedDropZoneFn = FindObject(L"/Script/FortniteGame.FortGameModeAthena.OnAircraftExitedDropZone"); - GameMode->ProcessEvent(OnAircraftExitedDropZoneFn, &Aircraft); - } -} - -TScriptInterface AFortGameStateAthena::GetSafeZoneInterface() -{ - int Offset = -1; - - if (Fortnite_Version == 10.40) - { - // Offset = 0xF60; - } - - TScriptInterface ScriptInterface{}; - - if (Offset != -1) - { - auto idk = (void*)(__int64(this) + Offset); - - UObject* ObjectPtr = reinterpret_cast(((UObject*)idk)->VFTable[0x1])(__int64(idk)); // not actually a uobject but its just how we can get vft - - if (ObjectPtr) - { - ScriptInterface.ObjectPointer = ObjectPtr; - ScriptInterface.InterfacePointer = ObjectPtr->GetInterfaceAddress(UFortSafeZoneInterface::StaticClass()); - } - } - - return ScriptInterface; -} - -UFortPlaylistAthena*& AFortGameStateAthena::GetCurrentPlaylist() -{ - static auto CurrentPlaylistInfoOffset = GetOffset("CurrentPlaylistInfo", false); - - if (CurrentPlaylistInfoOffset == -1) - { - static auto CurrentPlaylistDataOffset = GetOffset("CurrentPlaylistData"); - return (Get(CurrentPlaylistDataOffset)); - } - - auto CurrentPlaylistInfo = this->GetPtr(CurrentPlaylistInfoOffset); - - static auto BasePlaylistOffset = FindOffsetStruct("/Script/FortniteGame.PlaylistPropertyArray", "BasePlaylist"); - return (*(UFortPlaylistAthena**)(__int64(CurrentPlaylistInfo) + BasePlaylistOffset)); -} - -int AFortGameStateAthena::GetAircraftIndex(AFortPlayerState* PlayerState) -{ - // The function has a string in it but we can just remake lol - - auto PlayerStateAthena = Cast(PlayerState); - - if (!PlayerStateAthena) - return 0; - - auto CurrentPlaylist = GetCurrentPlaylist(); - - if (!CurrentPlaylist) - return 0; - - static auto AirCraftBehaviorOffset = GetOffset("AirCraftBehavior"); - - if (Get(AirCraftBehaviorOffset) != 1) // AirCraftBehavior != EAirCraftBehavior::OpposingAirCraftForEachTeam - return 0; - - auto TeamIndex = PlayerStateAthena->GetTeamIndex(); - int idfkwhatthisisimguessing = TeamIndex; - - static auto DefaultFirstTeamOffset = CurrentPlaylist->GetOffset("DefaultFirstTeam"); - auto DefaultFirstTeam = CurrentPlaylist->Get(DefaultFirstTeamOffset); - - return TeamIndex - idfkwhatthisisimguessing; -} - -bool AFortGameStateAthena::IsPlayerBuildableClass(UClass* Class) -{ - return true; - - static auto AllPlayerBuildableClassesOffset = GetOffset("AllPlayerBuildableClasses", false); - - if (AllPlayerBuildableClassesOffset == -1) // this is invalid in like s6 and stuff we need to find a better way to do this - return true; - - auto& AllPlayerBuildableClasses = Get>(AllPlayerBuildableClassesOffset); - - for (int j = 0; j < AllPlayerBuildableClasses.Num(); j++) - { - auto CurrentPlayerBuildableClass = AllPlayerBuildableClasses.at(j); - - // LOG_INFO(LogDev, "CurrentPlayerBuildableClass: {}", CurrentPlayerBuildableClass->GetFullName()); - - if (CurrentPlayerBuildableClass == Class) - return true; - } - - return false; - - // I don't know why but I think these are empty - - auto PlayerBuildableClasses = GetPlayerBuildableClasses(); - - int ArraySize = 4 - 1; - - for (int i = 0; i < ArraySize; i++) - { - auto CurrentPlayerBuildableClassesArray = PlayerBuildableClasses[i].BuildingClasses; - - for (int j = 0; j < CurrentPlayerBuildableClassesArray.Num(); j++) - { - auto CurrentPlayerBuildableClass = CurrentPlayerBuildableClassesArray.at(j); - - LOG_INFO(LogDev, "CurrentPlayerBuildableClass: {}", CurrentPlayerBuildableClass->GetFullName()); - - if (CurrentPlayerBuildableClass == Class) - return true; - } - } - - return false; -} - -bool AFortGameStateAthena::IsRespawningAllowed(AFortPlayerState* PlayerState) -{ - auto GameModeAthena = Cast(GetWorld()->GetGameMode()); - static auto IsRespawningAllowedFn = FindObject(L"/Script/FortniteGame.FortGameStateZone.IsRespawningAllowed"); - - // LOG_INFO(LogDev, "IsRespawningAllowedFn: {}", __int64(IsRespawningAllowedFn)); - - if (!IsRespawningAllowedFn) - { - static auto CurrentPlaylistDataOffset = GetOffset("CurrentPlaylistData", false); - auto CurrentPlaylist = CurrentPlaylistDataOffset == -1 && Fortnite_Version < 6 ? nullptr : GetCurrentPlaylist(); - - if (!CurrentPlaylist) - return false; - - static auto RespawnTypeOffset = CurrentPlaylist->GetOffset("RespawnType"); - - if (RespawnTypeOffset == -1) - return false; - - auto& RespawnType = CurrentPlaylist->Get(RespawnTypeOffset); - // LOG_INFO(LogDev, "RespawnType: {}", (int)RespawnType); - - if (RespawnType == 1) - return true; - - if (RespawnType == 2) // InfiniteRespawnExceptStorm - { - static auto SafeZoneIndicatorOffset = GameModeAthena->GetOffset("SafeZoneIndicator"); - auto SafeZoneIndicator = GameModeAthena->Get(SafeZoneIndicatorOffset); - - if (!SafeZoneIndicator) - return true; - - /* - - 10.40 - - bool __fastcall sub_7FF68F5A83A0(__int64 SafeZoneIndicator, float *a2) - { - __m128 v2; // xmm1 - float v3; // xmm2_4 - - v2 = *(*(SafeZoneIndicator + 928) + 464i64); - v3 = _mm_shuffle_ps(v2, v2, 85).m128_f32[0]; - return (*(SafeZoneIndicator + 924) * *(SafeZoneIndicator + 924)) >= (((v3 - a2[1]) * (v3 - a2[1])) - + ((v2.m128_f32[0] - *a2) * (v2.m128_f32[0] - *a2))); - } - - If this returns true, then return true - - */ - - return true; // Do this until we implement ^^ - } - - return false; - } - - struct { AFortPlayerState* PlayerState; bool ReturnValue; } AFortGameStateZone_IsRespawningAllowed_Params{PlayerState}; - this->ProcessEvent(IsRespawningAllowedFn, &AFortGameStateZone_IsRespawningAllowed_Params); - - return AFortGameStateZone_IsRespawningAllowed_Params.ReturnValue; -} - -void AFortGameStateAthena::OnRep_GamePhase() -{ - EAthenaGamePhase OldGamePhase = GetGamePhase(); - - static auto OnRep_GamePhase = FindObject(L"/Script/FortniteGame.FortGameStateAthena.OnRep_GamePhase"); - this->ProcessEvent(OnRep_GamePhase, &OldGamePhase); -} - -void AFortGameStateAthena::OnRep_CurrentPlaylistInfo() -{ - static auto OnRep_CurrentPlaylistData = FindObject(L"/Script/FortniteGame.FortGameStateAthena.OnRep_CurrentPlaylistData"); - - if (OnRep_CurrentPlaylistData) - { - this->ProcessEvent(OnRep_CurrentPlaylistData); - } - else - { - static auto OnRep_CurrentPlaylistInfo = FindObject(L"/Script/FortniteGame.FortGameStateAthena.OnRep_CurrentPlaylistInfo"); - - if (OnRep_CurrentPlaylistInfo) - this->ProcessEvent(OnRep_CurrentPlaylistInfo); - } -} - -void AFortGameStateAthena::OnRep_PlayersLeft() -{ - static auto OnRep_PlayersLeftFn = FindObject(L"/Script/FortniteGame.FortGameStateAthena.OnRep_PlayersLeft"); - - if (!OnRep_PlayersLeftFn) - return; - - this->ProcessEvent(OnRep_PlayersLeftFn); -} - -TeamsArrayContainer* AFortGameStateAthena::GetTeamsArrayContainer() -{ - if (true) - return nullptr; - - if (Fortnite_Version < 8.0) // I'm pretty sure it got added on 7.40 but idk if it is structured differently. - return nullptr; - - static auto FriendlyFireTypeOffset = GetOffset("FriendlyFireType"); - static int Offset = -1; - - if (Offset == -1) - { - static int IncreaseBy = Engine_Version >= 424 ? 0x25 : 0x5; - Offset = FriendlyFireTypeOffset + IncreaseBy; - } - - return Offset != -1 ? (TeamsArrayContainer*)(__int64(this) + Offset) : nullptr; -} - -void AFortGameStateAthena::AddToAdditionalPlaylistLevelsStreamed(const FName& Name, bool bServerOnly) -{ - auto NameStr = Name.ToString(); - auto NameWStr = std::wstring(NameStr.begin(), NameStr.end()); - - if (true) - { - StreamLevel(Name.ToString()); // skunke bozo (I didn't test the next code too much soo) - } - else - { - static auto AdditionalPlaylistLevelsStreamedOffset = this->GetOffset("AdditionalPlaylistLevelsStreamed", false); - - if (!FAdditionalLevelStreamed::GetStruct()) - { - auto& AdditionalPlaylistLevelsStreamed = this->Get>(AdditionalPlaylistLevelsStreamedOffset); - AdditionalPlaylistLevelsStreamed.Add(Name); - } - else - { - auto& AdditionalPlaylistLevelsStreamed = this->Get>(AdditionalPlaylistLevelsStreamedOffset); - auto NewLevelStreamed = Alloc(FAdditionalLevelStreamed::GetStructSize()); - NewLevelStreamed->GetLevelName() = Name; - NewLevelStreamed->IsServerOnly() = bServerOnly; - - AdditionalPlaylistLevelsStreamed.AddPtr(NewLevelStreamed, FAdditionalLevelStreamed::GetStructSize()); - } - } -} - -UClass* AFortGameStateAthena::StaticClass() -{ - static auto Class = FindObject(L"/Script/FortniteGame.FortGameStateAthena"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameStateAthena.h b/dependencies/reboot/Project Reboot 3.0/FortGameStateAthena.h deleted file mode 100644 index 4915ab1..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameStateAthena.h +++ /dev/null @@ -1,168 +0,0 @@ -#pragma once - -#include "GameState.h" -#include "FortPlayerStateAthena.h" -#include "FortPlaylistAthena.h" -#include "BuildingStructuralSupportSystem.h" -#include "ScriptInterface.h" -#include "Interface.h" -#include "FortAthenaMapInfo.h" - -enum class EAthenaGamePhaseStep : uint8_t // idk if this changes -{ - None = 0, - Setup = 1, - Warmup = 2, - GetReady = 3, - BusLocked = 4, - BusFlying = 5, - StormForming = 6, - StormHolding = 7, - StormShrinking = 8, - Countdown = 9, - FinalCountdown = 10, - EndGame = 11, - Count = 12, - EAthenaGamePhaseStep_MAX = 13 -}; - -enum class EAthenaGamePhase : uint8_t -{ - None = 0, - Setup = 1, - Warmup = 2, - Aircraft = 3, - SafeZones = 4, - EndGame = 5, - Count = 6, - EAthenaGamePhase_MAX = 7 -}; - -class UFortSafeZoneInterface : public UInterface -{ -public: - static UClass* StaticClass() - { - static auto Struct = FindObject(L"/Script/FortniteGame.FortSafeZoneInterface"); - return Struct; - } -}; - -struct TeamsArrayContainer // THANK ANDROIDDD!!!! -{ - TArray>> TeamsArray; // 13D0 - TArray TeamIdk1; // 13E0 - TArray TeamIndexesArray; // 13F0 - - uintptr_t idfk; //(or 2 ints) // 1400 - - TArray>> SquadsArray; // Index = SquadId // 1408 - TArray SquadIdk1; // 1418 - TArray SquadIdsArray; // 0x1428 -}; - -struct FPlayerBuildableClassContainer -{ - TArray BuildingClasses; // 0x0000(0x0010) (ZeroConstructor, Transient, UObjectWrapper, NativeAccessSpecifierPublic) -}; - -struct FAdditionalLevelStreamed -{ -public: - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.AdditionalLevelStreamed"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - FName& GetLevelName() - { - static auto LevelNameOffset = FindOffsetStruct("/Script/FortniteGame.AdditionalLevelStreamed", "LevelName"); - return *(FName*)(__int64(this) + LevelNameOffset); - } - - bool& IsServerOnly() - { - static auto bIsServerOnlyOffset = FindOffsetStruct("/Script/FortniteGame.AdditionalLevelStreamed", "bIsServerOnly"); - return *(bool*)(__int64(this) + bIsServerOnlyOffset); - } -}; - -class AFortGameStateAthena : public AGameState -{ -public: - int& GetPlayersLeft() - { - static auto PlayersLeftOffset = GetOffset("PlayersLeft"); - return Get(PlayersLeftOffset); - } - - bool& IsSafeZonePaused() - { - static auto bSafeZonePausedOffset = this->GetOffset("bSafeZonePaused"); - return this->Get(bSafeZonePausedOffset); - } - - int& GetWorldLevel() // Actually in AFortGameState - { - static auto WorldLevelOffset = GetOffset("WorldLevel"); - return Get(WorldLevelOffset); - } - - EAthenaGamePhase& GetGamePhase() - { - static auto GamePhaseOffset = GetOffset("GamePhase"); - return Get(GamePhaseOffset); - } - - UBuildingStructuralSupportSystem* GetStructuralSupportSystem() // actually in FortGameModeZone - { - static auto StructuralSupportSystemOffset = GetOffset("StructuralSupportSystem"); - return Get(StructuralSupportSystemOffset); - } - - FPlayerBuildableClassContainer*& GetPlayerBuildableClasses() - { - static auto PlayerBuildableClassesOffset = GetOffset("PlayerBuildableClasses"); - return Get(PlayerBuildableClassesOffset); - } - - AFortAthenaMapInfo*& GetMapInfo() - { - static auto MapInfoOffset = GetOffset("MapInfo"); - return Get(MapInfoOffset); - } - - bool IsResurrectionEnabled(AFortPlayerPawn* PlayerPawn) - { - static auto IsResurrectionEnabledFn = FindObject(L"/Script/FortniteGame.FortGameStateAthena.IsResurrectionEnabled"); - struct { AFortPlayerPawn* PlayerPawn; bool Ret; } Params{PlayerPawn}; - this->ProcessEvent(IsResurrectionEnabledFn, &Params); - return Params.Ret; - } - - EAthenaGamePhaseStep& GetGamePhaseStep() - { - static auto GamePhaseStepOffset = GetOffset("GamePhaseStep"); - return Get(GamePhaseStepOffset); - } - - UFortPlaylistAthena*& GetCurrentPlaylist(); - TScriptInterface GetSafeZoneInterface(); - - void AddPlayerStateToGameMemberInfo(class AFortPlayerStateAthena* PlayerState); - void SkipAircraft(); - - int GetAircraftIndex(AFortPlayerState* PlayerState); - bool IsRespawningAllowed(AFortPlayerState* PlayerState); // actually in zone - bool IsPlayerBuildableClass(UClass* Class); - void OnRep_GamePhase(); - void OnRep_CurrentPlaylistInfo(); - void OnRep_PlayersLeft(); - TeamsArrayContainer* GetTeamsArrayContainer(); - void AddToAdditionalPlaylistLevelsStreamed(const FName& Name, bool bServerOnly = false); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameplayAbilityAthena_PeriodicItemGrant.cpp b/dependencies/reboot/Project Reboot 3.0/FortGameplayAbilityAthena_PeriodicItemGrant.cpp deleted file mode 100644 index 3b88963..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameplayAbilityAthena_PeriodicItemGrant.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "FortGameplayAbilityAthena_PeriodicItemGrant.h" - -void UFortGameplayAbilityAthena_PeriodicItemGrant::StopItemAwardTimersHook(UObject* Context, FFrame& Stack, void* Ret) -{ - // (Milxnor) We need clear all the timers in ActiveTimers. - - return StopItemAwardTimersOriginal(Context, Stack, Ret); -} - -void UFortGameplayAbilityAthena_PeriodicItemGrant::StartItemAwardTimersHook(UObject* Context, FFrame& Stack, void* Ret) -{ - // (Milxnor) We need to loop through ItemsToGrant, and then using the Pair.Value we set a timer and then the Pair.Key for the item to grant, then we add the timer to ActiveTimers. - - return StartItemAwardTimersOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortGameplayAbilityAthena_PeriodicItemGrant.h b/dependencies/reboot/Project Reboot 3.0/FortGameplayAbilityAthena_PeriodicItemGrant.h deleted file mode 100644 index 3c96196..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortGameplayAbilityAthena_PeriodicItemGrant.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include "Object.h" -#include "Stack.h" - -#include "GameplayAbilityTypes.h" -#include "FortWorldItemDefinition.h" - -struct FActiveItemGrantInfo -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.ActiveItemGrantInfo"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - UFortWorldItemDefinition*& GetItem() - { - static auto ItemOffset = FindOffsetStruct("/Script/FortniteGame.ActiveItemGrantInfo", "Item"); - return *(UFortWorldItemDefinition**)(__int64(this) + ItemOffset); - } - - FScalableFloat& GetAmountToGive() - { - static auto AmountToGiveOffset = FindOffsetStruct("/Script/FortniteGame.ActiveItemGrantInfo", "AmountToGive"); - return *(FScalableFloat*)(__int64(this) + AmountToGiveOffset); - } - - FScalableFloat& GetMaxAmount() - { - static auto MaxAmountOffset = FindOffsetStruct("/Script/FortniteGame.ActiveItemGrantInfo", "MaxAmount"); - return *(FScalableFloat*)(__int64(this) + MaxAmountOffset); - } -}; - -class UFortGameplayAbilityAthena_PeriodicItemGrant : public UObject // UFortGameplayAbility -{ -public: - static inline void (*StopItemAwardTimersOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*StartItemAwardTimersOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - TMap& GetItemsToGrant() - { - static auto ItemsToGrantOffset = GetOffset("ItemsToGrant"); - return Get>(ItemsToGrantOffset); - } - - TArray& GetActiveTimers() - { - static auto ActiveTimersOffset = GetOffset("ActiveTimers"); - return Get>(ActiveTimersOffset); - } - - static void StopItemAwardTimersHook(UObject* Context, FFrame& Stack, void* Ret); - static void StartItemAwardTimersHook(UObject* Context, FFrame& Stack, void* Ret); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortInventory.cpp b/dependencies/reboot/Project Reboot 3.0/FortInventory.cpp deleted file mode 100644 index a7818ca..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortInventory.cpp +++ /dev/null @@ -1,566 +0,0 @@ -#include "FortInventory.h" -#include "FortPlayerController.h" -#include "FortPickup.h" -#include "FortQuickBars.h" -#include "FortPlayerPawnAthena.h" -#include "FortGameStateAthena.h" -#include "FortGameModeAthena.h" -#include "FortGadgetItemDefinition.h" -#include "FortPlayerStateAthena.h" - -UFortItem* CreateItemInstance(AFortPlayerController* PlayerController, UFortItemDefinition* ItemDefinition, int Count) -{ - UFortItem* NewItemInstance = ItemDefinition->CreateTemporaryItemInstanceBP(Count); - - if (NewItemInstance && PlayerController) - NewItemInstance->SetOwningControllerForTemporaryItem(PlayerController); - - return NewItemInstance; -} - -std::pair, std::vector> AFortInventory::AddItem(FFortItemEntry* ItemEntry, bool* bShouldUpdate, bool bShowItemToast, int OverrideCount) -{ - if (!ItemEntry || !ItemEntry->GetItemDefinition()) - return std::pair, std::vector>(); - - if (bShouldUpdate) - *bShouldUpdate = false; - - auto ItemDefinition = ItemEntry->GetItemDefinition(); - - auto WorldItemDefinition = Cast(ItemDefinition); - auto& Count = ItemEntry->GetCount(); - - auto& ItemInstances = GetItemList().GetItemInstances(); - - auto MaxStackSize = ItemDefinition->GetMaxStackSize(); - - bool bAllowMultipleStacks = ItemDefinition->DoesAllowMultipleStacks(); - int OverStack = 0; - - std::vector NewItemInstances; - std::vector ModifiedItemInstances; - - if (MaxStackSize > 1) - { - for (int i = 0; i < ItemInstances.Num(); i++) - { - auto CurrentItemInstance = ItemInstances.at(i); - auto CurrentEntry = CurrentItemInstance->GetItemEntry(); - - if (CurrentEntry->GetItemDefinition() == ItemDefinition) - { - if (CurrentEntry->GetCount() < MaxStackSize || !bAllowMultipleStacks) - { - OverStack = CurrentEntry->GetCount() + Count - MaxStackSize; - - if (!bAllowMultipleStacks && !(CurrentEntry->GetCount() < MaxStackSize)) - { - break; - } - - int AmountToStack = OverStack > 0 ? Count - OverStack : Count; - - auto ReplicatedEntry = FindReplicatedEntry(CurrentEntry->GetItemGuid()); - - CurrentEntry->GetCount() += AmountToStack; - ReplicatedEntry->GetCount() += AmountToStack; - - for (int p = 0; p < CurrentEntry->GetStateValues().Num(); p++) - { - if (CurrentEntry->GetStateValues().at(p).GetStateType() == EFortItemEntryState::ShouldShowItemToast) - { - CurrentEntry->GetStateValues().at(p).GetIntValue() = bShowItemToast; - } - } - - for (int p = 0; p < ReplicatedEntry->GetStateValues().Num(); p++) - { - if (ReplicatedEntry->GetStateValues().at(p).GetStateType() == EFortItemEntryState::ShouldShowItemToast) - { - ReplicatedEntry->GetStateValues().at(p).GetIntValue() = bShowItemToast; - } - } - - ModifiedItemInstances.push_back(CurrentItemInstance); - - GetItemList().MarkItemDirty(CurrentEntry); - GetItemList().MarkItemDirty(ReplicatedEntry); - - if (OverStack <= 0) - return std::make_pair(NewItemInstances, ModifiedItemInstances); - - // break; - } - } - } - } - - Count = OverStack > 0 ? OverStack : Count; - - auto PlayerController = Cast(GetOwner()); - - if (!PlayerController) - return std::make_pair(NewItemInstances, ModifiedItemInstances); - - if (OverStack > 0 && !bAllowMultipleStacks) - { - auto Pawn = PlayerController->GetPawn(); - - if (!Pawn) - return std::make_pair(NewItemInstances, ModifiedItemInstances); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, Count, -1, MAX_DURABILITY/* level */); - CreateData.SpawnLocation = Pawn->GetActorLocation(); - CreateData.PawnOwner = Cast(Pawn); - CreateData.SourceType = EFortPickupSourceTypeFlag::GetPlayerValue(); - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - AFortPickup::SpawnPickup(CreateData); - return std::make_pair(NewItemInstances, ModifiedItemInstances); - } - - auto FortPlayerController = Cast(PlayerController); - UFortItem* NewItemInstance = CreateItemInstance(FortPlayerController, ItemDefinition, Count); - - if (NewItemInstance) - { - NewItemInstance->GetItemEntry()->CopyFromAnotherItemEntry(ItemEntry); - - if (OverrideCount != -1) - NewItemInstance->GetItemEntry()->GetCount() = OverrideCount; - - NewItemInstances.push_back(NewItemInstance); - - ItemInstances.Add(NewItemInstance); - auto ReplicatedEntryIdx = GetItemList().GetReplicatedEntries().Add(*NewItemInstance->GetItemEntry(), FFortItemEntry::GetStructSize()); - // GetItemList().GetReplicatedEntries().AtPtr(ReplicatedEntryIdx, FFortItemEntry::GetStructSize())->GetIsReplicatedCopy() = true; - - if (FortPlayerController && WorldItemDefinition->IsValidLowLevel()) - { - bool AreGadgetsEnabled = Addresses::ApplyGadgetData && Addresses::RemoveGadgetData && Globals::bEnableAGIDs; - bool bWasGadget = false; - - if (AreGadgetsEnabled) - { - if (auto GadgetItemDefinition = Cast(WorldItemDefinition)) - { - if (GadgetItemDefinition->ShouldDropAllItemsOnEquip()) // idk shouldnt this be auto? - { - FortPlayerController->DropAllItems({ GadgetItemDefinition }, false, false, Fortnite_Version < 7); - } - - bool (*ApplyGadgetData)(UFortGadgetItemDefinition* a1, __int64 a2, UFortItem* a3, unsigned __int8 a4) = decltype(ApplyGadgetData)(Addresses::ApplyGadgetData); - static auto FortInventoryOwnerInterfaceClass = FindObject("/Script/FortniteGame.FortInventoryOwnerInterface"); - auto Interface = __int64(FortPlayerController->GetInterfaceAddress(FortInventoryOwnerInterfaceClass)); - bool idktbh = true; // Something to do with durability - - bool DidApplyingGadgetSucceed = ApplyGadgetData(GadgetItemDefinition, Interface, NewItemInstance, idktbh); - LOG_INFO(LogDev, "DidApplyingGadgetSucceed: {}", DidApplyingGadgetSucceed); - bWasGadget = true; - } - } - - if (WorldItemDefinition->ShouldFocusWhenAdded()) // Should we also do this for stacking? - { - LOG_INFO(LogDev, "Force focus {}", ItemDefinition->GetFullName()); - FortPlayerController->ServerExecuteInventoryItemHook(FortPlayerController, NewItemInstance->GetItemEntry()->GetItemGuid()); - FortPlayerController->ClientEquipItem(NewItemInstance->GetItemEntry()->GetItemGuid(), true); - } - } - else - { - LOG_INFO(LogDev, "Not Valid!"); - } - - if (FortPlayerController && Engine_Version < 420) - { - static auto QuickBarsOffset = FortPlayerController->GetOffset("QuickBars", false); - auto QuickBars = FortPlayerController->Get(QuickBarsOffset); - - if (QuickBars) - { - struct - { - FGuid Item; // (Parm, IsPlainOldData) - EFortQuickBars InQuickBar; // (Parm, ZeroConstructor, IsPlainOldData) - int Slot; // (Parm, ZeroConstructor, IsPlainOldData) - } - AFortQuickBars_ServerAddItemInternal_Params - { - NewItemInstance->GetItemEntry()->GetItemGuid(), - IsPrimaryQuickbar(ItemDefinition) ? EFortQuickBars::Primary : EFortQuickBars::Secondary, - -1 - }; - - static auto ServerAddItemInternalFn = FindObject("/Script/FortniteGame.FortQuickBars.ServerAddItemInternal"); - QuickBars->ProcessEvent(ServerAddItemInternalFn, &AFortQuickBars_ServerAddItemInternal_Params); - } - } - - /* if (FortPlayerController && WorldItemDefinition) // Hmm - { - auto Pawn = Cast(FortPlayerController->GetMyFortPawn()); - auto GameState = Cast(((AFortGameModeAthena*)GetWorld()->GetGameMode())->GetGameState()); - - if (Pawn) - { - static auto InventorySpecialActorUniqueIDOffset = WorldItemDefinition->GetOffset("InventorySpecialActorUniqueID"); - auto& InventorySpecialActorUniqueID = WorldItemDefinition->Get(InventorySpecialActorUniqueIDOffset); - - static auto ItemSpecialActorIDOffset = Pawn->GetOffset("ItemSpecialActorID"); - Pawn->Get(ItemSpecialActorIDOffset) = InventorySpecialActorUniqueID; - - static auto ItemSpecialActorCategoryIDOffset = Pawn->GetOffset("ItemSpecialActorCategoryID"); - Pawn->Get(ItemSpecialActorCategoryIDOffset) = InventorySpecialActorUniqueID; - - static auto BecameSpecialActorTimeOffset = Pawn->GetOffset("BecameSpecialActorTime"); - Pawn->Get(BecameSpecialActorTimeOffset) = GameState->GetServerWorldTimeSeconds(); - } - } */ - - if (bShouldUpdate) - *bShouldUpdate = true; - } - - return std::make_pair(NewItemInstances, ModifiedItemInstances); -} - -std::pair, std::vector> AFortInventory::AddItem(UFortItemDefinition* ItemDefinition, bool* bShouldUpdate, int Count, int LoadedAmmo, bool bShowItemToast) -{ - if (LoadedAmmo == -1) - { - if (auto WeaponDef = Cast(ItemDefinition)) // bPreventDefaultPreload ? - LoadedAmmo = WeaponDef->GetClipSize(); - else - LoadedAmmo = 0; - } - - auto ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, Count, LoadedAmmo); - auto Ret = AddItem(ItemEntry, bShouldUpdate, bShowItemToast); - - if (!bUseFMemoryRealloc) - { - FFortItemEntry::FreeItemEntry(ItemEntry); - VirtualFree(ItemEntry, 0, MEM_RELEASE); - } - - return Ret; -} - -bool AFortInventory::RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int Count, bool bForceRemoval, bool bIgnoreVariables) -{ - if (bShouldUpdate) - *bShouldUpdate = false; - - auto ItemInstance = FindItemInstance(ItemGuid); - auto ReplicatedEntry = FindReplicatedEntry(ItemGuid); - - if (!ItemInstance || !ReplicatedEntry) - return false; - - auto ItemDefinition = Cast(ReplicatedEntry->GetItemDefinition()); - - if (!ItemDefinition) - return false; - - int OldCount = Count; - - if (Count < 0) // idk why i have this - { - Count = 0; - bForceRemoval = true; - } - - auto& ItemInstances = GetItemList().GetItemInstances(); - auto& ReplicatedEntries = GetItemList().GetReplicatedEntries(); - - auto NewCount = ReplicatedEntry->GetCount() - Count; - - bool bOverrideChangeStackSize = false; - - if (!bIgnoreVariables && ItemDefinition->ShouldPersistWhenFinalStackEmpty()) - { - bool bIsFinalStack = true; - - for (int i = 0; i < ItemInstances.Num(); i++) - { - auto ItemInstance = ItemInstances.at(i); - - if (ItemInstance->GetItemEntry()->GetItemDefinition() == ItemDefinition && ItemInstance->GetItemEntry()->GetItemGuid() != ItemGuid) - { - bIsFinalStack = false; - break; - } - } - - if (bIsFinalStack) - { - NewCount = NewCount < 0 ? 0 : NewCount; // min(NewCount, 0) or something i forgot - bOverrideChangeStackSize = true; - } - } - - if (OldCount != -1 && (NewCount > 0 || bOverrideChangeStackSize)) - { - ItemInstance->GetItemEntry()->GetCount() = NewCount; - ReplicatedEntry->GetCount() = NewCount; - - GetItemList().MarkItemDirty(ItemInstance->GetItemEntry()); - GetItemList().MarkItemDirty(ReplicatedEntry); - - return true; - } - - if (NewCount < 0) // Hm - return false; - - auto FortPlayerController = Cast(GetOwner()); - - bool bWasGadget = false; - - for (int i = 0; i < ItemInstances.Num(); i++) - { - if (ItemInstances.at(i)->GetItemEntry()->GetItemGuid() == ItemGuid) - { - bool AreGadgetsEnabled = Addresses::ApplyGadgetData && Addresses::RemoveGadgetData && Globals::bEnableAGIDs; - - if (FortPlayerController && AreGadgetsEnabled) - { - if (auto GadgetItemDefinition = Cast(ItemDefinition)) - { - LOG_INFO(LogDev, "Unequipping Gadget!"); - GadgetItemDefinition->UnequipGadgetData(FortPlayerController, ItemInstances.at(i)); - - bWasGadget = true; - - if (bWasGadget) - { - if (Fortnite_Version < 7 && GadgetItemDefinition->ShouldDropAllItemsOnEquip()) - { - FortPlayerController->AddPickaxeToInventory(); - } - } - } - } - - FFortItemEntry::FreeItemEntry(ItemInstances.at(i)->GetItemEntry()); // Really this is deconstructing it, which frees the arrays inside, we have to do this since Remove doesn't. - ItemInstances.Remove(i); - break; - } - } - - for (int i = 0; i < ReplicatedEntries.Num(); i++) - { - if (ReplicatedEntries.at(i, FFortItemEntry::GetStructSize()).GetItemGuid() == ItemGuid) - { - FFortItemEntry::FreeItemEntry(ReplicatedEntries.AtPtr(i, FFortItemEntry::GetStructSize())); - ReplicatedEntries.Remove(i, FFortItemEntry::GetStructSize()); - break; - } - } - - if (FortPlayerController && Engine_Version < 420) - { - static auto QuickBarsOffset = FortPlayerController->GetOffset("QuickBars", false); - auto QuickBars = FortPlayerController->Get(QuickBarsOffset); - - if (QuickBars) - { - auto ItemDefinitionQuickBars = IsPrimaryQuickbar(ItemDefinition) ? EFortQuickBars::Primary : EFortQuickBars::Secondary; - auto SlotIndex = QuickBars->GetSlotIndex(ItemGuid, ItemDefinitionQuickBars); - - if (SlotIndex != -1) - { - QuickBars->ServerRemoveItemInternal(ItemGuid, false, true); - QuickBars->EmptySlot(ItemDefinitionQuickBars, SlotIndex); - } - } - } - - // todo remove from weaponlist - - if (bShouldUpdate) - *bShouldUpdate = true; - - return true; -} - -void AFortInventory::SwapItem(const FGuid& ItemGuid, FFortItemEntry* NewItemEntry, int OverrideNewCount, std::pair* outEntries) -{ - auto NewCount = OverrideNewCount == -1 ? NewItemEntry->GetCount() : OverrideNewCount; - - auto ItemInstance = FindItemInstance(ItemGuid); - - if (!ItemInstance) - return; - - /* RemoveItem(ItemGuid, nullptr, ItemInstance->GetItemEntry()->GetCount(), true); - AddItem(NewItemEntry, nullptr, false, OverrideNewCount); - - return; */ - - // IDK WHY THIS DOESNT WORK - - static auto FortItemEntrySize = FFortItemEntry::GetStructSize(); - - auto& ReplicatedEntries = GetItemList().GetReplicatedEntries(); - - for (int i = 0; i < ReplicatedEntries.Num(); i++) - { - auto& ReplicatedEntry = ReplicatedEntries.At(i, FortItemEntrySize); - - if (ReplicatedEntry.GetItemGuid() == ItemGuid) - { - ReplicatedEntry.CopyFromAnotherItemEntry(NewItemEntry); - ItemInstance->GetItemEntry()->CopyFromAnotherItemEntry(NewItemEntry); - - ReplicatedEntry.GetCount() = NewCount; - ItemInstance->GetItemEntry()->GetCount() = NewCount; - - if (outEntries) - *outEntries = std::make_pair(ItemInstance->GetItemEntry(), &ReplicatedEntry); - } - } -} - -void AFortInventory::ModifyCount(UFortItem* ItemInstance, int New, bool bRemove, std::pair* outEntries, bool bUpdate, bool bShowItemToast) -{ - auto ReplicatedEntry = FindReplicatedEntry(ItemInstance->GetItemEntry()->GetItemGuid()); - - if (!ReplicatedEntry) - return; - - if (!bRemove) - { - ItemInstance->GetItemEntry()->GetCount() += New; - ReplicatedEntry->GetCount() += New; - - for (int p = 0; p < ItemInstance->GetItemEntry()->GetStateValues().Num(); p++) - { - if (ItemInstance->GetItemEntry()->GetStateValues().at(p).GetStateType() == EFortItemEntryState::ShouldShowItemToast) - { - ItemInstance->GetItemEntry()->GetStateValues().at(p).GetIntValue() = bShowItemToast; - } - } - - for (int p = 0; p < ReplicatedEntry->GetStateValues().Num(); p++) - { - if (ReplicatedEntry->GetStateValues().at(p).GetStateType() == EFortItemEntryState::ShouldShowItemToast) - { - ReplicatedEntry->GetStateValues().at(p).GetIntValue() = bShowItemToast; - } - } - } - else - { - ItemInstance->GetItemEntry()->GetCount() -= New; - ReplicatedEntry->GetCount() -= New; - } - - if (outEntries) - *outEntries = { ItemInstance->GetItemEntry(), ReplicatedEntry}; - - if (bUpdate || !outEntries) - { - GetItemList().MarkItemDirty(ItemInstance->GetItemEntry()); - GetItemList().MarkItemDirty(ReplicatedEntry); - } -} - -UFortItem* AFortInventory::GetPickaxeInstance() -{ - static auto FortWeaponMeleeItemDefinitionClass = FindObject(L"/Script/FortniteGame.FortWeaponMeleeItemDefinition"); - - auto& ItemInstances = GetItemList().GetItemInstances(); - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.At(i); - - if (ItemInstance->GetItemEntry() && ItemInstance->GetItemEntry()->GetItemDefinition() && - ItemInstance->GetItemEntry()->GetItemDefinition()->IsA(FortWeaponMeleeItemDefinitionClass) - ) - { - return ItemInstance; - } - } - - return nullptr; -} - -UFortItem* AFortInventory::FindItemInstance(UFortItemDefinition* ItemDefinition) -{ - auto& ItemInstances = GetItemList().GetItemInstances(); - - for (int i = 0; i < ItemInstances.Num(); i++) - { - auto ItemInstance = ItemInstances.At(i); - - if (ItemInstance->GetItemEntry()->GetItemDefinition() == ItemDefinition) - return ItemInstance; - } - - return nullptr; -} - -void AFortInventory::CorrectLoadedAmmo(const FGuid& Guid, int NewAmmoCount) -{ - auto CurrentWeaponInstance = FindItemInstance(Guid); - - if (!CurrentWeaponInstance) - return; - - auto CurrentWeaponReplicatedEntry = FindReplicatedEntry(Guid); - - if (!CurrentWeaponReplicatedEntry) - return; - - if (CurrentWeaponReplicatedEntry->GetLoadedAmmo() != NewAmmoCount) - { - CurrentWeaponInstance->GetItemEntry()->GetLoadedAmmo() = NewAmmoCount; - CurrentWeaponReplicatedEntry->GetLoadedAmmo() = NewAmmoCount; - - GetItemList().MarkItemDirty(CurrentWeaponInstance->GetItemEntry()); - GetItemList().MarkItemDirty(CurrentWeaponReplicatedEntry); - } -} - -UFortItem* AFortInventory::FindItemInstance(const FGuid& Guid) -{ - auto& ItemInstances = GetItemList().GetItemInstances(); - - for (int i = 0; i < ItemInstances.Num(); i++) - { - auto ItemInstance = ItemInstances.At(i); - - if (ItemInstance->GetItemEntry()->GetItemGuid() == Guid) - return ItemInstance; - } - - return nullptr; -} - -FFortItemEntry* AFortInventory::FindReplicatedEntry(const FGuid& Guid) -{ - static auto FortItemEntrySize = FFortItemEntry::GetStructSize(); - - auto& ReplicatedEntries = GetItemList().GetReplicatedEntries(); - - for (int i = 0; i < ReplicatedEntries.Num(); i++) - { - auto& ReplicatedEntry = ReplicatedEntries.At(i, FortItemEntrySize); - - if (ReplicatedEntry.GetItemGuid() == Guid) - return &ReplicatedEntry; - } - - return nullptr; -} - -/* UClass* AFortInventory::StaticClass() -{ - static auto Class = FindObject("/Script/FortniteGame.FortInventory"); - return Class; -} */ \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortInventory.h b/dependencies/reboot/Project Reboot 3.0/FortInventory.h deleted file mode 100644 index 5f48463..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortInventory.h +++ /dev/null @@ -1,117 +0,0 @@ -#pragma once - -#include "Actor.h" -#include "Class.h" - -#include "NetSerialization.h" -#include "FortItem.h" -#include "FortItemDefinition.h" - -#include "reboot.h" - -#define REMOVE_ALL_ITEMS -1 - -static bool IsPrimaryQuickbar(UFortItemDefinition* ItemDefinition) -{ - /* if (ItemDefinition->IsA(UFortDecoItemDefinition::StaticClass())) - { - if (ItemDefinition->IsA(UFortTrapItemDefinition::StaticClass())) - return false; - else - return true; - } - else if (ItemDefinition->IsA(UFortWeaponItemDefinition::StaticClass())) - return true; */ - - static auto FortWeaponMeleeItemDefinitionClass = FindObject("/Script/FortniteGame.FortWeaponMeleeItemDefinition"); - static auto FortEditToolItemDefinitionClass = FindObject("/Script/FortniteGame.FortEditToolItemDefinition"); - static auto FortBuildingItemDefinitionClass = FindObject("/Script/FortniteGame.FortBuildingItemDefinition"); - static auto FortAmmoItemDefinitionClass = FindObject("/Script/FortniteGame.FortAmmoItemDefinition"); - static auto FortResourceItemDefinitionClass = FindObject("/Script/FortniteGame.FortResourceItemDefinition"); - static auto FortTrapItemDefinitionClass = FindObject("/Script/FortniteGame.FortTrapItemDefinition"); - - if (!ItemDefinition->IsA(FortWeaponMeleeItemDefinitionClass) && !ItemDefinition->IsA(FortEditToolItemDefinitionClass) && - !ItemDefinition->IsA(FortBuildingItemDefinitionClass) && !ItemDefinition->IsA(FortAmmoItemDefinitionClass) - && !ItemDefinition->IsA(FortResourceItemDefinitionClass) && !ItemDefinition->IsA(FortTrapItemDefinitionClass)) - return true; - - return false; -} - -enum class EFortInventoryType : unsigned char -{ - World = 0, - Account = 1, - Outpost = 2, - MAX = 3, -}; - -struct FItemGuidAndCount -{ -public: - int32 Count; // 0x0(0x4)(Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - struct FGuid ItemGuid; // 0x4(0x10)(Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) -}; - -struct FFortItemList : public FFastArraySerializer -{ - TArray& GetItemInstances() - { - static auto ItemInstancesOffset = FindOffsetStruct("/Script/FortniteGame.FortItemList", "ItemInstances"); - return *(TArray*)(__int64(this) + ItemInstancesOffset); - } - - TArray& GetReplicatedEntries() - { - static auto ReplicatedEntriesOffset = FindOffsetStruct("/Script/FortniteGame.FortItemList", "ReplicatedEntries"); - return *(TArray*)(__int64(this) + ReplicatedEntriesOffset); - } -}; - -class AFortInventory : public AActor -{ -public: - FFortItemList& GetItemList() - { - static auto InventoryOffset = GetOffset("Inventory"); - return Get(InventoryOffset); - } - - EFortInventoryType& GetInventoryType() - { - static auto InventoryOffset = GetOffset("InventoryType"); - return Get(InventoryOffset); - } - - void HandleInventoryLocalUpdate() - { - static auto HandleInventoryLocalUpdateFn = FindObject(L"/Script/FortniteGame.FortInventory.HandleInventoryLocalUpdate"); - ProcessEvent(HandleInventoryLocalUpdateFn); - } - - FORCENOINLINE void Update(bool bMarkArrayDirty = true) - { - HandleInventoryLocalUpdate(); - - if (bMarkArrayDirty) - { - GetItemList().MarkArrayDirty(); - } - } - - std::pair, std::vector> AddItem(FFortItemEntry* ItemEntry, bool* bShouldUpdate, bool bShowItemToast = false, int OverrideCount = -1); - std::pair, std::vector> AddItem(UFortItemDefinition* ItemDefinition, bool* bShouldUpdate, int Count = 1, int LoadedAmmo = -1, bool bShowItemToast = false); - bool RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int Count, bool bForceRemoval = false, bool bIgnoreVariables = false); - void SwapItem(const FGuid& ItemGuid, FFortItemEntry* NewItemEntry, int OverrideNewCount = -1, std::pair* outEntries = nullptr); - void ModifyCount(UFortItem* ItemInstance, int New, bool bRemove = false, std::pair* outEntries = nullptr, bool bUpdate = true, bool bShowItemToast = false); - - UFortItem* GetPickaxeInstance(); - UFortItem* FindItemInstance(UFortItemDefinition* ItemDefinition); - - void CorrectLoadedAmmo(const FGuid& Guid, int NewAmmoCount); - - UFortItem* FindItemInstance(const FGuid& Guid); - FFortItemEntry* FindReplicatedEntry(const FGuid& Guid); - - // static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortInventoryInterface.cpp b/dependencies/reboot/Project Reboot 3.0/FortInventoryInterface.cpp deleted file mode 100644 index d4e4b57..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortInventoryInterface.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "FortInventoryInterface.h" - -#include "reboot.h" -#include "FortPlayerControllerAthena.h" - -char UFortInventoryInterface::RemoveInventoryItemHook(__int64 a1, FGuid a2, int Count, char bForceRemoveFromQuickBars, char bForceRemoval) -{ - // kms bruh - - static auto FortPlayerControllerSuperSize = (*(UClass**)(__int64(FindObject("/Script/FortniteGame.FortPlayerController")) + Offsets::SuperStruct))->GetPropertiesSize(); - int SuperAdditionalOffset = Engine_Version >= 427 ? 16 : 8; - auto ControllerObject = (UObject*)(__int64(a1) - (FortPlayerControllerSuperSize + SuperAdditionalOffset)); - - // LOG_INFO(LogDev, "bForceRemoval: {}", (bool)bForceRemoval); - // LOG_INFO(LogDev, "FortPlayerControllerSuperSize: {}", FortPlayerControllerSuperSize); - // LOG_INFO(LogDev, "ControllerObject: {}", ControllerObject->GetFullName()); - - // LOG_INFO(LogDev, __FUNCTION__); - - if (!ControllerObject) - return false; - - auto PlayerController = Cast(ControllerObject); - - if (!PlayerController) - return false; - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return false; - - if (!Globals::bInfiniteAmmo) - { - bool bShouldUpdate = false; - WorldInventory->RemoveItem(a2, &bShouldUpdate, Count, bForceRemoval); - - if (bShouldUpdate) - WorldInventory->Update(); - } - - if (Engine_Version < 424) // doesnt work on c2+ idk why - { - auto Pawn = PlayerController->GetMyFortPawn(); - - if (Pawn) - { - auto CurrentWeapon = Pawn->GetCurrentWeapon(); - - if (CurrentWeapon) - WorldInventory->CorrectLoadedAmmo(CurrentWeapon->GetItemEntryGuid(), CurrentWeapon->GetAmmoCount()); - } - } - - return true; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortInventoryInterface.h b/dependencies/reboot/Project Reboot 3.0/FortInventoryInterface.h deleted file mode 100644 index 1d97a71..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortInventoryInterface.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "Object.h" - -class UFortInventoryInterface -{ -public: - static char RemoveInventoryItemHook(__int64 a1, FGuid a2, int Count, char bForceRemoveFromQuickBars, char bForceRemoval); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortItem.cpp b/dependencies/reboot/Project Reboot 3.0/FortItem.cpp deleted file mode 100644 index 49aa1ab..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortItem.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "FortItem.h" - -#include "FortWeaponItemDefinition.h" -#include "AbilitySystemComponent.h" - -void FFortItemEntry::SetStateValue(EFortItemEntryState StateType, int IntValue) -{ - for (int i = 0; i < GetStateValues().Num(); i++) - { - if (GetStateValues().at(i).GetStateType() == StateType) - { - GetStateValues().at(i).GetIntValue() = IntValue; - return; - } - } - - auto idx = GetStateValues().AddUninitialized2(FFortItemEntryStateValue::GetStructSize()); // AddUninitialized? - - GetStateValues().AtPtr(idx, FFortItemEntryStateValue::GetStructSize())->GetIntValue() = IntValue; - GetStateValues().AtPtr(idx, FFortItemEntryStateValue::GetStructSize())->GetStateType() = StateType; - GetStateValues().AtPtr(idx, FFortItemEntryStateValue::GetStructSize())->GetNameValue() = FName(0); - - // idk some parentinventory stuff here - - // ItemEntry->bIsDirty = true; -} - -FFortItemEntry* FFortItemEntry::MakeItemEntry(UFortItemDefinition* ItemDefinition, int Count, int LoadedAmmo, float Durability, int Level) -{ - auto Entry = Alloc(GetStructSize(), bUseFMemoryRealloc); - - if (!Entry) - return nullptr; - - if (LoadedAmmo == -1) - { - if (auto WeaponDef = Cast(ItemDefinition)) // bPreventDefaultPreload ? - LoadedAmmo = WeaponDef->GetClipSize(); - else - LoadedAmmo = 0; - } - - Entry->MostRecentArrayReplicationKey = -1; // idk if we need to set this - Entry->ReplicationID = -1; - Entry->ReplicationKey = -1; - - Entry->GetItemDefinition() = ItemDefinition; - Entry->GetCount() = Count; - Entry->GetLoadedAmmo() = LoadedAmmo; - Entry->GetDurability() = Durability; - Entry->GetGameplayAbilitySpecHandle() = FGameplayAbilitySpecHandle(-1); - Entry->GetParentInventory().ObjectIndex = -1; - Entry->GetLevel() = Level; - // We want to add StateValues.Add(DurabilityInitialized); orwnatefc erwgearf yk - // CoCreateGuid((GUID*)&Entry->GetItemGuid()); - // Entry->DoesUpdateStatsOnCollection() = true; // I think fortnite does this? - - return Entry; -} - -void UFortItem::SetOwningControllerForTemporaryItem(UObject* Controller) -{ - static auto SOCFTIFn = FindObject(L"/Script/FortniteGame.FortItem.SetOwningControllerForTemporaryItem"); - this->ProcessEvent(SOCFTIFn, &Controller); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortItem.h b/dependencies/reboot/Project Reboot 3.0/FortItem.h deleted file mode 100644 index a10eaa3..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortItem.h +++ /dev/null @@ -1,254 +0,0 @@ -#pragma once - -#include - -#include "NetSerialization.h" -#include "Class.h" -#include "GameplayAbilitySpec.h" - -#include "reboot.h" - -constexpr inline bool bUseFMemoryRealloc = false; // This is for allocating our own Item entries, I don't know why this doesn't work - -enum class EFortItemEntryState : uint8_t // this changes but its fineee -{ - NoneState = 0, - NewItemCount = 1, - ShouldShowItemToast = 2, - DurabilityInitialized = 3, - DoNotShowSpawnParticles = 4, - FromRecoveredBackpack = 5, - FromGift = 6, - PendingUpgradeCriteriaProgress = 7, - OwnerBuildingHandle = 8, - FromDroppedPickup = 9, - JustCrafted = 10, - CraftAndSlotTarget = 11, - GenericAttributeValueSet = 12, - PickupInstigatorHandle = 13, - CreativeUserPrefabHasContent = 14, - EFortItemEntryState_MAX = 15 -}; - -#define MAX_DURABILITY 0x3F800000 - -struct FFortItemEntryStateValue -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.FortItemEntryStateValue"); - return Struct; - } - - static int GetStructSize() - { - return GetStruct()->GetPropertiesSize(); - } - - int& GetIntValue() - { - static auto IntValueOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntryStateValue", "IntValue"); - return *(int*)(__int64(this) + IntValueOffset); - } - - EFortItemEntryState& GetStateType() - { - static auto StateTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntryStateValue", "StateType"); - return *(EFortItemEntryState*)(__int64(this) + StateTypeOffset); - } - - FName& GetNameValue() - { - static auto NameValueOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntryStateValue", "NameValue"); - return *(FName*)(__int64(this) + NameValueOffset); - } -}; - -struct FFortItemEntry : FFastArraySerializerItem -{ - FGuid& GetItemGuid() - { - static auto ItemGuidOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "ItemGuid"); - return *(FGuid*)(__int64(this) + ItemGuidOffset); - } - - bool& GetIsReplicatedCopy() - { - static auto bIsReplicatedCopyOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "bIsReplicatedCopy"); - return *(bool*)(__int64(this) + bIsReplicatedCopyOffset); - } - - bool& DoesUpdateStatsOnCollection() - { - // added like s8+ or somethingf idsk it was on 10.40 but not 7.40 - static auto bUpdateStatsOnCollectionOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "bUpdateStatsOnCollection"); - return *(bool*)(__int64(this) + bUpdateStatsOnCollectionOffset); - } - - class UFortItemDefinition*& GetItemDefinition() - { - static auto ItemDefinitionOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "ItemDefinition"); - return *(class UFortItemDefinition**)(__int64(this) + ItemDefinitionOffset); - } - - int& GetCount() - { - static auto CountOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "Count"); - return *(int*)(__int64(this) + CountOffset); - } - - int& GetLevel() - { - static auto LevelOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "Level"); - return *(int*)(__int64(this) + LevelOffset); - } - - TArray& GetStateValues() - { - static auto StateValuesOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "StateValues"); - return *(TArray*)(__int64(this) + StateValuesOffset); - } - - int& GetLoadedAmmo() - { - static auto LoadedAmmoOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "LoadedAmmo"); - return *(int*)(__int64(this) + LoadedAmmoOffset); - } - - float& GetDurability() - { - static auto DurabilityOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "Durability"); - return *(float*)(__int64(this) + DurabilityOffset); - } - - FGameplayAbilitySpecHandle& GetGameplayAbilitySpecHandle() - { - static auto GameplayAbilitySpecHandleOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "GameplayAbilitySpecHandle"); - return *(FGameplayAbilitySpecHandle*)(__int64(this) + GameplayAbilitySpecHandleOffset); - } - - TArray& GetGenericAttributeValues() - { - static auto GenericAttributeValuesOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "GenericAttributeValues"); - return *(TArray*)(__int64(this) + GenericAttributeValuesOffset); - } - - TWeakObjectPtr& GetParentInventory() - { - static auto ParentInventoryOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "ParentInventory"); - return *(TWeakObjectPtr*)(__int64(this) + ParentInventoryOffset); - } - - void CopyFromAnotherItemEntry(FFortItemEntry* OtherItemEntry, bool bCopyGuid = false) - { - // We can use FortItemEntryStruct->CopyScriptStruct - - FGuid OldGuid = this->GetItemGuid(); - - if (false) - { - CopyStruct(this, OtherItemEntry, FFortItemEntry::GetStructSize(), FFortItemEntry::GetStruct()); - } - else - { - this->GetItemDefinition() = OtherItemEntry->GetItemDefinition(); - this->GetCount() = OtherItemEntry->GetCount(); - this->GetLoadedAmmo() = OtherItemEntry->GetLoadedAmmo(); - this->GetItemGuid() = OtherItemEntry->GetItemGuid(); - this->GetLevel() = OtherItemEntry->GetLevel(); - } - - if (!bCopyGuid) - this->GetItemGuid() = OldGuid; - - static auto GenericAttributeValuesOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "GenericAttributeValues", false); - - if (GenericAttributeValuesOffset != -1) - { - // this->GetGenericAttributeValues().CopyFromArray(OtherItemEntry->GetGenericAttributeValues()); - } - - // this->GetStateValues().CopyFromArray(OtherItemEntry->GetStateValues(), FFortItemEntryStateValue::GetStructSize()); // broooooooooooooooooooo - - // should we do this? - - this->MostRecentArrayReplicationKey = -1; - this->ReplicationID = -1; - this->ReplicationKey = -1; - } - - void SetStateValue(EFortItemEntryState StateType, int IntValue); - - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.FortItemEntry"); - return Struct; - } - - static int GetStructSize() - { - static auto StructSize = GetStruct()->GetPropertiesSize(); - return StructSize; - } - - static FFortItemEntry* MakeItemEntry(UFortItemDefinition* ItemDefinition, int Count = 1, int LoadedAmmo = 0, float Durability = MAX_DURABILITY, int Level = 0); - - // We need to find a better way for below... Especially since we can't do either method for season 5 or 6. - - static void FreeItemEntry(FFortItemEntry* Entry) - { - if (Addresses::FreeEntry) - { - static __int64 (*FreeEntryOriginal)(__int64 Entry) = decltype(FreeEntryOriginal)(Addresses::FreeEntry); - FreeEntryOriginal(__int64(Entry)); - } - else - { - static auto GenericAttributeValuesOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "GenericAttributeValues", false); - - if (GenericAttributeValuesOffset != -1) - { - Entry->GetGenericAttributeValues().FreeGood(); - } - - Entry->GetStateValues().FreeGood(); - } - - // RtlZeroMemory(Entry, FFortItemEntry::GetStructSize()); - } - - static void FreeArrayOfEntries(TArray& tarray) - { - if (Addresses::FreeArrayOfEntries) - { - static __int64 (*FreeArrayOfEntriesOriginal)(TArray& a1) = decltype(FreeArrayOfEntriesOriginal)(Addresses::FreeArrayOfEntries); - FreeArrayOfEntriesOriginal(tarray); - } - else - { - if (Addresses::FreeEntry) - { - for (int i = 0; i < tarray.size(); i++) - { - FreeItemEntry(tarray.AtPtr(i)); - } - } - else - { - tarray.Free(); // does nothing - } - } - } -}; - -class UFortItem : public UObject -{ -public: - FFortItemEntry* GetItemEntry() - { - static auto ItemEntryOffset = this->GetOffset("ItemEntry"); - return GetPtr(ItemEntryOffset); - } - - void SetOwningControllerForTemporaryItem(UObject* Controller); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortItemDefinition.cpp b/dependencies/reboot/Project Reboot 3.0/FortItemDefinition.cpp deleted file mode 100644 index f890d70..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortItemDefinition.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "FortItemDefinition.h" -#include "CurveTable.h" -#include "DataTable.h" - -UFortItem* UFortItemDefinition::CreateTemporaryItemInstanceBP(int Count, int Level) -{ - static auto CreateTemporaryItemInstanceBPFunction = FindObject(L"/Script/FortniteGame.FortItemDefinition.CreateTemporaryItemInstanceBP"); - struct { int Count; int Level; UFortItem* ReturnValue; } CreateTemporaryItemInstanceBP_Params{ Count, Level }; - - ProcessEvent(CreateTemporaryItemInstanceBPFunction, &CreateTemporaryItemInstanceBP_Params); - - return CreateTemporaryItemInstanceBP_Params.ReturnValue; -} - -float UFortItemDefinition::GetMaxStackSize() -{ - static auto MaxStackSizeOffset = this->GetOffset("MaxStackSize"); - - bool bIsScalableFloat = Fortnite_Version >= 12; // idk - - if (!bIsScalableFloat) - return Get(MaxStackSizeOffset); - - struct FScalableFloat - { - public: - float Value; // 0x0(0x4)(Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - uint8 Pad_3BF0[0x4]; // Fixing Size After Last Property [ Dumper-7 ] - FCurveTableRowHandle Curve; // 0x8(0x10)(Edit, BlueprintVisible, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - }; - - static auto AthenaGameData = FindObject("/Game/Athena/Balance/DataTables/AthenaGameData.AthenaGameData"); - - auto& ScalableFloat = Get(MaxStackSizeOffset); - auto& RowMap = AthenaGameData->GetRowMap(); - - if (ScalableFloat.Curve.RowName.ComparisonIndex.Value == 0) - return ScalableFloat.Value; - - FSimpleCurve* Curve = nullptr; - - for (auto& Pair : RowMap) - { - if (Pair.Key() == ScalableFloat.Curve.RowName) - { - Curve = (FSimpleCurve*)Pair.Value(); - break; - } - } - - if (!Curve) - return 1; - - return Curve->GetKeys().at(0).Value; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortItemDefinition.h deleted file mode 100644 index c450356..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortItemDefinition.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include "FortItem.h" -#include "Object.h" -#include "Class.h" - -#include "reboot.h" - -class UFortItemDefinition : public UObject -{ -public: - UFortItem* CreateTemporaryItemInstanceBP(int Count, int Level = 1); // Should Level be 20? - float GetMaxStackSize(); - - bool DoesAllowMultipleStacks() - { - static auto bAllowMultipleStacksOffset = GetOffset("bAllowMultipleStacks"); - static auto bAllowMultipleStacksFieldMask = GetFieldMask(GetProperty("bAllowMultipleStacks")); - return ReadBitfieldValue(bAllowMultipleStacksOffset, bAllowMultipleStacksFieldMask); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortItemDefinition"); - return Class; - } -}; - -struct FItemAndCount -{ -private: - int Count; // 0x0000(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - unsigned char UnknownData00[0x4]; // 0x0004(0x0004) MISSED OFFSET - UFortItemDefinition* Item; // 0x0008(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) -public: - int& GetCount() - { - return Count; - } - - UFortItemDefinition*& GetItem() - { - return Item; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortKismetLibrary.cpp b/dependencies/reboot/Project Reboot 3.0/FortKismetLibrary.cpp deleted file mode 100644 index 7db7894..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortKismetLibrary.cpp +++ /dev/null @@ -1,669 +0,0 @@ -#include "FortKismetLibrary.h" -#include "ScriptInterface.h" -#include "FortPickup.h" -#include "FortLootPackage.h" -#include "AbilitySystemComponent.h" -#include "FortGameModeAthena.h" - -UFortResourceItemDefinition* UFortKismetLibrary::K2_GetResourceItemDefinition(EFortResourceType ResourceType) -{ - if (ResourceType == EFortResourceType::Wood) - { - static auto WoodItemData = FindObject(L"/Game/Items/ResourcePickups/WoodItemData.WoodItemData"); - return WoodItemData; - } - else if (ResourceType == EFortResourceType::Stone) - { - static auto StoneItemData = FindObject(L"/Game/Items/ResourcePickups/StoneItemData.StoneItemData"); - return StoneItemData; - } - else if (ResourceType == EFortResourceType::Metal) - { - static auto MetalItemData = FindObject(L"/Game/Items/ResourcePickups/MetalItemData.MetalItemData"); - return MetalItemData; - } - - return nullptr; - - // The function below doesn't exist on some very old builds. - - static auto fn = FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_GetResourceItemDefinition"); - - struct { EFortResourceType type; UFortResourceItemDefinition* ret; } params{ResourceType}; - - static auto DefaultClass = StaticClass(); - DefaultClass->ProcessEvent(fn, ¶ms); - return params.ret; -} - -FVector UFortKismetLibrary::FindGroundLocationAt(UWorld* World, AActor* IgnoreActor, FVector InLocation, float TraceStartZ, float TraceEndZ, FName TraceName) -{ - static auto FindGroundLocationAtFn = FindObject(L"/Script/FortniteGame.FortKismetLibrary.FindGroundLocationAt"); - - struct - { - UWorld* World; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AActor* IgnoreActor; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector InLocation; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float TraceStartZ; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float TraceEndZ; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName TraceName; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UFortKismetLibrary_FindGroundLocationAt_Params{ World, IgnoreActor, InLocation, TraceStartZ, TraceEndZ, TraceName }; - - static auto DefaultClass = StaticClass(); - DefaultClass->ProcessEvent(FindGroundLocationAtFn, &UFortKismetLibrary_FindGroundLocationAt_Params); - - return UFortKismetLibrary_FindGroundLocationAt_Params.ReturnValue; -} - -void UFortKismetLibrary::ApplyCharacterCosmetics(UObject* WorldContextObject, const TArray& CharacterParts, UObject* PlayerState, bool* bSuccess) -{ - static auto fn = FindObject("/Script/FortniteGame.FortKismetLibrary.ApplyCharacterCosmetics"); - - if (fn) - { - struct - { - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - TArray CharacterParts; // (Parm, ZeroConstructor, NativeAccessSpecifierPublic) - UObject* PlayerState; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bSuccess; // (Parm, OutParm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UFortKismetLibrary_ApplyCharacterCosmetics_Params{ WorldContextObject, CharacterParts, PlayerState }; - - static auto DefaultClass = StaticClass(); - DefaultClass->ProcessEvent(fn, &UFortKismetLibrary_ApplyCharacterCosmetics_Params); - - if (bSuccess) - *bSuccess = UFortKismetLibrary_ApplyCharacterCosmetics_Params.bSuccess; - - return; - } - - static auto CharacterPartsOffset = PlayerState->GetOffset("CharacterParts", false); - - if (CharacterPartsOffset != -1) - { - auto CharacterPartsPS = PlayerState->GetPtr<__int64>("CharacterParts"); - - static auto CustomCharacterPartsStruct = FindObject("/Script/FortniteGame.CustomCharacterParts"); - - // if (CustomCharacterPartsStruct) - { - static auto PartsOffset = FindOffsetStruct("/Script/FortniteGame.CustomCharacterParts", "Parts"); - auto Parts = (UObject**)(__int64(CharacterPartsPS) + PartsOffset); // UCustomCharacterPart* Parts[0x6] - - for (int i = 0; i < CharacterParts.Num(); i++) - { - Parts[i] = CharacterParts.at(i); - } - - static auto OnRep_CharacterPartsFn = FindObject("/Script/FortniteGame.FortPlayerState.OnRep_CharacterParts"); - PlayerState->ProcessEvent(OnRep_CharacterPartsFn); - } - } - else - { - // TODO Add character data support - } -} - -void UFortKismetLibrary::PickLootDropsWithNamedWeightsHook(UObject* Context, FFrame& Stack, void* Ret) -{ - LOG_INFO(LogDev, __FUNCTION__); - return PickLootDropsWithNamedWeightsOriginal(Context, Stack, Ret); -} - -void UFortKismetLibrary::SpawnItemVariantPickupInWorldHook(UObject* Context, FFrame& Stack, void* Ret) -{ - UObject* WorldContextObject; // 0x0(0x8)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - PadHexB0 Params; // = *Alloc(FSpawnItemVariantParams::GetStructSize()); - - Stack.StepCompiledIn(&WorldContextObject); - Stack.StepCompiledIn(&Params); - - LOG_INFO(LogDev, __FUNCTION__); - - auto ParamsPtr = (FSpawnItemVariantParams*)&Params; - - auto ItemDefinition = ParamsPtr->GetWorldItemDefinition(); - - LOG_INFO(LogDev, "ItemDefinition: {}", ItemDefinition ? ItemDefinition->GetFullName() : "InvalidObject"); - - if (!ItemDefinition) - return SpawnItemVariantPickupInWorldOriginal(Context, Stack, Ret); - - auto& Position = ParamsPtr->GetPosition(); - - LOG_INFO(LogDev, "{} {} {}", Position.X, Position.Y, Position.Z); - - auto GameState = Cast(GetWorld()->GetGameState()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, ParamsPtr->GetNumberToSpawn(), -1, MAX_DURABILITY, ItemDefinition->GetFinalLevel(GameState->GetWorldLevel())); - CreateData.SourceType = ParamsPtr->GetSourceType(); - CreateData.Source = ParamsPtr->GetSource(); - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - auto Pickup = AFortPickup::SpawnPickup(CreateData); - - return SpawnItemVariantPickupInWorldOriginal(Context, Stack, Ret); -} - -bool UFortKismetLibrary::SpawnInstancedPickupInWorldHook(UObject* Context, FFrame& Stack, bool* Ret) -{ - UObject* WorldContextObject; // 0x0(0x8)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UFortWorldItemDefinition* ItemDefinition; // 0x8(0x8)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int32 NumberToSpawn; // 0x10(0x4)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Position; // 0x14(0xC)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Direction; // 0x20(0xC)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int32 OverrideMaxStackCount; // 0x2C(0x4)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bToss; // 0x30(0x1)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bRandomRotation; // 0x31(0x1)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bBlockedFromAutoPickup; - - LOG_INFO(LogDev, __FUNCTION__); - - Stack.StepCompiledIn(&WorldContextObject); - Stack.StepCompiledIn(&ItemDefinition); - Stack.StepCompiledIn(&NumberToSpawn); - Stack.StepCompiledIn(&Position); - Stack.StepCompiledIn(&Direction); - Stack.StepCompiledIn(&OverrideMaxStackCount); - Stack.StepCompiledIn(&bToss); - Stack.StepCompiledIn(&bRandomRotation); - Stack.StepCompiledIn(&bBlockedFromAutoPickup); - - auto GameState = Cast(GetWorld()->GetGameState()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1, MAX_DURABILITY, ItemDefinition->GetFinalLevel(GameState->GetWorldLevel())); - CreateData.SpawnLocation = Position; - CreateData.bToss = bToss; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - auto Pickup = AFortPickup::SpawnPickup(CreateData); - - *Ret = Pickup; - return *Ret; -} - -void UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierHook(UObject* Context, FFrame& Stack, void* Ret) -{ - LOG_INFO(LogDev, __FUNCTION__); - - return K2_SpawnPickupInWorldWithLootTierOriginal(Context, Stack, Ret); -} - -void TestFunctionHook(UObject* Context, FFrame& Stack, void* Ret) -{ - auto PlayerController = (AFortPlayerController*)Context; - AFortPawn* Pawn = nullptr; - - Stack.StepCompiledIn(&Pawn); -} - -void UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHook(UObject* Context, FFrame& Stack, void* Ret) -{ - UObject* WorldContextObject; - UFortWeaponItemDefinition* WeaponItemDefinition; - FGameplayTagContainer SourceTags; - FVector Location; - uint8 SourceTypeFlag; - uint8 SpawnSource; - - Stack.StepCompiledIn(&WorldContextObject); - Stack.StepCompiledIn(&WeaponItemDefinition); - Stack.StepCompiledIn(&SourceTags); - Stack.StepCompiledIn(&Location); - Stack.StepCompiledIn(&SourceTypeFlag); - Stack.StepCompiledIn(&SpawnSource); - - LOG_INFO(LogDev, __FUNCTION__); - - // return CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal(Context, Stack, Ret); - - int Count = 1; // uh? - - auto AmmoDefinition = WeaponItemDefinition->GetAmmoData(); - - if (!AmmoDefinition) - return CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal(Context, Stack, Ret); - - auto GameState = Cast(GetWorld()->GetGameState()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(AmmoDefinition, Count, 0, MAX_DURABILITY, AmmoDefinition->GetFinalLevel(GameState->GetWorldLevel())); - CreateData.SourceType = SourceTypeFlag; - CreateData.Source = SpawnSource; - CreateData.SpawnLocation = Location; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - auto AmmoPickup = AFortPickup::SpawnPickup(CreateData); - - return CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal(Context, Stack, Ret); -} - -void UFortKismetLibrary::GiveItemToInventoryOwnerHook(UObject* Context, FFrame& Stack, void* Ret) -{ - static auto ItemLevelOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.GiveItemToInventoryOwner", "ItemLevel", false); - static auto PickupInstigatorHandleOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.GiveItemToInventoryOwner", "PickupInstigatorHandle", false); - static auto ItemVariantGuidOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.GiveItemToInventoryOwner", "ItemVariantGuid", false); - - TScriptInterface InventoryOwner; // = *(TScriptInterface*)(__int64(Params) + InventoryOwnerOffset); - UFortWorldItemDefinition* ItemDefinition = nullptr; // *(UFortWorldItemDefinition**)(__int64(Params) + ItemDefinitionOffset); - FGuid ItemVariantGuid; - int NumberToGive; // = *(int*)(__int64(Params) + NumberToGiveOffset); - bool bNotifyPlayer; // = *(bool*)(__int64(Params) + bNotifyPlayerOffset); - int ItemLevel; // = *(int*)(__int64(Params) + ItemLevelOffset); - int PickupInstigatorHandle; // = *(int*)(__int64(Params) + PickupInstigatorHandleOffset); - - Stack.StepCompiledIn(&InventoryOwner); - Stack.StepCompiledIn(&ItemDefinition); - if (ItemVariantGuidOffset != -1) Stack.StepCompiledIn(&ItemVariantGuid); - Stack.StepCompiledIn(&NumberToGive); - Stack.StepCompiledIn(&bNotifyPlayer); - - LOG_INFO(LogDev, __FUNCTION__); - - if (ItemLevelOffset != -1) - Stack.StepCompiledIn(&ItemLevel); - - if (PickupInstigatorHandleOffset != -1) - Stack.StepCompiledIn(&PickupInstigatorHandle); - - if (!ItemDefinition) - return GiveItemToInventoryOwnerOriginal(Context, Stack, Ret); - - auto InterfacePointer = InventoryOwner.InterfacePointer; - - LOG_INFO(LogDev, "InterfacePointer: {}", __int64(InterfacePointer)); - - if (!InterfacePointer) - return GiveItemToInventoryOwnerOriginal(Context, Stack, Ret); - - auto ObjectPointer = InventoryOwner.ObjectPointer; - - LOG_INFO(LogDev, "ObjectPointer: {}", __int64(ObjectPointer)); - - if (!ObjectPointer) - return GiveItemToInventoryOwnerOriginal(Context, Stack, Ret); - - LOG_INFO(LogDev, "ObjectPointer Name: {}", ObjectPointer->GetFullName()); - - auto PlayerController = Cast(ObjectPointer); - - if (!PlayerController) - return GiveItemToInventoryOwnerOriginal(Context, Stack, Ret); - - bool bShouldUpdate = false; - LOG_INFO(LogDev, "ItemDefinition: {}", __int64(ItemDefinition)); - LOG_INFO(LogDev, "ItemDefinition Name: {}", ItemDefinition->GetFullName()); - PlayerController->GetWorldInventory()->AddItem(ItemDefinition, &bShouldUpdate, NumberToGive, -1, bNotifyPlayer); - - if (bShouldUpdate) - PlayerController->GetWorldInventory()->Update(); - - return GiveItemToInventoryOwnerOriginal(Context, Stack, Ret); -} - -void UFortKismetLibrary::K2_RemoveItemFromPlayerHook(UObject* Context, FFrame& Stack, void* Ret) -{ - static auto PlayerControllerOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.K2_RemoveItemFromPlayer", "PlayerController"); - static auto ItemDefinitionOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.K2_RemoveItemFromPlayer", "ItemDefinition"); - static auto AmountToRemoveOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.K2_RemoveItemFromPlayer", "AmountToRemove"); - - AFortPlayerController* PlayerController = nullptr; - UFortWorldItemDefinition* ItemDefinition = nullptr; - int AmountToRemove; - - Stack.StepCompiledIn(&PlayerController); - Stack.StepCompiledIn(&ItemDefinition); - Stack.StepCompiledIn(&AmountToRemove); - - LOG_INFO(LogDev, __FUNCTION__); - - if(!PlayerController) - return K2_RemoveItemFromPlayerOriginal(Context, Stack, Ret); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return K2_RemoveItemFromPlayerOriginal(Context, Stack, Ret); - - auto ItemInstance = WorldInventory->FindItemInstance(ItemDefinition); - - if (!ItemInstance) - return K2_RemoveItemFromPlayerOriginal(Context, Stack, Ret); - - bool bShouldUpdate = false; - WorldInventory->RemoveItem(ItemInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, AmountToRemove); - - if (bShouldUpdate) - WorldInventory->Update(); - - LOG_INFO(LogDev, "Removed {}!", AmountToRemove); - - return K2_RemoveItemFromPlayerOriginal(Context, Stack, Ret); -} - -void UFortKismetLibrary::K2_RemoveItemFromPlayerByGuidHook(UObject* Context, FFrame& Stack, void* Ret) -{ - AFortPlayerController* PlayerController = nullptr; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FGuid ItemGuid; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int AmountToRemove; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bForceRemoval; - - Stack.StepCompiledIn(&PlayerController); - Stack.StepCompiledIn(&ItemGuid); - Stack.StepCompiledIn(&AmountToRemove); - Stack.StepCompiledIn(&bForceRemoval); - - LOG_INFO(LogDev, __FUNCTION__); - - if (!PlayerController) - return; - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return K2_RemoveItemFromPlayerByGuidOriginal(Context, Stack, Ret); - - bool bShouldUpdate = false; - WorldInventory->RemoveItem(ItemGuid, &bShouldUpdate, AmountToRemove, bForceRemoval); - - if (bShouldUpdate) - WorldInventory->Update(); - - return K2_RemoveItemFromPlayerByGuidOriginal(Context, Stack, Ret); -} - -void UFortKismetLibrary::K2_GiveItemToPlayerHook(UObject* Context, FFrame& Stack, void* Ret) -{ - static auto ItemVariantGuidOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.K2_GiveItemToPlayer", "ItemVariantGuid", false); - - auto Params = Stack.Locals; - - AFortPlayerController* PlayerController = nullptr; - UFortWorldItemDefinition* ItemDefinition = nullptr; - FGuid ItemVariantGuid; - int NumberToGive; - bool bNotifyPlayer; - - Stack.StepCompiledIn(&PlayerController); - Stack.StepCompiledIn(&ItemDefinition); - if (ItemVariantGuidOffset != -1) Stack.StepCompiledIn(&ItemVariantGuid); - Stack.StepCompiledIn(&NumberToGive); - Stack.StepCompiledIn(&bNotifyPlayer); - - LOG_INFO(LogDev, __FUNCTION__); - - if (!PlayerController || !ItemDefinition) - return K2_GiveItemToPlayerOriginal(Context, Stack, Ret); - - bool bShouldUpdate = false; - PlayerController->GetWorldInventory()->AddItem(ItemDefinition, &bShouldUpdate, NumberToGive, -1, bNotifyPlayer); - - if (bShouldUpdate) - PlayerController->GetWorldInventory()->Update(); - - return K2_GiveItemToPlayerOriginal(Context, Stack, Ret); -} - -void UFortKismetLibrary::K2_GiveBuildingResourceHook(UObject* Context, FFrame& Stack, void* Ret) -{ - LOG_INFO(LogDev, "K2_GiveBuildingResourceHook!"); - - AFortPlayerController* Controller; - EFortResourceType ResourceType; - int ResourceAmount; - - Stack.StepCompiledIn(&Controller); - Stack.StepCompiledIn(&ResourceType); - Stack.StepCompiledIn(&ResourceAmount); - - if (!Controller) - return K2_GiveBuildingResourceOriginal(Context, Stack, Ret); - - auto WorldInventory = Controller->GetWorldInventory(); - - if (!WorldInventory) - return K2_GiveBuildingResourceOriginal(Context, Stack, Ret); - - auto ItemDefinition = UFortKismetLibrary::K2_GetResourceItemDefinition(ResourceType); - - if (!ItemDefinition) - return K2_GiveBuildingResourceOriginal(Context, Stack, Ret); - - bool bShouldUpdate = false; - WorldInventory->AddItem(ItemDefinition, &bShouldUpdate, ResourceAmount, 0); - - if (bShouldUpdate) - WorldInventory->Update(); - - return K2_GiveBuildingResourceOriginal(Context, Stack, Ret); -} - -void UFortKismetLibrary::K2_RemoveFortItemFromPlayerHook(UObject* Context, FFrame& Stack, void* Ret) -{ - AFortPlayerController* PlayerController = nullptr; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UFortItem* Item = nullptr; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int AmountToRemove; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bForceRemoval; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - - Stack.StepCompiledIn(&PlayerController); - Stack.StepCompiledIn(&Item); - Stack.StepCompiledIn(&AmountToRemove); - Stack.StepCompiledIn(&bForceRemoval); - - LOG_INFO(LogDev, __FUNCTION__); - - if (!PlayerController || !Item) - return; - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return K2_RemoveFortItemFromPlayerOriginal(Context, Stack, Ret); - - LOG_INFO(LogDev, "bForceRemoval: {}", bForceRemoval); - bool bShouldUpdate = false; - WorldInventory->RemoveItem(Item->GetItemEntry()->GetItemGuid(), &bShouldUpdate, AmountToRemove, bForceRemoval); - - if (bShouldUpdate) - WorldInventory->Update(); - - return K2_RemoveFortItemFromPlayerOriginal(Context, Stack, Ret); -} - -AFortPickup* UFortKismetLibrary::K2_SpawnPickupInWorldWithClassHook(UObject* Context, FFrame& Stack, AFortPickup** Ret) -{ - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UFortWorldItemDefinition* ItemDefinition; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UClass* PickupClass; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int NumberToSpawn; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Position; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Direction; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int OverrideMaxStackCount; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bToss; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bRandomRotation; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bBlockedFromAutoPickup; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int PickupInstigatorHandle; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - uint8 SourceType; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - uint8 Source; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AFortPlayerController* OptionalOwnerPC; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bPickupOnlyRelevantToOwner; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - - Stack.StepCompiledIn(&WorldContextObject); - Stack.StepCompiledIn(&ItemDefinition); - Stack.StepCompiledIn(&PickupClass); - Stack.StepCompiledIn(&NumberToSpawn); - Stack.StepCompiledIn(&Position); - Stack.StepCompiledIn(&Direction); - Stack.StepCompiledIn(&OverrideMaxStackCount); - Stack.StepCompiledIn(&bToss); - Stack.StepCompiledIn(&bRandomRotation); - Stack.StepCompiledIn(&bBlockedFromAutoPickup); - Stack.StepCompiledIn(&PickupInstigatorHandle); - Stack.StepCompiledIn(&SourceType); - Stack.StepCompiledIn(&Source); - Stack.StepCompiledIn(&OptionalOwnerPC); - Stack.StepCompiledIn(&bPickupOnlyRelevantToOwner); - - if (!ItemDefinition) - return K2_SpawnPickupInWorldWithClassOriginal(Context, Stack, Ret); - - LOG_INFO(LogDev, "PickupClass: {}", PickupClass ? PickupClass->GetFullName() : "InvalidObject"); - - LOG_INFO(LogDev, __FUNCTION__); - - auto GameState = Cast(GetWorld()->GetGameState()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1, MAX_DURABILITY, ItemDefinition->GetFinalLevel(GameState->GetWorldLevel())); - CreateData.Source = Source; - CreateData.SourceType = SourceType; - CreateData.OverrideClass = PickupClass; - CreateData.bToss = bToss; - CreateData.bRandomRotation = bRandomRotation; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - CreateData.PawnOwner = OptionalOwnerPC ? OptionalOwnerPC->GetMyFortPawn() : nullptr; - - auto NewPickup = AFortPickup::SpawnPickup(CreateData); - - K2_SpawnPickupInWorldWithClassOriginal(Context, Stack, Ret); - - *Ret = NewPickup; - return *Ret; -} - -UObject* UFortKismetLibrary::GetAIDirectorHook(UObject* Context, FFrame& Stack, UObject** Ret) -{ - auto GameMode = Cast(GetWorld()->GetGameMode()); - static auto AIDirectorOffset = GameMode->GetOffset("AIDirector"); - - auto AIDirector = GameMode->Get(AIDirectorOffset); - - GetAIDirectorOriginal(Context, Stack, Ret); - - *Ret = AIDirector; - return *Ret; -} - -UObject* UFortKismetLibrary::GetAIGoalManagerHook(UObject* Context, FFrame& Stack, UObject** Ret) -{ - auto GameMode = Cast(GetWorld()->GetGameMode()); - static auto AIGoalManagerOffset = GameMode->GetOffset("AIGoalManager"); - - auto GoalManager = GameMode->Get(AIGoalManagerOffset); - - GetAIGoalManagerOriginal(Context, Stack, Ret); - - *Ret = GoalManager; - return *Ret; -} - -AFortPickup* UFortKismetLibrary::K2_SpawnPickupInWorldHook(UObject* Context, FFrame& Stack, AFortPickup** Ret) -{ - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UFortWorldItemDefinition* ItemDefinition; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int NumberToSpawn; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Position; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Direction; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int OverrideMaxStackCount; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bToss; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bRandomRotation; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bBlockedFromAutoPickup; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int PickupInstigatorHandle; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - uint8 SourceType; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - uint8 Source; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AFortPlayerController* OptionalOwnerPC; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bPickupOnlyRelevantToOwner; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - - Stack.StepCompiledIn(&WorldContextObject); - Stack.StepCompiledIn(&ItemDefinition); - Stack.StepCompiledIn(&NumberToSpawn); - Stack.StepCompiledIn(&Position); - Stack.StepCompiledIn(&Direction); - Stack.StepCompiledIn(&OverrideMaxStackCount); - Stack.StepCompiledIn(&bToss); - Stack.StepCompiledIn(&bRandomRotation); - Stack.StepCompiledIn(&bBlockedFromAutoPickup); - Stack.StepCompiledIn(&PickupInstigatorHandle); - Stack.StepCompiledIn(&SourceType); - Stack.StepCompiledIn(&Source); - Stack.StepCompiledIn(&OptionalOwnerPC); - Stack.StepCompiledIn(&bPickupOnlyRelevantToOwner); - - LOG_INFO(LogDev, "[{}] ItemDefinition: {}", __FUNCTION__, ItemDefinition->IsValidLowLevel() ? ItemDefinition->GetFullName() : "InvalidObject"); - - if (!ItemDefinition->IsValidLowLevel()) - return K2_SpawnPickupInWorldOriginal(Context, Stack, Ret); - - auto Pawn = OptionalOwnerPC ? OptionalOwnerPC->GetMyFortPawn() : nullptr; - - auto GameState = Cast(GetWorld()->GetGameState()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, NumberToSpawn, -1, MAX_DURABILITY, GameState->GetWorldLevel()); - CreateData.SpawnLocation = Position; - CreateData.bToss = bToss; - CreateData.bRandomRotation = bRandomRotation; - CreateData.PawnOwner = Pawn; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - CreateData.PawnOwner = OptionalOwnerPC ? OptionalOwnerPC->GetMyFortPawn() : nullptr; - - auto NewPickup = AFortPickup::SpawnPickup(CreateData); - - K2_SpawnPickupInWorldOriginal(Context, Stack, Ret); - - *Ret = NewPickup; - return *Ret; -} - -bool UFortKismetLibrary::PickLootDropsHook(UObject* Context, FFrame& Stack, bool* Ret) -{ - static auto WorldContextObjectOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.PickLootDrops", "WorldContextObject", false); - - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - TArray OutLootToDropTempBuf; // (Parm, OutParm, ZeroConstructor, NativeAccessSpecifierPublic) - FName TierGroupName; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int WorldLevel; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int ForcedLootTier; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - - if (WorldContextObjectOffset != -1) - Stack.StepCompiledIn(&WorldContextObject); - - auto& OutLootToDrop = Stack.StepCompiledInRef>(&OutLootToDropTempBuf); - Stack.StepCompiledIn(&TierGroupName); - Stack.StepCompiledIn(&WorldLevel); - Stack.StepCompiledIn(&ForcedLootTier); - - FFortItemEntry::FreeArrayOfEntries(OutLootToDropTempBuf); - - auto GameState = Cast(GetWorld()->GetGameState()); - - LOG_INFO(LogDev, "Picking loot for {}.", TierGroupName.ComparisonIndex.Value ? TierGroupName.ToString() : "InvalidName"); - - auto LootDrops = PickLootDrops(TierGroupName, WorldLevel, ForcedLootTier); - - for (int i = 0; i < LootDrops.size(); i++) - { - auto& LootDrop = LootDrops.at(i); - - auto NewEntry = FFortItemEntry::MakeItemEntry(LootDrop->GetItemDefinition(), LootDrop->GetCount(), LootDrop->GetLoadedAmmo()); - - OutLootToDrop.AddPtr(NewEntry, FFortItemEntry::GetStructSize()); - } - - PickLootDropsOriginal(Context, Stack, Ret); - - *Ret = true; - return *Ret; -} - -UClass* UFortKismetLibrary::StaticClass() -{ - static auto ptr = FindObject(L"/Script/FortniteGame.FortKismetLibrary"); - return ptr; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortKismetLibrary.h b/dependencies/reboot/Project Reboot 3.0/FortKismetLibrary.h deleted file mode 100644 index a322173..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortKismetLibrary.h +++ /dev/null @@ -1,109 +0,0 @@ -#pragma once - -#include "Object.h" - -#include "FortResourceItemDefinition.h" -#include "FortPlayerController.h" -#include "BuildingSMActor.h" -#include "FortPickup.h" - -using UFortInventoryOwnerInterface = UObject; - -struct FSpawnItemVariantParams -{ - static UStruct* GetStruct() - { - static auto SpawnItemVariantsParamsStruct = FindObject("/Script/FortniteGame.SpawnItemVariantParams"); - return SpawnItemVariantsParamsStruct; - } - - static int GetStructSize() - { - static auto StructSize = GetStruct()->GetPropertiesSize(); - return StructSize; - } - - UFortWorldItemDefinition*& GetWorldItemDefinition() - { - static auto WorldItemDefinitionOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "WorldItemDefinition"); - return *(UFortWorldItemDefinition**)(__int64(this) + WorldItemDefinitionOffset); - } - - int& GetNumberToSpawn() - { - static auto NumberToSpawnOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "NumberToSpawn"); - return *(int*)(__int64(this) + NumberToSpawnOffset); - } - - uint8& GetSourceType() - { - static auto SourceTypeOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "SourceType"); - return *(uint8*)(__int64(this) + SourceTypeOffset); - } - - uint8& GetSource() - { - static auto SourceOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "Source"); - return *(uint8*)(__int64(this) + SourceOffset); - } - - FVector& GetDirection() - { - static auto DirectionOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "Direction"); - return *(FVector*)(__int64(this) + DirectionOffset); - } - - FVector& GetPosition() - { - static auto PositionOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "Position"); - - if (PositionOffset == -1) - PositionOffset = 0x2C; // wtf - - return *(FVector*)(__int64(this) + PositionOffset); - } -}; - -class UFortKismetLibrary : public UObject -{ -public: - static inline void (*K2_GiveItemToPlayerOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*K2_RemoveItemFromPlayerOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*K2_RemoveItemFromPlayerByGuidOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*GiveItemToInventoryOwnerOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*K2_RemoveFortItemFromPlayerOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline AFortPickup* (*K2_SpawnPickupInWorldOriginal)(UObject* Context, FFrame& Stack, AFortPickup** Ret); - static inline bool (*PickLootDropsOriginal)(UObject* Context, FFrame& Stack, bool* Ret); - static inline AFortPickup* (*K2_SpawnPickupInWorldWithClassOriginal)(UObject* Context, FFrame& Stack, AFortPickup** Ret); - static inline void (*CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*K2_SpawnPickupInWorldWithLootTierOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline bool (*SpawnInstancedPickupInWorldOriginal)(UObject* Context, FFrame& Stack, bool* Ret); - static inline void (*SpawnItemVariantPickupInWorldOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*K2_GiveBuildingResourceOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*PickLootDropsWithNamedWeightsOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline UObject* (*GetAIDirectorOriginal)(UObject* Context, FFrame& Stack, UObject** Ret); - static inline UObject* (*GetAIGoalManagerOriginal)(UObject* Context, FFrame& Stack, UObject** Ret); - - static UFortResourceItemDefinition* K2_GetResourceItemDefinition(EFortResourceType ResourceType); - static void ApplyCharacterCosmetics(UObject* WorldContextObject, const TArray& CharacterParts, UObject* PlayerState, bool* bSuccess); - static FVector FindGroundLocationAt(UWorld* World, AActor* IgnoreActor, FVector InLocation, float TraceStartZ, float TraceEndZ, FName TraceName); - - static void PickLootDropsWithNamedWeightsHook(UObject* Context, FFrame& Stack, void* Ret); - static void SpawnItemVariantPickupInWorldHook(UObject* Context, FFrame& Stack, void* Ret); - static bool SpawnInstancedPickupInWorldHook(UObject* Context, FFrame& Stack, bool* Ret); - static void K2_SpawnPickupInWorldWithLootTierHook(UObject* Context, FFrame& Stack, void* Ret); - static void CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHook(UObject* Context, FFrame& Stack, void* Ret); - static void GiveItemToInventoryOwnerHook(UObject* Context, FFrame& Stack, void* Ret); - static void K2_RemoveItemFromPlayerHook(UObject* Context, FFrame& Stack, void* Ret); - static void K2_RemoveItemFromPlayerByGuidHook(UObject* Context, FFrame& Stack, void* Ret); - static void K2_GiveItemToPlayerHook(UObject* Context, FFrame& Stack, void* Ret); - static void K2_GiveBuildingResourceHook(UObject* Context, FFrame& Stack, void* Ret); - static void K2_RemoveFortItemFromPlayerHook(UObject* Context, FFrame& Stack, void* Ret); - static AFortPickup* K2_SpawnPickupInWorldHook(UObject* Context, FFrame& Stack, AFortPickup** Ret); - static AFortPickup* K2_SpawnPickupInWorldWithClassHook(UObject* Context, FFrame& Stack, AFortPickup** Ret); - static UObject* GetAIDirectorHook(UObject* Context, FFrame& Stack, UObject** Ret); - static UObject* GetAIGoalManagerHook(UObject* Context, FFrame& Stack, UObject** Ret); - static bool PickLootDropsHook(UObject* Context, FFrame& Stack, bool* Ret); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortLootLevel.cpp b/dependencies/reboot/Project Reboot 3.0/FortLootLevel.cpp deleted file mode 100644 index 2ab6794..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortLootLevel.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "FortLootLevel.h" -#include "FortWorldItemDefinition.h" - -int UFortLootLevel::GetItemLevel(const FDataTableCategoryHandle& LootLevelData, int WorldLevel) -{ - // OMG IM GONNA DIE - - // we should use GetRows but L - - auto DataTable = LootLevelData.DataTable; - - if (!DataTable) - return 0; - - if (!LootLevelData.ColumnName.ComparisonIndex.Value) - return 0; - - if (!LootLevelData.RowContents.ComparisonIndex.Value) - return 0; - - std::vector OurLootLevelDatas; - - for (auto& LootLevelDataPair : LootLevelData.DataTable->GetRowMap()) - { - if (LootLevelDataPair.Second->Category != LootLevelData.RowContents) - continue; - - OurLootLevelDatas.push_back(LootLevelDataPair.Second); - } - - if (OurLootLevelDatas.size() > 0) - { - int PickedIndex = -1; - int PickedLootLevel = 0; - - for (int i = 0; i < OurLootLevelDatas.size(); i++) - { - auto CurrentLootLevelData = OurLootLevelDatas.at(i); - - if (CurrentLootLevelData->LootLevel <= WorldLevel && CurrentLootLevelData->LootLevel > PickedLootLevel) - { - PickedLootLevel = CurrentLootLevelData->LootLevel; - PickedIndex = i; - } - } - - if (PickedIndex != -1) - { - auto PickedLootLevelData = OurLootLevelDatas.at(PickedIndex); - - const auto PickedMinItemLevel = PickedLootLevelData->MinItemLevel; - const auto PickedMaxItemLevel = PickedLootLevelData->MaxItemLevel; - auto v15 = PickedMaxItemLevel - PickedMinItemLevel; - - if (v15 + 1 <= 0) - { - v15 = 0; - } - else - { - auto v16 = (int)(float)((float)((float)rand() * 0.000030518509) * (float)(v15 + 1)); - if (v16 <= v15) - v15 = v16; - } - - return v15 + PickedMinItemLevel; - } - } - - return 0; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortLootLevel.h b/dependencies/reboot/Project Reboot 3.0/FortLootLevel.h deleted file mode 100644 index 77b807e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortLootLevel.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "DataTable.h" - -class UFortLootLevel -{ -public: - static int GetItemLevel(const FDataTableCategoryHandle& LootLevelData, int WorldLevel); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortLootPackage.cpp b/dependencies/reboot/Project Reboot 3.0/FortLootPackage.cpp deleted file mode 100644 index 1d73bdf..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortLootPackage.cpp +++ /dev/null @@ -1,740 +0,0 @@ -#include "FortLootPackage.h" - -#include "DataTable.h" -#include "KismetMathLibrary.h" -#include "FortWeaponItemDefinition.h" -#include "UObjectArray.h" -#include "GameplayTagContainer.h" -#include "FortGameModeAthena.h" -#include "FortLootLevel.h" - -struct FFortGameFeatureLootTableData -{ - TSoftObjectPtr LootTierData; - TSoftObjectPtr LootPackageData; -}; - -#define LOOTING_MAP_TYPE std::map // uhhh // TODO (Milxnor) switch bad to map - -template -void CollectDataTablesRows(const std::vector& DataTables, LOOTING_MAP_TYPE* OutMap, std::function Check = []() { return true; }) -{ - std::vector DataTablesToIterate; - - static auto CompositeDataTableClass = FindObject(L"/Script/Engine.CompositeDataTable"); - - for (UDataTable* DataTable : DataTables) - { - if (!Addresses::LoadAsset && !DataTable->IsValidLowLevel()) - { - continue; // Remove from vector? - } - - // if (auto CompositeDataTable = Cast(DataTable)) - if (DataTable->IsA(CompositeDataTableClass)) - { - auto CompositeDataTable = DataTable; - - static auto ParentTablesOffset = CompositeDataTable->GetOffset("ParentTables"); - auto& ParentTables = CompositeDataTable->Get>(ParentTablesOffset); - - for (int i = 0; i < ParentTables.Num(); ++i) - { - DataTablesToIterate.push_back(ParentTables.at(i)); - } - } - - DataTablesToIterate.push_back(DataTable); - } - - for (auto CurrentDataTable : DataTablesToIterate) - { - for (TPair& CurrentPair : CurrentDataTable->GetRowMap()) - { - if (Check(CurrentPair.Key(), (RowStructType*)CurrentPair.Value())) - { - // LOG_INFO(LogDev, "Setting key with {} comp {} num: {} then iterating through map!", CurrentPair.Key().ToString(), CurrentPair.Key().ComparisonIndex.Value, CurrentPair.Key().Number); - (*OutMap)[CurrentPair.Key()] = (RowStructType*)CurrentPair.Value(); - - /* for (auto PairInOutMap : *OutMap) - { - // LOG_INFO(LogDev, "Current Row Key {} comp {} num: {}!", PairInOutMap.first.ToString(), PairInOutMap.first.ComparisonIndex.Value, PairInOutMap.first.Number); - } */ - } - } - } -} - -float GetAmountOfLootPackagesToDrop(FFortLootTierData* LootTierData, int OriginalNumberLootDrops) -{ - if (LootTierData->GetLootPackageCategoryMinArray().Num() != LootTierData->GetLootPackageCategoryWeightArray().Num() - || LootTierData->GetLootPackageCategoryMinArray().Num() != LootTierData->GetLootPackageCategoryMaxArray().Num() - ) - return 0; - - // return OriginalNumberLootDrops; - - float MinimumLootDrops = 0; - - if (LootTierData->GetLootPackageCategoryMinArray().Num() > 0) - { - for (int i = 0; i < LootTierData->GetLootPackageCategoryMinArray().Num(); ++i) - { - // Fortnite does more here, we need to figure it out. - MinimumLootDrops += LootTierData->GetLootPackageCategoryMinArray().at(i); - } - } - - if (MinimumLootDrops > OriginalNumberLootDrops) - { - LOG_INFO(LogLoot, "Requested {} loot drops but minimum drops is {} for loot package {}", OriginalNumberLootDrops, MinimumLootDrops, LootTierData->GetLootPackage().ToString()); - // Fortnite doesn't return here? - } - - int SumLootPackageCategoryWeightArray = 0; - - if (LootTierData->GetLootPackageCategoryWeightArray().Num() > 0) - { - for (int i = 0; i < LootTierData->GetLootPackageCategoryWeightArray().Num(); ++i) - { - // Fortnite does more here, we need to figure it out. - - if (LootTierData->GetLootPackageCategoryWeightArray().at(i) > 0) - { - auto LootPackageCategoryMaxArrayIt = LootTierData->GetLootPackageCategoryMaxArray().at(i); - - float IDK = 0; // TODO - - if (LootPackageCategoryMaxArrayIt < 0 || IDK < LootPackageCategoryMaxArrayIt) - { - SumLootPackageCategoryWeightArray += LootTierData->GetLootPackageCategoryWeightArray().at(i); - } - } - } - } - - // if (MinimumLootDrops < OriginalNumberLootDrops) // real commeneted one to one - { - // IDK - - while (SumLootPackageCategoryWeightArray > 0) - { - // HONESTLY IDEK WHAT FORTNITE DOES HERE - - float v29 = (float)rand() * 0.000030518509f; - - float v35 = (int)(float)((float)((float)((float)SumLootPackageCategoryWeightArray * v29) - + (float)((float)SumLootPackageCategoryWeightArray * v29)) - + 0.5f) >> 1; - - // OutLootTierInfo->Hello++; - MinimumLootDrops++; - - if (MinimumLootDrops >= OriginalNumberLootDrops) - return MinimumLootDrops; - - SumLootPackageCategoryWeightArray--; - } - - /* if (MinimumLootDrops < OriginalNumberLootDrops) - { - std::cout << std::format("Requested {} loot drops but maximum drops is {} for loot package {}\n", OriginalNumberLootDrops, MinimumLootDrops, LootTierData->LootPackage.ToString()); - } */ - } - - return MinimumLootDrops; -} - -/*struct UFortLootPackage -{ - int CurrentIdx = 0; - std::vector ItemEntries; -}; */ - -FFortLootTierData* PickLootTierData(const std::vector& LTDTables, FName LootTierGroup, int ForcedLootTier = -1, FName* OutRowName = nullptr) // Fortnite returns the row name and then finds the tier data again, but I really don't see the point of this. -{ - // This like isn't right, at all. - - float LootTier = ForcedLootTier; - - if (LootTier == -1) - { - // LootTier = ?? - } - else - { - // buncha code im too lazy to reverse - } - - // if (fabs(LootTier) <= 0.0000000099999999f) - // return 0; - - int Multiplier = LootTier == -1 ? 1 : LootTier; // Idk i think we need to fill out the code above for this to work properly maybe - - LOOTING_MAP_TYPE TierGroupLTDs; - - CollectDataTablesRows(LTDTables, &TierGroupLTDs, [&](FName RowName, FFortLootTierData* TierData) -> bool { - if (LootTierGroup == TierData->GetTierGroup()) - { - if ((LootTier == -1 ? true : LootTier == TierData->GetLootTier())) - { - return true; - } - } - - return false; - }); - - // LOG_INFO(LogDev, "TierGroupLTDs.size(): {}", TierGroupLTDs.size()); - - FFortLootTierData* ChosenRowLootTierData = PickWeightedElement(TierGroupLTDs, - [](FFortLootTierData* LootTierData) -> float { return LootTierData->GetWeight(); }, RandomFloatForLoot, -1, - true, Multiplier, OutRowName); - - return ChosenRowLootTierData; -} - -void PickLootDropsFromLootPackage(const std::vector& LPTables, const FName& LootPackageName, std::vector* OutEntries, int LootPackageCategory = -1, int WorldLevel = 0, bool bPrint = false, bool bCombineDrops = true) -{ - if (!OutEntries) - return; - - LOOTING_MAP_TYPE LootPackageIDMap; - - CollectDataTablesRows(LPTables, &LootPackageIDMap, [&](FName RowName, FFortLootPackageData* LootPackage) -> bool { - if (LootPackage->GetLootPackageID() != LootPackageName) - { - return false; - } - - if (LootPackageCategory != -1 && LootPackage->GetLootPackageCategory() != LootPackageCategory) // idk if proper - { - return false; - } - - if (WorldLevel >= 0) - { - if (LootPackage->GetMaxWorldLevel() >= 0 && WorldLevel > LootPackage->GetMaxWorldLevel()) - return 0; - - if (LootPackage->GetMinWorldLevel() >= 0 && WorldLevel < LootPackage->GetMinWorldLevel()) - return 0; - } - - return true; - }); - - if (LootPackageIDMap.size() == 0) - { - // std::cout << std::format("Loot Package {} has no valid weights.\n", LootPackageName.ToString()); - return; - } - - FName PickedPackageRowName; - FFortLootPackageData* PickedPackage = PickWeightedElement(LootPackageIDMap, - [](FFortLootPackageData* LootPackageData) -> float { return LootPackageData->GetWeight(); }, RandomFloatForLoot, - -1, true, 1, &PickedPackageRowName, bPrint); - - if (!PickedPackage) - return; - - if (bPrint) - LOG_INFO(LogLoot, "PickLootDropsFromLootPackage selected package {} with loot package category {} with weight {} from LootPackageIDMap of size: {}", PickedPackageRowName.ToString(), LootPackageCategory, PickedPackage->GetWeight(), LootPackageIDMap.size()); - - if (PickedPackage->GetLootPackageCall().Data.Num() > 1) - { - if (PickedPackage->GetCount() > 0) - { - int v9 = 0; - - while (v9 < PickedPackage->GetCount()) - { - int LootPackageCategoryToUseForLPCall = 0; // hmm - - PickLootDropsFromLootPackage(LPTables, - PickedPackage->GetLootPackageCall().Data.Data ? UKismetStringLibrary::Conv_StringToName(PickedPackage->GetLootPackageCall()) : FName(0), - OutEntries, LootPackageCategoryToUseForLPCall, WorldLevel, bPrint - ); - - v9++; - } - } - - return; - } - - auto ItemDefinition = PickedPackage->GetItemDefinition().Get(UFortItemDefinition::StaticClass(), true); - - if (!ItemDefinition) - { - LOG_INFO(LogLoot, "Loot Package {} does not contain a LootPackageCall or ItemDefinition.", PickedPackage->GetLootPackageID().ToString()); - return; - } - - auto WeaponItemDefinition = Cast(ItemDefinition); - int LoadedAmmo = WeaponItemDefinition ? WeaponItemDefinition->GetClipSize() : 0; // we shouldnt set loaded ammo here techinally - - auto WorldItemDefinition = Cast(ItemDefinition); - - if (!WorldItemDefinition) // hahahah not proper!! - return; - - int ItemLevel = UFortLootLevel::GetItemLevel(WorldItemDefinition->GetLootLevelData(), WorldLevel); - - int CountMultiplier = 1; - int FinalCount = CountMultiplier * PickedPackage->GetCount(); - - if (FinalCount > 0) - { - int FinalItemLevel = 0; - - if (ItemLevel >= 0) - FinalItemLevel = ItemLevel; - - while (FinalCount > 0) - { - int MaxStackSize = ItemDefinition->GetMaxStackSize(); - - int CurrentCountForEntry = MaxStackSize; - - if (FinalCount <= MaxStackSize) - CurrentCountForEntry = FinalCount; - - if (CurrentCountForEntry <= 0) - CurrentCountForEntry = 0; - - auto ActualItemLevel = WorldItemDefinition->PickLevel(FinalItemLevel); - - bool bHasCombined = false; - - if (bCombineDrops) - { - for (auto& CurrentLootDrop : *OutEntries) - { - if (CurrentLootDrop->GetItemDefinition() == ItemDefinition) - { - int NewCount = CurrentLootDrop->GetCount() + CurrentCountForEntry; - - if (NewCount <= ItemDefinition->GetMaxStackSize()) - { - bHasCombined = true; - CurrentLootDrop->GetCount() = NewCount; - } - } - } - } - - if (!bHasCombined) - { - OutEntries->push_back(LootDrop(FFortItemEntry::MakeItemEntry(ItemDefinition, CurrentCountForEntry, LoadedAmmo, MAX_DURABILITY, ActualItemLevel))); - } - - if (Engine_Version >= 424) - { - /* - - Alright, so Fortnite literally doesn't reference the first loot package category for chests and floor loot (didnt check rest). - Usually the first loot package category in our case is ammo, so this is quite weird. - I have no clue how Fortnite would actually add the ammo. - - Guess what, on the chapter 2 new loot tier groups, like FactionChests, they don't even have a package which has ammo as its loot package call. - - */ - - bool IsWeapon = PickedPackage->GetLootPackageID().ToString().contains(".Weapon.") && WeaponItemDefinition; // ONG? - - if (IsWeapon) - { - auto AmmoData = WeaponItemDefinition->GetAmmoData(); - - if (AmmoData) - { - int AmmoCount = AmmoData->GetDropCount(); // idk about this one - - OutEntries->push_back(LootDrop(FFortItemEntry::MakeItemEntry(AmmoData, AmmoCount))); - } - } - } - - if (bPrint) - { - LOG_INFO(LogLoot, "Adding Item: {}", ItemDefinition->GetPathName()); - } - - FinalCount -= CurrentCountForEntry; - } - } -} - -// #define brudda - -std::vector PickLootDrops(FName TierGroupName, int WorldLevel, int ForcedLootTier, bool bPrint, int recursive, bool bCombineDrops) -{ - std::vector LootDrops; - - if (recursive > 6) - return LootDrops; - - auto GameState = ((AFortGameModeAthena*)GetWorld()->GetGameMode())->GetGameStateAthena(); - static auto CurrentPlaylistDataOffset = GameState->GetOffset("CurrentPlaylistData", false); - - static std::vector LTDTables; - static std::vector LPTables; - - static auto CompositeDataTableClass = FindObject(L"/Script/Engine.CompositeDataTable"); - - static int LastNum1 = 14915; - - auto CurrentPlaylist = CurrentPlaylistDataOffset == -1 && Fortnite_Version < 6 ? nullptr : GameState->GetCurrentPlaylist(); - - if (LastNum1 != Globals::AmountOfListens) - { - LastNum1 = Globals::AmountOfListens; - - LTDTables.clear(); - LPTables.clear(); - - bool bFoundPlaylistTable = false; - - if (CurrentPlaylist) - { - static auto LootTierDataOffset = CurrentPlaylist->GetOffset("LootTierData"); - auto& LootTierDataSoft = CurrentPlaylist->Get>(LootTierDataOffset); - - static auto LootPackagesOffset = CurrentPlaylist->GetOffset("LootPackages"); - auto& LootPackagesSoft = CurrentPlaylist->Get>(LootPackagesOffset); - - if (LootTierDataSoft.IsValid() && LootPackagesSoft.IsValid()) - { - auto LootTierDataStr = LootTierDataSoft.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - auto LootPackagesStr = LootPackagesSoft.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - auto LootTierDataTableIsComposite = LootTierDataStr.contains("Composite"); - auto LootPackageTableIsComposite = LootPackagesStr.contains("Composite"); - - UDataTable* StrongLootTierData = nullptr; - UDataTable* StrongLootPackage = nullptr; - - if (!Addresses::LoadAsset) - { - StrongLootTierData = LootTierDataSoft.Get(LootTierDataTableIsComposite ? CompositeDataTableClass : UDataTable::StaticClass(), true); - StrongLootPackage = LootPackagesSoft.Get(LootPackageTableIsComposite ? CompositeDataTableClass : UDataTable::StaticClass(), true); - } - else - { - StrongLootTierData = (UDataTable*)Assets::LoadAsset(LootTierDataSoft.SoftObjectPtr.ObjectID.AssetPathName); - StrongLootPackage = (UDataTable*)Assets::LoadAsset(LootPackagesSoft.SoftObjectPtr.ObjectID.AssetPathName); - } - - if (StrongLootTierData && StrongLootPackage) - { - LTDTables.push_back(StrongLootTierData); - LPTables.push_back(StrongLootPackage); - - bFoundPlaylistTable = true; - } - } - } - - if (!bFoundPlaylistTable) - { - if (Addresses::LoadAsset) - { - LTDTables.push_back((UDataTable*)Assets::LoadAsset(UKismetStringLibrary::Conv_StringToName(L"/Game/Items/Datatables/AthenaLootTierData_Client.AthenaLootTierData_Client"))); - LPTables.push_back((UDataTable*)Assets::LoadAsset(UKismetStringLibrary::Conv_StringToName(L"/Game/Items/Datatables/AthenaLootPackages_Client.AthenaLootPackages_Client"))); - } - else - { - LTDTables.push_back(LoadObject(L"/Game/Items/Datatables/AthenaLootTierData_Client.AthenaLootTierData_Client")); - LPTables.push_back(LoadObject(L"/Game/Items/Datatables/AthenaLootPackages_Client.AthenaLootPackages_Client")); - } - } - - // LTDTables.push_back(LoadObject(L"/Game/Athena/Playlists/Playground/AthenaLootTierData_Client.AthenaLootTierData_Client")); - // LPTables.push_back(LoadObject(L"/Game/Athena/Playlists/Playground/AthenaLootPackages_Client.AthenaLootPackages_Client")); - - static auto FortGameFeatureDataClass = FindObject(L"/Script/FortniteGame.FortGameFeatureData"); - - if (FortGameFeatureDataClass) - { - for (int i = 0; i < ChunkedObjects->Num(); ++i) - { - auto Object = ChunkedObjects->GetObjectByIndex(i); - - if (!Object) - continue; - - if (Object->IsA(FortGameFeatureDataClass)) - { - auto GameFeatureData = Object; - static auto DefaultLootTableDataOffset = GameFeatureData->GetOffset("DefaultLootTableData"); - - if (DefaultLootTableDataOffset != -1) - { - auto DefaultLootTableData = GameFeatureData->GetPtr(DefaultLootTableDataOffset); - - auto LootTierDataTableStr = DefaultLootTableData->LootTierData.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - - auto LootTierDataTableIsComposite = LootTierDataTableStr.contains("Composite"); - auto LootPackageTableStr = DefaultLootTableData->LootPackageData.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - auto LootPackageTableIsComposite = LootPackageTableStr.contains("Composite"); - - auto LootTierDataPtr = DefaultLootTableData->LootTierData.Get(LootTierDataTableIsComposite ? CompositeDataTableClass : UDataTable::StaticClass(), true); - auto LootPackagePtr = DefaultLootTableData->LootPackageData.Get(LootPackageTableIsComposite ? CompositeDataTableClass : UDataTable::StaticClass(), true); - - if (LootPackagePtr) - { - LPTables.push_back(LootPackagePtr); - } - - if (CurrentPlaylist) - { - static auto PlaylistOverrideLootTableDataOffset = GameFeatureData->GetOffset("PlaylistOverrideLootTableData"); - auto& PlaylistOverrideLootTableData = GameFeatureData->Get>(PlaylistOverrideLootTableDataOffset); - - static auto GameplayTagContainerOffset = CurrentPlaylist->GetOffset("GameplayTagContainer"); - auto GameplayTagContainer = CurrentPlaylist->GetPtr(GameplayTagContainerOffset); - - for (int i = 0; i < GameplayTagContainer->GameplayTags.Num(); ++i) - { - auto& Tag = GameplayTagContainer->GameplayTags.At(i); - - for (auto& Value : PlaylistOverrideLootTableData) - { - auto CurrentOverrideTag = Value.First; - - if (Tag.TagName == CurrentOverrideTag.TagName) - { - auto OverrideLootPackageTableStr = Value.Second.LootPackageData.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - auto bOverrideIsComposite = OverrideLootPackageTableStr.contains("Composite"); - - auto ptr = Value.Second.LootPackageData.Get(bOverrideIsComposite ? CompositeDataTableClass : UDataTable::StaticClass(), true); - - if (ptr) - { - /* if (bOverrideIsComposite) - { - static auto ParentTablesOffset = ptr->GetOffset("ParentTables"); - - auto ParentTables = ptr->GetPtr>(ParentTablesOffset); - - for (int z = 0; z < ParentTables->size(); z++) - { - auto ParentTable = ParentTables->At(z); - - if (ParentTable) - { - LPTables.push_back(ParentTable); - } - } - } */ - - LPTables.push_back(ptr); - } - } - } - } - } - - if (LootTierDataPtr) - { - LTDTables.push_back(LootTierDataPtr); - } - - if (CurrentPlaylist) - { - static auto PlaylistOverrideLootTableDataOffset = GameFeatureData->GetOffset("PlaylistOverrideLootTableData"); - auto& PlaylistOverrideLootTableData = GameFeatureData->Get>(PlaylistOverrideLootTableDataOffset); - - static auto GameplayTagContainerOffset = CurrentPlaylist->GetOffset("GameplayTagContainer"); - auto GameplayTagContainer = CurrentPlaylist->GetPtr(GameplayTagContainerOffset); - - for (int i = 0; i < GameplayTagContainer->GameplayTags.Num(); ++i) - { - auto& Tag = GameplayTagContainer->GameplayTags.At(i); - - for (auto& Value : PlaylistOverrideLootTableData) - { - auto CurrentOverrideTag = Value.First; - - if (Tag.TagName == CurrentOverrideTag.TagName) - { - auto OverrideLootTierDataStr = Value.Second.LootTierData.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - auto bOverrideIsComposite = OverrideLootTierDataStr.contains("Composite"); - - auto ptr = Value.Second.LootTierData.Get(bOverrideIsComposite ? CompositeDataTableClass : UDataTable::StaticClass(), true); - - if (ptr) - { - /* if (bOverrideIsComposite) - { - static auto ParentTablesOffset = ptr->GetOffset("ParentTables"); - - auto ParentTables = ptr->GetPtr>(ParentTablesOffset); - - for (int z = 0; z < ParentTables->size(); z++) - { - auto ParentTable = ParentTables->At(z); - - if (ParentTable) - { - LTDTables.push_back(ParentTable); - } - } - } */ - - LTDTables.push_back(ptr); - } - } - } - } - } - } - } - } - } - - for (int i = 0; i < LTDTables.size(); ++i) - { - auto& Table = LTDTables.at(i); - - if (!Table->IsValidLowLevel()) - { - continue; - } - - Table->AddToRoot(); - LOG_INFO(LogDev, "[{}] LTD {}", i, Table->GetFullName()); - } - - for (int i = 0; i < LPTables.size(); ++i) - { - auto& Table = LPTables.at(i); - - if (!Table->IsValidLowLevel()) - { - continue; - } - - Table->AddToRoot(); - LOG_INFO(LogDev, "[{}] LP {}", i, Table->GetFullName()); - } - } - - if (!Addresses::LoadAsset) - { - if (Fortnite_Version <= 6 || std::floor(Fortnite_Version) == 9) // ahhh - { - LTDTables.clear(); - LPTables.clear(); - - bool bFoundPlaylistTable = false; - - if (CurrentPlaylist) - { - static auto LootTierDataOffset = CurrentPlaylist->GetOffset("LootTierData"); - auto& LootTierDataSoft = CurrentPlaylist->Get>(LootTierDataOffset); - - static auto LootPackagesOffset = CurrentPlaylist->GetOffset("LootPackages"); - auto& LootPackagesSoft = CurrentPlaylist->Get>(LootPackagesOffset); - - if (LootTierDataSoft.IsValid() && LootPackagesSoft.IsValid()) - { - auto LootTierDataStr = LootTierDataSoft.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - auto LootPackagesStr = LootPackagesSoft.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - auto LootTierDataTableIsComposite = LootTierDataStr.contains("Composite"); - auto LootPackageTableIsComposite = LootPackagesStr.contains("Composite"); - - UDataTable* StrongLootTierData = nullptr; - UDataTable* StrongLootPackage = nullptr; - - StrongLootTierData = LootTierDataSoft.Get(LootTierDataTableIsComposite ? CompositeDataTableClass : UDataTable::StaticClass(), true); - StrongLootPackage = LootPackagesSoft.Get(LootPackageTableIsComposite ? CompositeDataTableClass : UDataTable::StaticClass(), true); - - if (StrongLootTierData && StrongLootPackage) - { - LTDTables.push_back(StrongLootTierData); - LPTables.push_back(StrongLootPackage); - - bFoundPlaylistTable = true; - } - } - } - - if (!bFoundPlaylistTable) - { - LTDTables.push_back(LoadObject(L"/Game/Items/Datatables/AthenaLootTierData_Client.AthenaLootTierData_Client")); - LPTables.push_back(LoadObject(L"/Game/Items/Datatables/AthenaLootPackages_Client.AthenaLootPackages_Client")); - } - } - - } - - if (LTDTables.size() <= 0 || LPTables.size() <= 0) - { - LOG_WARN(LogLoot, "Empty tables! ({} {})", LTDTables.size(), LPTables.size()); - return LootDrops; - } - - FName LootTierRowName; - auto ChosenRowLootTierData = PickLootTierData(LTDTables, TierGroupName, ForcedLootTier, &LootTierRowName); - - if (!ChosenRowLootTierData) - { - LOG_INFO(LogLoot, "Failed to find LootTierData row for {} with loot tier {}", TierGroupName.ToString(), ForcedLootTier); - return LootDrops; - } - else if (bPrint) - { - LOG_INFO(LogLoot, "Picked loot tier data row {}", LootTierRowName.ToString()); - } - - // auto ChosenLootPackageName = ChosenRowLootTierData->GetLootPackage().ToString(); - - // if (ChosenLootPackageName.contains(".Empty")) { return PickLootDropsNew(TierGroupName, bPrint, ++recursive); } - - float NumLootPackageDrops = ChosenRowLootTierData->GetNumLootPackageDrops(); - - float NumberLootDrops = 0; - - if (NumLootPackageDrops > 0) - { - if (NumLootPackageDrops < 1) - { - NumberLootDrops = 1; - } - else - { - NumberLootDrops = (int)(float)((float)(NumLootPackageDrops + NumLootPackageDrops) - 0.5f) >> 1; - float v20 = NumLootPackageDrops - NumberLootDrops; - if (v20 > 0.0000099999997f) - { - NumberLootDrops += v20 >= (rand() * 0.000030518509f); - } - } - } - - float AmountOfLootPackageDrops = GetAmountOfLootPackagesToDrop(ChosenRowLootTierData, NumberLootDrops); - - LootDrops.reserve(AmountOfLootPackageDrops); - - if (AmountOfLootPackageDrops > 0) - { - for (int i = 0; i < AmountOfLootPackageDrops; ++i) - { - if (i >= ChosenRowLootTierData->GetLootPackageCategoryMinArray().Num()) - break; - - for (int j = 0; j < ChosenRowLootTierData->GetLootPackageCategoryMinArray().at(i); ++j) - { - if (ChosenRowLootTierData->GetLootPackageCategoryMinArray().at(i) < 1) - break; - - int LootPackageCategory = i; - - PickLootDropsFromLootPackage(LPTables, ChosenRowLootTierData->GetLootPackage(), &LootDrops, LootPackageCategory, WorldLevel, bPrint); - } - } - } - - return LootDrops; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortLootPackage.h b/dependencies/reboot/Project Reboot 3.0/FortLootPackage.h deleted file mode 100644 index a43af74..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortLootPackage.h +++ /dev/null @@ -1,258 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include "Array.h" -#include "FortWorldItemDefinition.h" -#include "SoftObjectPtr.h" -#include "FortItem.h" - -struct FFortLootPackageData -{ -public: - FName& GetLootPackageID() - { - static auto LootPackageIDOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "LootPackageID"); - return *(FName*)(__int64(this) + LootPackageIDOffset); - } - - float& GetWeight() - { - static auto WeightOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "Weight"); - return *(float*)(__int64(this) + WeightOffset); - } - - FString& GetLootPackageCall() - { - static auto LootPackageCallOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "LootPackageCall"); - return *(FString*)(__int64(this) + LootPackageCallOffset); - } - - TSoftObjectPtr& GetItemDefinition() - { - static auto ItemDefinitionOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "ItemDefinition"); - return *(TSoftObjectPtr*)(__int64(this) + ItemDefinitionOffset); - } - - int& GetCount() - { - static auto CountOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "Count"); - return *(int*)(__int64(this) + CountOffset); - } - - int& GetLootPackageCategory() - { - static auto LootPackageCategoryOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "LootPackageCategory"); - return *(int*)(__int64(this) + LootPackageCategoryOffset); - } - - int& GetMinWorldLevel() - { - static auto MinWorldLevelOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "MinWorldLevel"); - return *(int*)(__int64(this) + MinWorldLevelOffset); - } - - int& GetMaxWorldLevel() - { - static auto MaxWorldLevelOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "MaxWorldLevel"); - return *(int*)(__int64(this) + MaxWorldLevelOffset); - } - - FString& GetAnnotation() - { - static auto AnnotationOffset = FindOffsetStruct("/Script/FortniteGame.FortLootPackageData", "Annotation"); - return *(FString*)(__int64(this) + AnnotationOffset); - } -}; - -struct FFortLootTierData -{ -public: - float& GetNumLootPackageDrops() - { - static auto NumLootPackageDropsOffset = FindOffsetStruct("/Script/FortniteGame.FortLootTierData", "NumLootPackageDrops"); - return *(float*)(__int64(this) + NumLootPackageDropsOffset); - } - - FName& GetTierGroup() - { - static auto TierGroupOffset = FindOffsetStruct("/Script/FortniteGame.FortLootTierData", "TierGroup"); - return *(FName*)(__int64(this) + TierGroupOffset); - } - - int& GetLootTier() - { - static auto LootTierOffset = FindOffsetStruct("/Script/FortniteGame.FortLootTierData", "LootTier"); - return *(int*)(__int64(this) + LootTierOffset); - } - - float& GetWeight() - { - static auto WeightOffset = FindOffsetStruct("/Script/FortniteGame.FortLootTierData", "Weight"); - return *(float*)(__int64(this) + WeightOffset); - } - - FName& GetLootPackage() - { - static auto LootPackageOffset = FindOffsetStruct("/Script/FortniteGame.FortLootTierData", "LootPackage"); - return *(FName*)(__int64(this) + LootPackageOffset); - } - - TArray& GetLootPackageCategoryWeightArray() - { - static auto LootPackageCategoryWeightArrayOffset = FindOffsetStruct("/Script/FortniteGame.FortLootTierData", "LootPackageCategoryWeightArray"); - return *(TArray*)(__int64(this) + LootPackageCategoryWeightArrayOffset); - } - - TArray& GetLootPackageCategoryMinArray() - { - static auto LootPackageCategoryMinArrayOffset = FindOffsetStruct("/Script/FortniteGame.FortLootTierData", "LootPackageCategoryMinArray"); - return *(TArray*)(__int64(this) + LootPackageCategoryMinArrayOffset); - } - - TArray& GetLootPackageCategoryMaxArray() - { - static auto LootPackageCategoryMaxArrayOffset = FindOffsetStruct("/Script/FortniteGame.FortLootTierData", "LootPackageCategoryMaxArray"); - return *(TArray*)(__int64(this) + LootPackageCategoryMaxArrayOffset); - } -}; - -struct LootDrop -{ - FFortItemEntry* ItemEntry; - - FFortItemEntry* operator->() { - return ItemEntry; - } - - ~LootDrop() - { - - } -}; - -static inline float RandomFloatForLoot(float AllWeightsSum) -{ - return (rand() * 0.000030518509f) * AllWeightsSum; -} - -template -FORCEINLINE static ValueType PickWeightedElement(const std::map& Elements, - std::function GetWeightFn, - std::function RandomFloatGenerator = RandomFloatForLoot, - float TotalWeightParam = -1, bool bCheckIfWeightIsZero = false, int RandMultiplier = 1, KeyType* OutName = nullptr, bool bPrint = false, bool bKeepGoingUntilWeGetValue = false) -{ - float TotalWeight = TotalWeightParam; - - if (TotalWeight == -1) - { - TotalWeight = std::accumulate(Elements.begin(), Elements.end(), 0.0f, [&](float acc, const std::pair& p) { - auto Weight = GetWeightFn(p.second); - - if (bPrint) - { - // if (Weight != 0) - { - LOG_INFO(LogLoot, "Adding weight {}", Weight); - } - } - - return acc + Weight; - }); - } - - float RandomNumber = // UKismetMathLibrary::RandomFloatInRange(0, TotalWeight); - RandMultiplier * RandomFloatGenerator(TotalWeight); - - if (bPrint) - { - LOG_INFO(LogLoot, "RandomNumber: {} TotalWeight: {} Elements.size(): {}", RandomNumber, TotalWeight, Elements.size()); - } - - for (auto& Element : Elements) - { - float Weight = GetWeightFn(Element.second); - - if (bCheckIfWeightIsZero && Weight == 0) - continue; - - if (RandomNumber <= Weight) - { - if (OutName) - *OutName = Element.first; - - return Element.second; - } - - RandomNumber -= Weight; - } - - if (bKeepGoingUntilWeGetValue) - return PickWeightedElement(Elements, GetWeightFn, RandomFloatGenerator, TotalWeightParam, bCheckIfWeightIsZero, RandMultiplier, OutName, bPrint, bKeepGoingUntilWeGetValue); - - return ValueType(); -} - - -template -FORCEINLINE static ValueType PickWeightedElement(const std::unordered_map& Elements, - std::function GetWeightFn, - std::function RandomFloatGenerator = RandomFloatForLoot, - float TotalWeightParam = -1, bool bCheckIfWeightIsZero = false, int RandMultiplier = 1, KeyType* OutName = nullptr, bool bPrint = false, bool bKeepGoingUntilWeGetValue = false) -{ - float TotalWeight = TotalWeightParam; - - if (TotalWeight == -1) - { - TotalWeight = std::accumulate(Elements.begin(), Elements.end(), 0.0f, [&](float acc, const std::pair& p) { - auto Weight = GetWeightFn(p.second); - - if (bPrint) - { - // if (Weight != 0) - { - LOG_INFO(LogLoot, "Adding weight {}", Weight); - } - } - - return acc + Weight; - }); - } - - float RandomNumber = // UKismetMathLibrary::RandomFloatInRange(0, TotalWeight); - RandMultiplier * RandomFloatGenerator(TotalWeight); - - if (bPrint) - { - LOG_INFO(LogLoot, "RandomNumber: {} TotalWeight: {} Elements.size(): {}", RandomNumber, TotalWeight, Elements.size()); - } - - for (auto& Element : Elements) - { - float Weight = GetWeightFn(Element.second); - - if (bCheckIfWeightIsZero && Weight == 0) - continue; - - if (RandomNumber <= Weight) - { - if (OutName) - *OutName = Element.first; - - return Element.second; - } - - RandomNumber -= Weight; - } - - if (bKeepGoingUntilWeGetValue) - return PickWeightedElement(Elements, GetWeightFn, RandomFloatGenerator, TotalWeightParam, bCheckIfWeightIsZero, RandMultiplier, OutName, bPrint, bKeepGoingUntilWeGetValue); - - return ValueType(); -} - -std::vector PickLootDrops(FName TierGroupName, int WorldLevel, int ForcedLootTier = -1, bool bPrint = false, int recursive = 0, bool bCombineDrops = true); \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortMinigame.cpp b/dependencies/reboot/Project Reboot 3.0/FortMinigame.cpp deleted file mode 100644 index e794f19..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortMinigame.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "FortMinigame.h" -#include "FortPlayerControllerAthena.h" - -void AFortMinigame::ClearPlayerInventoryHook(UObject* Context, FFrame& Stack, void* Ret) -{ - auto Minigame = (AFortMinigame*)Context; - - if (!Minigame) - return; - - AFortPlayerControllerAthena* PlayerController = nullptr; - - Stack.StepCompiledIn(&PlayerController); - - if (!PlayerController) - return; - - auto& ItemInstances = PlayerController->GetWorldInventory()->GetItemList().GetItemInstances(); - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.at(i); - - PlayerController->GetWorldInventory()->RemoveItem(ItemInstance->GetItemEntry()->GetItemGuid(), nullptr, ItemInstance->GetItemEntry()->GetCount()); - } - - PlayerController->GetWorldInventory()->Update(); - - return ClearPlayerInventoryOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortMinigame.h b/dependencies/reboot/Project Reboot 3.0/FortMinigame.h deleted file mode 100644 index 342e7d6..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortMinigame.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "reboot.h" - -#include "Actor.h" -#include "Stack.h" - -class AFortMinigame : public AActor // AInfo -{ -public: - static inline void (*ClearPlayerInventoryOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - static void ClearPlayerInventoryHook(UObject* Context, FFrame& Stack, void* Ret); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortMountedCannon.h b/dependencies/reboot/Project Reboot 3.0/FortMountedCannon.h deleted file mode 100644 index 0c5c4ae..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortMountedCannon.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "FortAthenaVehicle.h" - -#include "reboot.h" - -class AFortMountedCannon : public AFortAthenaVehicle // : public AFortMountedTurret -{ -public: - - void OnLaunchPawn(AFortPlayerPawn* Pawn) - { - static auto OnLaunchPawnFn = FindObject("/Script/FortniteGame.FortMountedCannon.OnLaunchPawn"); - this->ProcessEvent(OnLaunchPawnFn, &Pawn); - } - - void ShootPawnOut() - { - auto PawnToShoot = this->GetPawnAtSeat(0); - - LOG_INFO(LogDev, "PawnToShoot: {}", __int64(PawnToShoot)); - - if (!PawnToShoot) - return; - - PawnToShoot->ServerOnExitVehicle(ETryExitVehicleBehavior::ForceAlways); - this->OnLaunchPawn(PawnToShoot); - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortMountedCannon"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortOctopusVehicle.cpp b/dependencies/reboot/Project Reboot 3.0/FortOctopusVehicle.cpp deleted file mode 100644 index ee61d70..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortOctopusVehicle.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "FortOctopusVehicle.h" - -#include "reboot.h" - -void AFortOctopusVehicle::ServerUpdateTowhookHook(AFortOctopusVehicle* OctopusVehicle, FVector InNetTowhookAimDir) -{ - static auto NetTowhookAimDirOffset = OctopusVehicle->GetOffset("NetTowhookAimDir"); - OctopusVehicle->Get(NetTowhookAimDirOffset) = InNetTowhookAimDir; - - static auto OnRep_NetTowhookAimDirFn = FindObject("/Script/FortniteGame.FortOctopusVehicle.OnRep_NetTowhookAimDir"); - OctopusVehicle->ProcessEvent(OnRep_NetTowhookAimDirFn); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortOctopusVehicle.h b/dependencies/reboot/Project Reboot 3.0/FortOctopusVehicle.h deleted file mode 100644 index f61da55..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortOctopusVehicle.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "Actor.h" -#include "Vector.h" - -class AFortOctopusVehicle : public AActor // AFortAthenaSKVehicle -{ -public: - static void ServerUpdateTowhookHook(AFortOctopusVehicle* OctopusVehicle, FVector InNetTowhookAimDir); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPawn.cpp b/dependencies/reboot/Project Reboot 3.0/FortPawn.cpp deleted file mode 100644 index 35a91cd..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPawn.cpp +++ /dev/null @@ -1,143 +0,0 @@ -#include "FortPawn.h" - -#include "reboot.h" -#include "FortPlayerControllerAthena.h" - -AFortWeapon* AFortPawn::EquipWeaponDefinition(UFortWeaponItemDefinition* WeaponData, const FGuid& ItemEntryGuid) -{ - static auto EquipWeaponDefinitionFn = FindObject(L"/Script/FortniteGame.FortPawn.EquipWeaponDefinition"); - - FGuid TrackerGuid{}; - - if (Fortnite_Version < 16) - { - struct { UObject* Def; FGuid Guid; AFortWeapon* Wep; } params{ WeaponData, ItemEntryGuid }; - this->ProcessEvent(EquipWeaponDefinitionFn, ¶ms); - return params.Wep; - } - else if (std::floor(Fortnite_Version) == 16) - { - struct { UObject* Def; FGuid Guid; FGuid TrackerGuid; AFortWeapon* Wep; } S16_params{ WeaponData, ItemEntryGuid, TrackerGuid }; - this->ProcessEvent(EquipWeaponDefinitionFn, &S16_params); - return S16_params.Wep; - } - else - { - struct { UObject* Def; FGuid Guid; FGuid TrackerGuid; bool bDisableEquipAnimation; AFortWeapon* Wep; } S17_params{ WeaponData, ItemEntryGuid, TrackerGuid, false }; - this->ProcessEvent(EquipWeaponDefinitionFn, &S17_params); - return S17_params.Wep; - } - - return nullptr; -} - -bool AFortPawn::PickUpActor(AActor* PickupTarget, UFortDecoItemDefinition* PlacementDecoItemDefinition) -{ - static auto fn = FindObject(L"/Script/FortniteGame.FortPawn.PickUpActor"); - struct { AActor* PickupTarget; UFortDecoItemDefinition* PlacementDecoItemDefinition; bool ReturnValue; } AFortPawn_PickUpActor_Params{ PickupTarget, PlacementDecoItemDefinition }; - this->ProcessEvent(fn, &AFortPawn_PickUpActor_Params); - - return AFortPawn_PickUpActor_Params.ReturnValue; -} - -void AFortPawn::OnRep_IsDBNO() -{ - static auto OnRep_IsDBNOFn = FindObject(L"/Script/FortniteGame.FortPawn.OnRep_IsDBNO"); - this->ProcessEvent(OnRep_IsDBNOFn); -} - -float AFortPawn::GetShield() -{ - float Shield = 0; - static auto GetShieldFn = FindObject(L"/Script/FortniteGame.FortPawn.GetShield"); - - if (GetShieldFn) - this->ProcessEvent(GetShieldFn, &Shield); - - return Shield; -} - -float AFortPawn::GetHealth() -{ - float Health = 0; - static auto GetHealthFn = FindObject(L"/Script/FortniteGame.FortPawn.GetHealth"); - - if (GetHealthFn) - this->ProcessEvent(GetHealthFn, &Health); - - return Health; -} - -void AFortPawn::SetHealth(float NewHealth) -{ - static auto SetHealthFn = FindObject(L"/Script/FortniteGame.FortPawn.SetHealth"); - - if (SetHealthFn) - this->ProcessEvent(SetHealthFn, &NewHealth); -} - -void AFortPawn::SetMaxHealth(float NewHealthVal) -{ - static auto SetMaxHealthFn = FindObject(L"/Script/FortniteGame.FortPawn.SetMaxHealth"); - - if (!SetMaxHealthFn) - return; - - this->ProcessEvent(SetMaxHealthFn, &NewHealthVal); -} - -void AFortPawn::SetShield(float NewShield) -{ - static auto SetShieldFn = FindObject("/Script/FortniteGame.FortPawn.SetShield"); - - if (SetShieldFn) - this->ProcessEvent(SetShieldFn, &NewShield); -} - -void AFortPawn::NetMulticast_Athena_BatchedDamageCuesHook(UObject* Context, FFrame* Stack, void* Ret) -{ - auto Pawn = (AFortPawn*)Context; - auto Controller = Cast(Pawn->GetController()); - auto CurrentWeapon = Pawn->GetCurrentWeapon(); - auto WorldInventory = Controller ? Controller->GetWorldInventory() : nullptr; - - if (!WorldInventory || !CurrentWeapon) - return NetMulticast_Athena_BatchedDamageCuesOriginal(Context, Stack, Ret); - - auto AmmoCount = CurrentWeapon->GetAmmoCount(); - - WorldInventory->CorrectLoadedAmmo(CurrentWeapon->GetItemEntryGuid(), AmmoCount); - - return NetMulticast_Athena_BatchedDamageCuesOriginal(Context, Stack, Ret); -} - -void AFortPawn::MovingEmoteStoppedHook(UObject* Context, FFrame* Stack, void* Ret) -{ - // LOG_INFO(LogDev, "MovingEmoteStoppedHook!"); - - auto Pawn = (AFortPawn*)Context; - - static auto bMovingEmoteOffset = Pawn->GetOffset("bMovingEmote", false); - - if (bMovingEmoteOffset != -1) - { - static auto bMovingEmoteFieldMask = GetFieldMask(Pawn->GetProperty("bMovingEmote")); - Pawn->SetBitfieldValue(bMovingEmoteOffset, bMovingEmoteFieldMask, false); - } - - static auto bMovingEmoteForwardOnlyOffset = Pawn->GetOffset("bMovingEmoteForwardOnly", false); - - if (bMovingEmoteForwardOnlyOffset != -1) - { - static auto bMovingEmoteForwardOnlyFieldMask = GetFieldMask(Pawn->GetProperty("bMovingEmoteForwardOnly")); - Pawn->SetBitfieldValue(bMovingEmoteOffset, bMovingEmoteForwardOnlyFieldMask, false); - } - - return MovingEmoteStoppedOriginal(Context, Stack, Ret); -} - -UClass* AFortPawn::StaticClass() -{ - static auto Class = FindObject("/Script/FortniteGame.FortPawn"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPawn.h b/dependencies/reboot/Project Reboot 3.0/FortPawn.h deleted file mode 100644 index 0089f36..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPawn.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "Pawn.h" -#include "FortWeapon.h" -#include "FortDecoItemDefinition.h" - -class AFortPawn : public APawn -{ -public: - static inline void (*NetMulticast_Athena_BatchedDamageCuesOriginal)(UObject* Context, FFrame* Stack, void* Ret); - static inline void (*MovingEmoteStoppedOriginal)(UObject* Context, FFrame* Stack, void* Ret); - - AFortWeapon* EquipWeaponDefinition(UFortWeaponItemDefinition* WeaponData, const FGuid& ItemEntryGuid); - bool PickUpActor(AActor* PickupTarget, UFortDecoItemDefinition* PlacementDecoItemDefinition); - - AFortWeapon*& GetCurrentWeapon() - { - static auto CurrentWeaponOffset = GetOffset("CurrentWeapon"); - return Get(CurrentWeaponOffset); - } - - bool IsDBNO() - { - static auto bIsDBNOFieldMask = GetFieldMask(GetProperty("bIsDBNO")); - static auto bIsDBNOOffset = GetOffset("bIsDBNO"); - - return ReadBitfieldValue(bIsDBNOOffset, bIsDBNOFieldMask); - } - - void SetDBNO(bool IsDBNO) - { - static auto bIsDBNOFieldMask = GetFieldMask(GetProperty("bIsDBNO")); - static auto bIsDBNOOffset = GetOffset("bIsDBNO"); - - this->SetBitfieldValue(bIsDBNOOffset, bIsDBNOFieldMask, IsDBNO); - } - - void SetHasPlayedDying(bool NewValue) - { - static auto bPlayedDyingFieldMask = GetFieldMask(GetProperty("bPlayedDying")); - static auto bPlayedDyingOffset = GetOffset("bPlayedDying"); - - this->SetBitfieldValue(bPlayedDyingOffset, bPlayedDyingFieldMask, NewValue); - } - - void OnRep_IsDBNO(); - float GetShield(); - float GetHealth(); - void SetHealth(float NewHealth); - void SetMaxHealth(float NewHealthVal); - void SetShield(float NewShield); - static void NetMulticast_Athena_BatchedDamageCuesHook(UObject* Context, FFrame* Stack, void* Ret); - static void MovingEmoteStoppedHook(UObject* Context, FFrame* Stack, void* Ret); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPickup.cpp b/dependencies/reboot/Project Reboot 3.0/FortPickup.cpp deleted file mode 100644 index 52d71d8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPickup.cpp +++ /dev/null @@ -1,532 +0,0 @@ -#include "FortPickup.h" - -#include "FortPawn.h" -#include "FortItemDefinition.h" -#include "FortPlayerState.h" -#include "FortPlayerPawn.h" -#include "FortGameModePickup.h" -#include "FortPlayerController.h" -#include -#include "GameplayStatics.h" -#include "gui.h" - -void AFortPickup::TossPickup(FVector FinalLocation, AFortPawn* ItemOwner, int OverrideMaxStackCount, bool bToss, uint8 InPickupSourceTypeFlags, uint8 InPickupSpawnSource) -{ - static auto fn = FindObject(L"/Script/FortniteGame.FortPickup.TossPickup"); - - struct { FVector FinalLocation; AFortPawn* ItemOwner; int OverrideMaxStackCount; bool bToss; - uint8 InPickupSourceTypeFlags; uint8 InPickupSpawnSource; } - AFortPickup_TossPickup_Params{FinalLocation, ItemOwner, OverrideMaxStackCount, bToss, InPickupSourceTypeFlags, InPickupSpawnSource}; - - this->ProcessEvent(fn, &AFortPickup_TossPickup_Params); -} - -void AFortPickup::SpawnMovementComponent() -{ - static auto ProjectileMovementComponentClass = FindObject("/Script/Engine.ProjectileMovementComponent"); // UFortProjectileMovementComponent - - static auto MovementComponentOffset = this->GetOffset("MovementComponent"); - this->Get(MovementComponentOffset) = UGameplayStatics::SpawnObject(ProjectileMovementComponentClass, this); -} - -AFortPickup* AFortPickup::SpawnPickup(PickupCreateData& PickupData) -{ - if (PickupData.Source == -1) - PickupData.Source = 0; - if (PickupData.SourceType == -1) - PickupData.SourceType = 0; - - if (PickupData.bToss) - { - auto TossedValue = EFortPickupSourceTypeFlag::GetTossedValue(); - - if (TossedValue != -1) - { - if ((PickupData.SourceType & TossedValue) == 0) // if it already has tossed flag we dont wanna add it again.. - { - // PickupData.SourceType |= TossedValue; - } - } - } - - static auto FortPickupAthenaClass = FindObject(L"/Script/FortniteGame.FortPickupAthena"); - auto PlayerState = PickupData.PawnOwner ? Cast(PickupData.PawnOwner->GetPlayerState()) : nullptr; - - auto Pickup = GetWorld()->SpawnActor(PickupData.OverrideClass ? PickupData.OverrideClass : FortPickupAthenaClass, PickupData.SpawnLocation, FQuat(), FVector(1, 1, 1)); - - if (!Pickup) - return nullptr; - - static auto bRandomRotationOffset = Pickup->GetOffset("bRandomRotation", false); - - if (bRandomRotationOffset != -1) - { - Pickup->Get(bRandomRotationOffset) = PickupData.bRandomRotation; - } - - static auto PawnWhoDroppedPickupOffset = Pickup->GetOffset("PawnWhoDroppedPickup"); - Pickup->Get(PawnWhoDroppedPickupOffset) = PickupData.PawnOwner; - - auto PrimaryPickupItemEntry = Pickup->GetPrimaryPickupItemEntry(); - - if (Addresses::PickupInitialize) - { - // Honestly this is the god function, it automatically handles special actors and automatically adds to state values, who else knows what it does. - - static void (*SetupPickup)(AFortPickup* Pickup, __int64 ItemEntry, TArray MultiItemPickupEntriesIGuess, bool bSplitOnPickup) - = decltype(SetupPickup)(Addresses::PickupInitialize); - - TArray MultiItemPickupEntriesIGuess{}; - SetupPickup(Pickup, __int64(PickupData.ItemEntry), MultiItemPickupEntriesIGuess, false); - FFortItemEntry::FreeArrayOfEntries(MultiItemPickupEntriesIGuess); - } - else - { - PrimaryPickupItemEntry->CopyFromAnotherItemEntry(PickupData.ItemEntry); - } - - if (false && PlayerState) - { - if (auto GadgetItemDefinition = Cast(PrimaryPickupItemEntry->GetItemDefinition())) - { - auto ASC = PlayerState->GetAbilitySystemComponent(); - - if (GadgetItemDefinition->GetTrackedAttributes().Num() > 0) - { - PrimaryPickupItemEntry->SetStateValue(EFortItemEntryState::GenericAttributeValueSet, 1); - } - - std::vector AttributeValueVector; - - for (int i = 0; i < GadgetItemDefinition->GetTrackedAttributes().Num(); ++i) - { - auto& CurrentTrackedAttribute = GadgetItemDefinition->GetTrackedAttributes().at(i); - - // LOG_INFO(LogDev, "[{}] TrackedAttribute Attribute Property Name {}", i, GadgetItemDefinition->GetTrackedAttributes().at(i).GetAttributePropertyName()); - // LOG_INFO(LogDev, "[{}] TrackedAttribute Attribute Name {}", i, GadgetItemDefinition->GetTrackedAttributes().at(i).GetAttributeName()); - // LOG_INFO(LogDev, "[{}] TrackedAttribute Attribute Owner {}", i, GadgetItemDefinition->GetTrackedAttributes().at(i).AttributeOwner->GetPathName()); - - if (!ASC) - break; - - int CurrentAttributeValue = -1; - - for (int i = 0; i < ASC->GetSpawnedAttributes().Num(); ++i) - { - auto CurrentSpawnedAttribute = ASC->GetSpawnedAttributes().at(i); - - if (CurrentSpawnedAttribute->IsA(CurrentTrackedAttribute.AttributeOwner)) - { - auto PropertyOffset = CurrentSpawnedAttribute->GetOffset(CurrentTrackedAttribute.GetAttributePropertyName()); - - if (PropertyOffset != -1) - { - CurrentAttributeValue = CurrentSpawnedAttribute->GetPtr(PropertyOffset)->GetCurrentValue(); - break; // hm - } - } - } - - // LOG_INFO(LogDev, "CurrentAttributeValue: {}", CurrentAttributeValue); - - if (CurrentAttributeValue != -1) // Found the attribute. - { - // im so smart - - AttributeValueVector.push_back(CurrentAttributeValue); - } - } - - for (int z = 0; z < PrimaryPickupItemEntry->GetGenericAttributeValues().Num(); z++) // First value must be the current value // dont ask me why fortnite keeps the old values in it too.. - { - AttributeValueVector.push_back(PrimaryPickupItemEntry->GetGenericAttributeValues().at(z)); - } - - PrimaryPickupItemEntry->GetGenericAttributeValues().Free(); - - for (auto& AttributeValue : AttributeValueVector) - { - PrimaryPickupItemEntry->GetGenericAttributeValues().Add(AttributeValue); - } - } - } - - static auto PickupSourceTypeFlagsOffset = Pickup->GetOffset("PickupSourceTypeFlags", false); - - if (PickupSourceTypeFlagsOffset != -1) - { - // Pickup->Get(PickupSourceTypeFlagsOffset) = (uint32)PickupData.SourceType; // Assuming its the same enum on older versions. - } - - if (Pickup->Get(PawnWhoDroppedPickupOffset)) - { - // TODO Add EFortItemEntryState::DroppedFromPickup or whatever if it isn't found already. - } - - PrimaryPickupItemEntry->GetCount() = PickupData.OverrideCount == -1 ? PickupData.ItemEntry->GetCount() : PickupData.OverrideCount; - - auto PickupLocationData = Pickup->GetPickupLocationData(); - - auto CanCombineWithPickup = [&](AActor* OtherPickupActor) -> bool - { - auto OtherPickup = (AFortPickup*)OtherPickupActor; - - if (OtherPickup == PickupData.IgnoreCombineTarget || Pickup->GetPickupLocationData()->GetCombineTarget()) - return false; - - if (OtherPickup->GetPickupLocationData()->GetTossState() != EFortPickupTossState::AtRest) - return false; - - if (PrimaryPickupItemEntry->GetItemDefinition() == OtherPickup->GetPrimaryPickupItemEntry()->GetItemDefinition()) - { - if (OtherPickup->GetPrimaryPickupItemEntry()->GetCount() >= PrimaryPickupItemEntry->GetItemDefinition()->GetMaxStackSize()) // Other pickup is already at the max size. - return false; - - return true; - } - - return false; - }; - - if (Addresses::CombinePickupLea && bEnableCombinePickup) - { - PickupLocationData->GetCombineTarget() = (AFortPickup*)Pickup->GetClosestActor(AFortPickup::StaticClass(), 4, CanCombineWithPickup); - } - - if (!PickupLocationData->GetCombineTarget()) // I don't think we should call TossPickup for every pickup anyways. - { - Pickup->TossPickup(PickupData.SpawnLocation, PickupData.PawnOwner, 0, PickupData.bToss, PickupData.SourceType, PickupData.Source); - } - else - { - auto ActorLocation = Pickup->GetActorLocation(); - auto CurrentActorLocation = PickupLocationData->GetCombineTarget()->GetActorLocation(); - - int Dist = float(sqrtf(powf(CurrentActorLocation.X - ActorLocation.X, 2.0) + powf(CurrentActorLocation.Y - ActorLocation.Y, 2.0) + powf(CurrentActorLocation.Z - ActorLocation.Z, 2.0))) / 100.f; - - // LOG_INFO(LogDev, "Distance: {}", Dist); - - // our little remake of tosspickup - - PickupLocationData->GetLootFinalPosition() = PickupData.SpawnLocation; - PickupLocationData->GetLootInitialPosition() = Pickup->GetActorLocation(); - PickupLocationData->GetFlyTime() = 1.f / Dist; // Higher the dist quicker it should be. // not right - PickupLocationData->GetItemOwner() = PickupData.PawnOwner; - PickupLocationData->GetFinalTossRestLocation() = PickupLocationData->GetCombineTarget()->GetActorLocation(); - - Pickup->OnRep_PickupLocationData(); - Pickup->ForceNetUpdate(); - } - - if (EFortPickupSourceTypeFlag::GetEnum() && ((PickupData.SourceType & EFortPickupSourceTypeFlag::GetContainerValue()) != 0)) // crashes if we do this then tosspickup - { - static auto bTossedFromContainerOffset = Pickup->GetOffset("bTossedFromContainer"); - Pickup->Get(bTossedFromContainerOffset) = true; - // Pickup->OnRep_TossedFromContainer(); - } - - if (Fortnite_Version < 6) - { - Pickup->SpawnMovementComponent(); - } - - return Pickup; -} - -AFortPickup* AFortPickup::SpawnPickup(FFortItemEntry* ItemEntry, FVector Location, - uint8 PickupSource, uint8 SpawnSource, - class AFortPawn* Pawn, UClass* OverrideClass, bool bToss, int OverrideCount, AFortPickup* IgnoreCombinePickup) -{ - PickupCreateData CreateData; - CreateData.ItemEntry = ItemEntry; - CreateData.SpawnLocation = Location; - CreateData.Source = SpawnSource; - CreateData.SourceType = PickupSource; - CreateData.PawnOwner = Pawn; - CreateData.OverrideClass = OverrideClass; - CreateData.bToss = bToss; - CreateData.IgnoreCombineTarget = IgnoreCombinePickup; - CreateData.OverrideCount = OverrideCount; - - return AFortPickup::SpawnPickup(CreateData); -} - -void AFortPickup::CombinePickupHook(AFortPickup* Pickup) -{ - // LOG_INFO(LogDev, "CombinePickupHook!"); - - auto PickupToCombineInto = (AFortPickup*)Pickup->GetPickupLocationData()->GetCombineTarget(); - - if (PickupToCombineInto->IsActorBeingDestroyed()) - return; - - const int IncomingCount = Pickup->GetPrimaryPickupItemEntry()->GetCount(); - const int OriginalCount = PickupToCombineInto->GetPrimaryPickupItemEntry()->GetCount(); - - // add more checks? - - auto ItemDefinition = PickupToCombineInto->GetPrimaryPickupItemEntry()->GetItemDefinition(); - - int CountToAdd = IncomingCount; - - if (OriginalCount + CountToAdd > ItemDefinition->GetMaxStackSize()) - { - const int OverStackCount = OriginalCount + CountToAdd - ItemDefinition->GetMaxStackSize(); - CountToAdd = ItemDefinition->GetMaxStackSize() - OriginalCount; - - auto ItemOwner = Pickup->GetPickupLocationData()->GetItemOwner(); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(ItemDefinition, OverStackCount, 0, MAX_DURABILITY, Pickup->GetPrimaryPickupItemEntry()->GetLevel()); - CreateData.SpawnLocation = PickupToCombineInto->GetActorLocation(); - CreateData.PawnOwner = ItemOwner; - CreateData.SourceType = EFortPickupSourceTypeFlag::GetPlayerValue(); - CreateData.IgnoreCombineTarget = PickupToCombineInto; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - auto NewOverStackPickup = AFortPickup::SpawnPickup(CreateData); - } - - PickupToCombineInto->GetPrimaryPickupItemEntry()->GetCount() += CountToAdd; - PickupToCombineInto->OnRep_PrimaryPickupItemEntry(); - - PickupToCombineInto->ForceNetUpdate(); - PickupToCombineInto->FlushNetDormancy(); - - Pickup->K2_DestroyActor(); -} - -char AFortPickup::CompletePickupAnimationHook(AFortPickup* Pickup) -{ - auto Pawn = Cast(Pickup->GetPickupLocationData()->GetPickupTarget()); - - if (!Pawn) - return CompletePickupAnimationOriginal(Pickup); - - auto PlayerController = Cast(Pawn->GetController()); - - if (!PlayerController) - return CompletePickupAnimationOriginal(Pickup); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return CompletePickupAnimationOriginal(Pickup); - - auto PickupEntry = Pickup->GetPrimaryPickupItemEntry(); - - auto PickupItemDefinition = Cast(PickupEntry->GetItemDefinition()); - auto IncomingCount = PickupEntry->GetCount(); - - if (!PickupItemDefinition) - return CompletePickupAnimationOriginal(Pickup); - - if (auto GameModePickup = Cast(Pickup)) - { - LOG_INFO(LogDev, "GameModePickup!"); - return CompletePickupAnimationOriginal(Pickup); - } - - auto& ItemInstances = WorldInventory->GetItemList().GetItemInstances(); - - auto& CurrentItemGuid = Pickup->GetPickupLocationData()->GetPickupGuid(); // Pawn->CurrentWeapon->ItemEntryGuid; - - auto ItemInstanceToSwap = WorldInventory->FindItemInstance(CurrentItemGuid); - - // if (!ItemInstanceToSwap) - // return CompletePickupAnimationOriginal(Pickup); - - auto ItemEntryToSwap = ItemInstanceToSwap ? ItemInstanceToSwap->GetItemEntry() : nullptr; - auto ItemDefinitionToSwap = ItemEntryToSwap ? Cast(ItemEntryToSwap->GetItemDefinition()) : nullptr; - bool bHasSwapped = false; - - int cpyCount = IncomingCount; - - auto PawnLoc = Pawn->GetActorLocation(); - auto ItemDefGoingInPrimary = IsPrimaryQuickbar(PickupItemDefinition); - - std::vector> PairsToMarkDirty; // vector of sets or something so no duplicates?? - - if (bDebugPrintSwapping) - LOG_INFO(LogDev, "Start cpyCount: {}", cpyCount); - - bool bWasHoldingSameItemWhenSwap = false; - - FGuid NewSwappedItem = FGuid(-1, -1, -1, -1); - - bool bForceDontAddItem = false; - bool bForceOverflow = false; - - while (cpyCount > 0) - { - int PrimarySlotsFilled = 0; - bool bEverStacked = false; - bool bDoesStackExist = false; - - bool bIsInventoryFull = false; - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.at(i); - auto CurrentItemEntry = ItemInstance->GetItemEntry(); - - if (ItemDefGoingInPrimary && IsPrimaryQuickbar(CurrentItemEntry->GetItemDefinition())) - { - int AmountOfSlotsTakenUp = 1; // TODO - PrimarySlotsFilled += AmountOfSlotsTakenUp; - } - - // LOG_INFO(LogDev, "[{}] PrimarySlotsFilled: {}", i, PrimarySlotsFilled); - - bIsInventoryFull = (PrimarySlotsFilled /* - 6 */) >= 5; - - if (bIsInventoryFull || (PlayerController->HasTryPickupSwap() ? PlayerController->ShouldTryPickupSwap() : false)) // probs shouldnt do in loop but alr - { - if (PlayerController->HasTryPickupSwap()) - PlayerController->ShouldTryPickupSwap() = false; - - if (ItemInstanceToSwap && ItemDefinitionToSwap->CanBeDropped() && !bHasSwapped && ItemDefGoingInPrimary) // swap - { - auto SwappedPickup = SpawnPickup(ItemEntryToSwap, PawnLoc, EFortPickupSourceTypeFlag::GetPlayerValue(), 0, Pawn); - - auto CurrentWeapon = Pawn->GetCurrentWeapon(); - - if (CurrentWeapon) - { - bWasHoldingSameItemWhenSwap = CurrentWeapon->GetItemEntryGuid() == ItemInstanceToSwap->GetItemEntry()->GetItemGuid(); - } - - // THIS IS NOT PROPER! We should use the commented code but there are some bugs idk why. - - WorldInventory->RemoveItem(CurrentItemGuid, nullptr, ItemEntryToSwap->GetCount(), true); - - /* - auto NewItemCount = cpyCount > PickupItemDefinition->GetMaxStackSize() ? PickupItemDefinition->GetMaxStackSize() : cpyCount; - - std::pair Pairs; - WorldInventory->SwapItem(CurrentItemGuid, PickupEntry, cpyCount, &Pairs); - PairsToMarkDirty.push_back(Pairs); - - cpyCount -= NewItemCount; - */ - - bHasSwapped = true; - - if (bDebugPrintSwapping) - LOG_INFO(LogDev, "[{}] Swapping: {}", i, ItemDefinitionToSwap->GetFullName()); - - // bForceDontAddItem = true; - - continue; // ??? - } - } - - if (CurrentItemEntry->GetItemDefinition() == PickupItemDefinition) - { - if (bDebugPrintSwapping) - LOG_INFO(LogDev, "[{}] Found stack of item!", i); - - if (CurrentItemEntry->GetCount() < PickupItemDefinition->GetMaxStackSize()) - { - int OverStack = CurrentItemEntry->GetCount() + cpyCount - PickupItemDefinition->GetMaxStackSize(); - int AmountToStack = OverStack > 0 ? cpyCount - OverStack : cpyCount; - - cpyCount -= AmountToStack; - - std::pair Pairs; - WorldInventory->ModifyCount(ItemInstance, AmountToStack, false, &Pairs, false, true); - PairsToMarkDirty.push_back(Pairs); - - bEverStacked = true; - - if (bDebugPrintSwapping) - LOG_INFO(LogDev, "[{}] We are stacking {}.", i, AmountToStack); - - // if (cpyCount > 0) - // break; - } - - bDoesStackExist = true; - } - - if ((bIsInventoryFull || bForceOverflow) && cpyCount > 0) // overflow - { - if (bDebugPrintSwapping) - LOG_INFO(LogDev, "[{}] Overflow", i); - - UFortWorldItemDefinition* ItemDefinitionToSpawn = PickupItemDefinition; - int AmountToSpawn = cpyCount > PickupItemDefinition->GetMaxStackSize() ? PickupItemDefinition->GetMaxStackSize() : cpyCount; - - int LoadedAmmo = 0; - - // SpawnPickup(ItemDefinitionToSpawn, PawnLoc, AmountToSpawn, EFortPickupSourceTypeFlag::Player, EFortPickupSpawnSource::Unset, -1, Pawn); - SpawnPickup(PickupEntry, PawnLoc, EFortPickupSourceTypeFlag::GetPlayerValue(), 0, Pawn, nullptr, true, AmountToSpawn); - cpyCount -= AmountToSpawn; - bForceOverflow = false; - } - - if (cpyCount <= 0) - break; - } - - if (cpyCount > 0 && !bIsInventoryFull && !bForceDontAddItem) - { - if (bDebugPrintSwapping) - LOG_INFO(LogDev, "Attempting to add to inventory."); - - if (bDoesStackExist ? PickupItemDefinition->DoesAllowMultipleStacks() : true) - { - auto NewItemCount = cpyCount > PickupItemDefinition->GetMaxStackSize() ? PickupItemDefinition->GetMaxStackSize() : cpyCount; - - auto NewAndModifiedInstances = WorldInventory->AddItem(PickupEntry, nullptr, true, NewItemCount); - - auto NewVehicleInstance = NewAndModifiedInstances.first[0]; - - if (!NewVehicleInstance) - continue; - else - cpyCount -= NewItemCount; - - if (bDebugPrintSwapping) - LOG_INFO(LogDev, "Added item with count {} to inventory.", NewItemCount); - - if (bHasSwapped && NewSwappedItem == FGuid(-1, -1, -1, -1)) - { - NewSwappedItem = NewVehicleInstance->GetItemEntry()->GetItemGuid(); - } - } - else - { - bForceOverflow = true; - } - } - } - - // auto Item = GiveItem(PlayerController, ItemDef, cpyCount, CurrentPickup->PrimaryPickupItemEntry.LoadedAmmo, true); - - /* for (int i = 0; i < Pawn->IncomingPickups.Num(); ++i) - { - Pawn->IncomingPickups[i]->PickupLocationData.PickupGuid = Item->ItemEntry.ItemGuid; - } */ - - WorldInventory->Update(PairsToMarkDirty.size() == 0); - - for (auto& [key, value] : PairsToMarkDirty) - { - WorldInventory->GetItemList().MarkItemDirty(key); - WorldInventory->GetItemList().MarkItemDirty(value); - } - - if (bWasHoldingSameItemWhenSwap && NewSwappedItem != FGuid(-1, -1, -1, -1)) - { - PlayerController->ClientEquipItem(NewSwappedItem, true); - } - - return CompletePickupAnimationOriginal(Pickup); -} - -UClass* AFortPickup::StaticClass() -{ - static auto Class = FindObject("/Script/FortniteGame.FortPickup"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPickup.h b/dependencies/reboot/Project Reboot 3.0/FortPickup.h deleted file mode 100644 index 207a919..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPickup.h +++ /dev/null @@ -1,217 +0,0 @@ -#pragma once - -#include "Actor.h" -#include "FortPawn.h" -#include "Class.h" - -namespace EFortPickupSourceTypeFlag -{ - static inline UEnum* GetEnum() - { - static auto Enum = FindObject(L"/Script/FortniteGame.EFortPickupSourceTypeFlag"); - return Enum; - } - - static inline int64 GetPlayerValue() - { - static auto PlayerValue = GetEnum() ? GetEnum()->GetValue("Player") : -1; - return PlayerValue; - } - - static inline int64 GetContainerValue() - { - static auto ContainerValue = GetEnum() ? GetEnum()->GetValue("Container") : -1; - return ContainerValue; - } - - static inline int64 GetFloorLootValue() - { - static auto FloorLootValue = GetEnum() ? GetEnum()->GetValue("FloorLoot") : -1; - return FloorLootValue; - } - - static inline int64 GetOtherValue() - { - static auto OtherValue = GetEnum() ? GetEnum()->GetValue("Other") : -1; - return OtherValue; - } - - static inline int64 GetTossedValue() - { - static auto TossedValue = GetEnum() ? GetEnum()->GetValue("Tossed") : -1; - return TossedValue; - } -} - -namespace EFortPickupSpawnSource -{ - static inline UEnum* GetEnum() - { - static auto Enum = FindObject(L"/Script/FortniteGame.EFortPickupSpawnSource"); - return Enum; - } - - static inline int64 GetPlayerEliminationValue() - { - static auto PlayerEliminationValue = GetEnum() ? GetEnum()->GetValue("PlayerElimination") : -1; - return PlayerEliminationValue; - } - - static inline int64 GetSupplyDropValue() - { - static auto SupplyDropValue = GetEnum() ? GetEnum()->GetValue("SupplyDrop") : -1; - return SupplyDropValue; - } -} - -struct PickupCreateData -{ - FFortItemEntry* ItemEntry = nullptr; - AFortPawn* PawnOwner = nullptr; - int OverrideCount = -1; - UClass* OverrideClass = nullptr; - bool bToss = false; - class AFortPickup* IgnoreCombineTarget = nullptr; - bool bRandomRotation = false; - uint8 SourceType = 0; - uint8 Source = 0; - FVector SpawnLocation = FVector(0, 0, 0); - bool bShouldFreeItemEntryWhenDeconstructed = false; - - ~PickupCreateData() - { - if (bShouldFreeItemEntryWhenDeconstructed) - { - // real - - FFortItemEntry::FreeItemEntry(ItemEntry); - - if (bUseFMemoryRealloc) - { - static void (*FreeOriginal)(void* Original) = decltype(FreeOriginal)(Addresses::Free); - - if (FreeOriginal) - FreeOriginal(ItemEntry); - } - else - { - VirtualFree(ItemEntry, 0, MEM_RELEASE); - } - } - } -}; - -enum class EFortPickupTossState : uint8 -{ - NotTossed = 0, - InProgress = 1, - AtRest = 2, - EFortPickupTossState_MAX = 3, -}; - -struct FFortPickupLocationData -{ - AFortPawn*& GetPickupTarget() - { - static auto PickupTargetOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "PickupTarget"); - return *(AFortPawn**)(__int64(this) + PickupTargetOffset); - } - - float& GetFlyTime() - { - static auto FlyTimeOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "FlyTime"); - return *(float*)(__int64(this) + FlyTimeOffset); - } - - EFortPickupTossState& GetTossState() - { - static auto TossStateOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "TossState"); - return *(EFortPickupTossState*)(__int64(this) + TossStateOffset); - } - - AFortPawn*& GetItemOwner() - { - static auto ItemOwnerOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "ItemOwner"); - return *(AFortPawn**)(__int64(this) + ItemOwnerOffset); - } - - class AFortPickup*& GetCombineTarget() - { - static auto CombineTargetOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "CombineTarget"); - return *(AFortPickup**)(__int64(this) + CombineTargetOffset); - } - - FVector& GetStartDirection() - { - static auto StartDirectionOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "StartDirection"); - return *(FVector*)(__int64(this) + StartDirectionOffset); - } - - FVector& GetFinalTossRestLocation() - { - static auto FinalTossRestLocationOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "FinalTossRestLocation"); - return *(FVector*)(__int64(this) + FinalTossRestLocationOffset); - } - - FVector& GetLootInitialPosition() - { - static auto LootInitialPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "LootInitialPosition"); - return *(FVector*)(__int64(this) + LootInitialPositionOffset); - } - - FVector& GetLootFinalPosition() - { - static auto LootFinalPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "LootFinalPosition"); - return *(FVector*)(__int64(this) + LootFinalPositionOffset); - } - - FGuid& GetPickupGuid() - { - static auto PickupGuidOffset = FindOffsetStruct("/Script/FortniteGame.FortPickupLocationData", "PickupGuid"); - return *(FGuid*)(__int64(this) + PickupGuidOffset); - } -}; - -class AFortPickup : public AActor -{ -public: - static inline char (*CompletePickupAnimationOriginal)(AFortPickup* Pickup); - - void TossPickup(FVector FinalLocation, class AFortPawn* ItemOwner, int OverrideMaxStackCount, bool bToss, uint8 InPickupSourceTypeFlags, uint8 InPickupSpawnSource); - void SpawnMovementComponent(); // BAD You probably don't wanna use unless absolutely necessary - - void OnRep_PrimaryPickupItemEntry() - { - static auto OnRep_PrimaryPickupItemEntryFn = FindObject("/Script/FortniteGame.FortPickup.OnRep_PrimaryPickupItemEntry"); - this->ProcessEvent(OnRep_PrimaryPickupItemEntryFn); - } - - FFortPickupLocationData* GetPickupLocationData() - { - static auto PickupLocationDataOffset = this->GetOffset("PickupLocationData"); - return this->GetPtr(PickupLocationDataOffset); - } - - FFortItemEntry* GetPrimaryPickupItemEntry() - { - static auto PrimaryPickupItemEntryOffset = this->GetOffset("PrimaryPickupItemEntry"); - return this->GetPtr(PrimaryPickupItemEntryOffset); - } - - void OnRep_PickupLocationData() - { - static auto OnRep_PickupLocationDataFn = FindObject(L"/Script/FortniteGame.FortPickup.OnRep_PickupLocationData"); - this->ProcessEvent(OnRep_PickupLocationDataFn); - } - - static AFortPickup* SpawnPickup(PickupCreateData& PickupData); - - static AFortPickup* SpawnPickup(FFortItemEntry* ItemEntry, FVector Location, - uint8 PickupSource = 0, uint8 SpawnSource = 0, - class AFortPawn* Pawn = nullptr, UClass* OverrideClass = nullptr, bool bToss = true, int OverrideCount = -1, AFortPickup* IgnoreCombinePickup = nullptr); - - static void CombinePickupHook(AFortPickup* Pickup); - static char CompletePickupAnimationHook(AFortPickup* Pickup); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerController.cpp b/dependencies/reboot/Project Reboot 3.0/FortPlayerController.cpp deleted file mode 100644 index 2670daa..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerController.cpp +++ /dev/null @@ -1,1695 +0,0 @@ -#include "FortPlayerController.h" - -#include "Rotator.h" -#include "BuildingSMActor.h" -#include "FortGameModeAthena.h" - -#include "FortPlayerState.h" -#include "BuildingWeapons.h" - -#include "ActorComponent.h" -#include "FortPlayerStateAthena.h" -#include "globals.h" -#include "FortPlayerControllerAthena.h" -#include "BuildingContainer.h" -#include "FortLootPackage.h" -#include "FortPickup.h" -#include "FortPlayerPawn.h" -#include -#include "KismetStringLibrary.h" -#include "FortGadgetItemDefinition.h" -#include "FortAbilitySet.h" -#include "vendingmachine.h" -#include "KismetSystemLibrary.h" -#include "gui.h" -#include "FortAthenaMutator_InventoryOverride.h" -#include "FortAthenaMutator_TDM.h" - -void AFortPlayerController::ClientReportDamagedResourceBuilding(ABuildingSMActor* BuildingSMActor, EFortResourceType PotentialResourceType, int PotentialResourceCount, bool bDestroyed, bool bJustHitWeakspot) -{ - static auto fn = FindObject(L"/Script/FortniteGame.FortPlayerController.ClientReportDamagedResourceBuilding"); - - struct { ABuildingSMActor* BuildingSMActor; EFortResourceType PotentialResourceType; int PotentialResourceCount; bool bDestroyed; bool bJustHitWeakspot; } - AFortPlayerController_ClientReportDamagedResourceBuilding_Params{BuildingSMActor, PotentialResourceType, PotentialResourceCount, bDestroyed, bJustHitWeakspot}; - - this->ProcessEvent(fn, &AFortPlayerController_ClientReportDamagedResourceBuilding_Params); -} - -void AFortPlayerController::ClientEquipItem(const FGuid& ItemGuid, bool bForceExecution) -{ - static auto ClientEquipItemFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ClientEquipItem") - ? FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ClientEquipItem") - : FindObject(L"/Script/FortniteGame.FortPlayerController.ClientEquipItem"); - - if (ClientEquipItemFn) - { - struct - { - FGuid ItemGuid; // (ConstParm, Parm, ZeroConstructor, ReferenceParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bForceExecution; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortPlayerController_ClientEquipItem_Params{ ItemGuid, bForceExecution }; - - this->ProcessEvent(ClientEquipItemFn, &AFortPlayerController_ClientEquipItem_Params); - } -} - -bool AFortPlayerController::DoesBuildFree() -{ - if (Globals::bInfiniteMaterials) - return true; - - static auto bBuildFreeOffset = GetOffset("bBuildFree"); - static auto bBuildFreeFieldMask = GetFieldMask(GetProperty("bBuildFree")); - return ReadBitfieldValue(bBuildFreeOffset, bBuildFreeFieldMask); -} - -void AFortPlayerController::DropAllItems(const std::vector& IgnoreItemDefs, bool bIgnoreSecondaryQuickbar, bool bRemoveIfNotDroppable, bool RemovePickaxe) -{ - auto Pawn = this->GetMyFortPawn(); - - if (!Pawn) - return; - - auto WorldInventory = this->GetWorldInventory(); - - if (!WorldInventory) - return; - - auto& ItemInstances = WorldInventory->GetItemList().GetItemInstances(); - auto Location = Pawn->GetActorLocation(); - - std::vector> GuidAndCountsToRemove; - - auto PickaxeInstance = WorldInventory->GetPickaxeInstance(); - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.at(i); - - if (!ItemInstance) - continue; - - auto ItemEntry = ItemInstance->GetItemEntry(); - - if (RemovePickaxe && ItemInstance == PickaxeInstance) - { - GuidAndCountsToRemove.push_back({ ItemEntry->GetItemGuid(), ItemEntry->GetCount() }); - continue; - } - - auto WorldItemDefinition = Cast(ItemEntry->GetItemDefinition()); - - if (!WorldItemDefinition || std::find(IgnoreItemDefs.begin(), IgnoreItemDefs.end(), WorldItemDefinition) != IgnoreItemDefs.end()) - continue; - - if (bIgnoreSecondaryQuickbar && !IsPrimaryQuickbar(WorldItemDefinition)) - continue; - - if (!bRemoveIfNotDroppable && !WorldItemDefinition->CanBeDropped()) - continue; - - GuidAndCountsToRemove.push_back({ ItemEntry->GetItemGuid(), ItemEntry->GetCount() }); - - if (bRemoveIfNotDroppable && !WorldItemDefinition->CanBeDropped()) - continue; - - PickupCreateData CreateData; - CreateData.ItemEntry = ItemEntry; - CreateData.SpawnLocation = Location; - CreateData.SourceType = EFortPickupSourceTypeFlag::GetPlayerValue(); - - AFortPickup::SpawnPickup(CreateData); - } - - for (auto& Pair : GuidAndCountsToRemove) - { - WorldInventory->RemoveItem(Pair.first, nullptr, Pair.second, true); - } - - WorldInventory->Update(); -} - -void AFortPlayerController::ApplyCosmeticLoadout() -{ - auto PlayerStateAsFort = Cast(GetPlayerState()); - - if (!PlayerStateAsFort) - return; - - auto PawnAsFort = Cast(GetMyFortPawn()); - - if (!PawnAsFort) - return; - - static auto UpdatePlayerCustomCharacterPartsVisualizationFn = FindObject(L"/Script/FortniteGame.FortKismetLibrary.UpdatePlayerCustomCharacterPartsVisualization"); - - if (!UpdatePlayerCustomCharacterPartsVisualizationFn) - { - if (Addresses::ApplyCharacterCustomization) - { - static void* (*ApplyCharacterCustomizationOriginal)(AFortPlayerState* a1, AFortPawn* a3) = decltype(ApplyCharacterCustomizationOriginal)(Addresses::ApplyCharacterCustomization); - ApplyCharacterCustomizationOriginal(PlayerStateAsFort, PawnAsFort); - - PlayerStateAsFort->ForceNetUpdate(); - PawnAsFort->ForceNetUpdate(); - this->ForceNetUpdate(); - - return; - } - - auto CosmeticLoadout = GetCosmeticLoadoutOffset() != -1 ? this->GetCosmeticLoadout() : nullptr; - - if (CosmeticLoadout) - { - /* static auto Pawn_CosmeticLoadoutOffset = PawnAsFort->GetOffset("CosmeticLoadout"); - - if (Pawn_CosmeticLoadoutOffset != -1) - { - CopyStruct(PawnAsFort->GetPtr<__int64>(Pawn_CosmeticLoadoutOffset), CosmeticLoadout, FFortAthenaLoadout::GetStructSize()); - } */ - - auto Character = CosmeticLoadout->GetCharacter(); - - // LOG_INFO(LogDev, "Character: {}", __int64(Character)); - // LOG_INFO(LogDev, "Character Name: {}", Character ? Character->GetFullName() : "InvalidObject"); - - if (PawnAsFort) - { - ApplyCID(PawnAsFort, Character, false); - - auto Backpack = CosmeticLoadout->GetBackpack(); - - if (Backpack) - { - static auto CharacterPartsOffset = Backpack->GetOffset("CharacterParts"); - - if (CharacterPartsOffset != -1) - { - auto& BackpackCharacterParts = Backpack->Get>(CharacterPartsOffset); - - for (int i = 0; i < BackpackCharacterParts.Num(); ++i) - { - auto BackpackCharacterPart = BackpackCharacterParts.at(i); - - if (!BackpackCharacterPart) - continue; - - PawnAsFort->ServerChoosePart(EFortCustomPartType::Backpack, BackpackCharacterPart); - } - - // UFortKismetLibrary::ApplyCharacterCosmetics(GetWorld(), BackpackCharacterParts, PlayerStateAsFort, &aa); - } - } - } - } - else - { - static auto HeroTypeOffset = PlayerStateAsFort->GetOffset("HeroType"); - ApplyHID(PawnAsFort, PlayerStateAsFort->Get(HeroTypeOffset)); - } - - PlayerStateAsFort->ForceNetUpdate(); - PawnAsFort->ForceNetUpdate(); - this->ForceNetUpdate(); - - return; - } - - UFortKismetLibrary::StaticClass()->ProcessEvent(UpdatePlayerCustomCharacterPartsVisualizationFn, &PlayerStateAsFort); - - PlayerStateAsFort->ForceNetUpdate(); - PawnAsFort->ForceNetUpdate(); - this->ForceNetUpdate(); -} - -void AFortPlayerController::ServerLoadingScreenDroppedHook(UObject* Context, FFrame* Stack, void* Ret) -{ - LOG_INFO(LogDev, "ServerLoadingScreenDroppedHook!"); - - auto PlayerController = (AFortPlayerController*)Context; - - PlayerController->ApplyCosmeticLoadout(); - - return ServerLoadingScreenDroppedOriginal(Context, Stack, Ret); -} - -void AFortPlayerController::ServerRepairBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToRepair) -{ - if (!BuildingActorToRepair - // || !BuildingActorToRepair->GetWorld() - ) - return; - - if (BuildingActorToRepair->GetEditingPlayer()) - { - // ClientSendMessage - return; - } - - float BuildingHealthPercent = BuildingActorToRepair->GetHealthPercent(); - - // todo not hardcode these - - float BuildingCost = 10; - float RepairCostMultiplier = 0.75; - - float BuildingHealthPercentLost = 1.0 - BuildingHealthPercent; - float RepairCostUnrounded = (BuildingCost * BuildingHealthPercentLost) * RepairCostMultiplier; - float RepairCost = std::floor(RepairCostUnrounded > 0 ? RepairCostUnrounded < 1 ? 1 : RepairCostUnrounded : 0); - - if (RepairCost < 0) - return; - - auto ResourceItemDefinition = UFortKismetLibrary::K2_GetResourceItemDefinition(BuildingActorToRepair->GetResourceType()); - - if (!ResourceItemDefinition) - return; - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - if (!PlayerController->DoesBuildFree()) - { - auto ResourceInstance = WorldInventory->FindItemInstance(ResourceItemDefinition); - - if (!ResourceInstance) - return; - - bool bShouldUpdate = false; - - if (!WorldInventory->RemoveItem(ResourceInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, RepairCost)) - return; - - if (bShouldUpdate) - WorldInventory->Update(); - } - - struct { AFortPlayerController* RepairingController; int ResourcesSpent; } ABuildingSMActor_RepairBuilding_Params{ PlayerController, RepairCost }; - - static auto RepairBuildingFn = FindObject(L"/Script/FortniteGame.BuildingSMActor.RepairBuilding"); - BuildingActorToRepair->ProcessEvent(RepairBuildingFn, &ABuildingSMActor_RepairBuilding_Params); - // PlayerController->FortClientPlaySoundAtLocation(PlayerController->StartRepairSound, BuildingActorToRepair->K2_GetActorLocation(), 0, 0); -} - -void AFortPlayerController::ServerExecuteInventoryItemHook(AFortPlayerController* PlayerController, FGuid ItemGuid) -{ - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - auto ItemInstance = WorldInventory->FindItemInstance(ItemGuid); - auto Pawn = Cast(PlayerController->GetPawn()); - - if (!ItemInstance || !Pawn) - return; - - FGuid OldGuid = Pawn->GetCurrentWeapon() ? Pawn->GetCurrentWeapon()->GetItemEntryGuid() : FGuid(-1, -1, -1, -1); - UFortItem* OldInstance = OldGuid == FGuid(-1, -1, -1, -1) ? nullptr : WorldInventory->FindItemInstance(OldGuid); - auto ItemDefinition = ItemInstance->GetItemEntry()->GetItemDefinition(); - - if (!ItemDefinition) - return; - - // LOG_INFO(LogDev, "Equipping ItemDefinition: {}", ItemDefinition->GetFullName()); - - static auto FortGadgetItemDefinitionClass = FindObject(L"/Script/FortniteGame.FortGadgetItemDefinition"); - - UFortGadgetItemDefinition* GadgetItemDefinition = Cast(ItemDefinition); - - if (GadgetItemDefinition) - { - static auto GetWeaponItemDefinition = FindObject(L"/Script/FortniteGame.FortGadgetItemDefinition.GetWeaponItemDefinition"); - - if (GetWeaponItemDefinition) - { - ItemDefinition->ProcessEvent(GetWeaponItemDefinition, &ItemDefinition); - } - else - { - static auto GetDecoItemDefinition = FindObject(L"/Script/FortniteGame.FortGadgetItemDefinition.GetDecoItemDefinition"); - ItemDefinition->ProcessEvent(GetDecoItemDefinition, &ItemDefinition); - } - - // LOG_INFO(LogDev, "Equipping Gadget: {}", ItemDefinition->GetFullName()); - } - - if (auto DecoItemDefinition = Cast(ItemDefinition)) - { - Pawn->PickUpActor(nullptr, DecoItemDefinition); // todo check ret value? // I checked on 1.7.2 and it only returns true if the new weapon is a FortDecoTool - Pawn->GetCurrentWeapon()->GetItemEntryGuid() = ItemGuid; - - static auto FortDecoTool_ContextTrapStaticClass = FindObject(L"/Script/FortniteGame.FortDecoTool_ContextTrap"); - - if (Pawn->GetCurrentWeapon()->IsA(FortDecoTool_ContextTrapStaticClass)) - { - static auto ContextTrapItemDefinitionOffset = Pawn->GetCurrentWeapon()->GetOffset("ContextTrapItemDefinition"); - Pawn->GetCurrentWeapon()->Get(ContextTrapItemDefinitionOffset) = DecoItemDefinition; - } - - return; - } - - if (!ItemDefinition) - return; - - if (auto Weapon = Pawn->EquipWeaponDefinition((UFortWeaponItemDefinition*)ItemDefinition, ItemInstance->GetItemEntry()->GetItemGuid())) - { - if (Engine_Version < 420) - { - static auto FortWeap_BuildingToolClass = FindObject(L"/Script/FortniteGame.FortWeap_BuildingTool"); - - if (!Weapon->IsA(FortWeap_BuildingToolClass)) - return; - - auto BuildingTool = Weapon; - - using UBuildingEditModeMetadata = UObject; - using UFortBuildingItemDefinition = UObject; - - static auto OnRep_DefaultMetadataFn = FindObject(L"/Script/FortniteGame.FortWeap_BuildingTool.OnRep_DefaultMetadata"); - static auto DefaultMetadataOffset = BuildingTool->GetOffset("DefaultMetadata"); - - static auto RoofPiece = FindObject(L"/Game/Items/Weapons/BuildingTools/BuildingItemData_RoofS.BuildingItemData_RoofS"); - static auto FloorPiece = FindObject(L"/Game/Items/Weapons/BuildingTools/BuildingItemData_Floor.BuildingItemData_Floor"); - static auto WallPiece = FindObject(L"/Game/Items/Weapons/BuildingTools/BuildingItemData_Wall.BuildingItemData_Wall"); - static auto StairPiece = FindObject(L"/Game/Items/Weapons/BuildingTools/BuildingItemData_Stair_W.BuildingItemData_Stair_W"); - - UBuildingEditModeMetadata* OldMetadata = nullptr; // Newer versions - OldMetadata = BuildingTool->Get(DefaultMetadataOffset); - - if (ItemDefinition == RoofPiece) - { - static auto RoofMetadata = FindObject(L"/Game/Building/EditModePatterns/Roof/EMP_Roof_RoofC.EMP_Roof_RoofC"); - BuildingTool->Get(DefaultMetadataOffset) = RoofMetadata; - } - else if (ItemDefinition == StairPiece) - { - static auto StairMetadata = FindObject(L"/Game/Building/EditModePatterns/Stair/EMP_Stair_StairW.EMP_Stair_StairW"); - BuildingTool->Get(DefaultMetadataOffset) = StairMetadata; - } - else if (ItemDefinition == WallPiece) - { - static auto WallMetadata = FindObject(L"/Game/Building/EditModePatterns/Wall/EMP_Wall_Solid.EMP_Wall_Solid"); - BuildingTool->Get(DefaultMetadataOffset) = WallMetadata; - } - else if (ItemDefinition == FloorPiece) - { - static auto FloorMetadata = FindObject(L"/Game/Building/EditModePatterns/Floor/EMP_Floor_Floor.EMP_Floor_Floor"); - BuildingTool->Get(DefaultMetadataOffset) = FloorMetadata; - } - - BuildingTool->ProcessEvent(OnRep_DefaultMetadataFn, &OldMetadata); - } - } -} - -void AFortPlayerController::ServerAttemptInteractHook(UObject* Context, FFrame* Stack, void* Ret) -{ - // static auto LlamaClass = FindObject(L"/Game/Athena/SupplyDrops/Llama/AthenaSupplyDrop_Llama.AthenaSupplyDrop_Llama_C"); - static auto FortAthenaSupplyDropClass = FindObject(L"/Script/FortniteGame.FortAthenaSupplyDrop"); - static auto BuildingItemCollectorActorClass = FindObject(L"/Script/FortniteGame.BuildingItemCollectorActor"); - - LOG_INFO(LogInteraction, "ServerAttemptInteract!"); - - auto Params = Stack->Locals; - - static bool bIsUsingComponent = FindObject(L"/Script/FortniteGame.FortControllerComponent_Interaction"); - - AFortPlayerControllerAthena* PlayerController = bIsUsingComponent ? Cast(((UActorComponent*)Context)->GetOwner()) : - Cast(Context); - - if (!PlayerController) - return; - - std::string StructName = bIsUsingComponent ? "/Script/FortniteGame.FortControllerComponent_Interaction.ServerAttemptInteract" : "/Script/FortniteGame.FortPlayerController.ServerAttemptInteract"; - - static auto ReceivingActorOffset = FindOffsetStruct(StructName, "ReceivingActor"); - auto ReceivingActor = *(AActor**)(__int64(Params) + ReceivingActorOffset); - - // LOG_INFO(LogInteraction, "ReceivingActor: {}", __int64(ReceivingActor)); - - if (!ReceivingActor) - return; - - // LOG_INFO(LogInteraction, "ReceivingActor Name: {}", ReceivingActor->GetFullName()); - - FVector LocationToSpawnLoot = ReceivingActor->GetActorLocation() + ReceivingActor->GetActorRightVector() * 70.f + FVector{ 0, 0, 50 }; - - static auto FortAthenaVehicleClass = FindObject(L"/Script/FortniteGame.FortAthenaVehicle"); - static auto SearchAnimationCountOffset = FindOffsetStruct("/Script/FortniteGame.FortSearchBounceData", "SearchAnimationCount"); - - if (auto BuildingContainer = Cast(ReceivingActor)) - { - static auto bAlreadySearchedOffset = BuildingContainer->GetOffset("bAlreadySearched"); - static auto SearchBounceDataOffset = BuildingContainer->GetOffset("SearchBounceData"); - static auto bAlreadySearchedFieldMask = GetFieldMask(BuildingContainer->GetProperty("bAlreadySearched")); - - auto SearchBounceData = BuildingContainer->GetPtr(SearchBounceDataOffset); - - if (BuildingContainer->ReadBitfieldValue(bAlreadySearchedOffset, bAlreadySearchedFieldMask)) - return; - - // LOG_INFO(LogInteraction, "bAlreadySearchedFieldMask: {}", bAlreadySearchedFieldMask); - - BuildingContainer->SpawnLoot(PlayerController->GetMyFortPawn()); - - BuildingContainer->SetBitfieldValue(bAlreadySearchedOffset, bAlreadySearchedFieldMask, true); - (*(int*)(__int64(SearchBounceData) + SearchAnimationCountOffset))++; - BuildingContainer->BounceContainer(); - - BuildingContainer->ForceNetUpdate(); // ? - - static auto OnRep_bAlreadySearchedFn = FindObject(L"/Script/FortniteGame.BuildingContainer.OnRep_bAlreadySearched"); - // BuildingContainer->ProcessEvent(OnRep_bAlreadySearchedFn); - - // if (BuildingContainer->ShouldDestroyOnSearch()) - // BuildingContainer->K2_DestroyActor(); - } - else if (ReceivingActor->IsA(FortAthenaVehicleClass)) - { - auto Vehicle = (AFortAthenaVehicle*)ReceivingActor; - ServerAttemptInteractOriginal(Context, Stack, Ret); - - if (!AreVehicleWeaponsEnabled()) - return; - - auto Pawn = (AFortPlayerPawn*)PlayerController->GetMyFortPawn(); - - if (!Pawn) - return; - - auto VehicleWeaponDefinition = Pawn->GetVehicleWeaponDefinition(Vehicle); - - if (!VehicleWeaponDefinition) - { - LOG_INFO(LogDev, "Invalid VehicleWeaponDefinition!"); - return; - } - - LOG_INFO(LogDev, "Equipping {}", VehicleWeaponDefinition->GetFullName()); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - auto NewAndModifiedInstances = WorldInventory->AddItem(VehicleWeaponDefinition, nullptr); - auto NewVehicleInstance = NewAndModifiedInstances.first[0]; - - if (!NewVehicleInstance) - return; - - WorldInventory->Update(); - - auto VehicleWeapon = Pawn->EquipWeaponDefinition(VehicleWeaponDefinition, NewVehicleInstance->GetItemEntry()->GetItemGuid()); - // PlayerController->ServerExecuteInventoryItemHook(PlayerController, newitem->GetItemEntry()->GetItemGuid()); - - /* static auto GetSeatWeaponComponentFn = FindObject("/Script/FortniteGame.FortAthenaVehicle.GetSeatWeaponComponent"); - - if (GetSeatWeaponComponentFn) - { - struct { int SeatIndex; UObject* ReturnValue; } AFortAthenaVehicle_GetSeatWeaponComponent_Params{}; - - Vehicle->ProcessEvent(GetSeatWeaponComponentFn, &AFortAthenaVehicle_GetSeatWeaponComponent_Params); - - UObject* WeaponComponent = AFortAthenaVehicle_GetSeatWeaponComponent_Params.ReturnValue; - - if (!WeaponComponent) - return; - - static auto WeaponSeatDefinitionStructSize = FindObject("/Script/FortniteGame.WeaponSeatDefinition")->GetPropertiesSize(); - static auto VehicleWeaponOffset = FindOffsetStruct("/Script/FortniteGame.WeaponSeatDefinition", "VehicleWeapon"); - static auto SeatIndexOffset = FindOffsetStruct("/Script/FortniteGame.WeaponSeatDefinition", "SeatIndex"); - static auto WeaponSeatDefinitionsOffset = WeaponComponent->GetOffset("WeaponSeatDefinitions"); - auto& WeaponSeatDefinitions = WeaponComponent->Get>(WeaponSeatDefinitionsOffset); - - for (int i = 0; i < WeaponSeatDefinitions.Num(); ++i) - { - auto WeaponSeat = WeaponSeatDefinitions.AtPtr(i, WeaponSeatDefinitionStructSize); - - if (*(int*)(__int64(WeaponSeat) + SeatIndexOffset) != Vehicle->FindSeatIndex(Pawn)) - continue; - - auto VehicleGrantedWeaponItem = (TWeakObjectPtr*)(__int64(WeaponSeat) + 0x20); - - VehicleGrantedWeaponItem->ObjectIndex = NewVehicleInstance->InternalIndex; - VehicleGrantedWeaponItem->ObjectSerialNumber = GetItemByIndex(NewVehicleInstance->InternalIndex)->SerialNumber; - - static auto bWeaponEquippedOffset = WeaponComponent->GetOffset("bWeaponEquipped"); - WeaponComponent->Get(bWeaponEquippedOffset) = true; - - break; - } - } */ - - return; - } - else if (ReceivingActor->IsA(BuildingItemCollectorActorClass)) - { - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return ServerAttemptInteractOriginal(Context, Stack, Ret); - - auto ItemCollector = ReceivingActor; - static auto ActiveInputItemOffset = ItemCollector->GetOffset("ActiveInputItem"); - auto CurrentMaterial = ItemCollector->Get(ActiveInputItemOffset); // InteractType->OptionalObjectData - - if (!CurrentMaterial) - return ServerAttemptInteractOriginal(Context, Stack, Ret); - - int Index = 0; - - // this is a weird way of getting the current item collection we are on. - - static auto StoneItemData = FindObject(L"/Game/Items/ResourcePickups/StoneItemData.StoneItemData"); - static auto MetalItemData = FindObject(L"/Game/Items/ResourcePickups/MetalItemData.MetalItemData"); - - if (CurrentMaterial == StoneItemData) - Index = 1; - else if (CurrentMaterial == MetalItemData) - Index = 2; - - static auto ItemCollectionsOffset = ItemCollector->GetOffset("ItemCollections"); - auto& ItemCollections = ItemCollector->Get>(ItemCollectionsOffset); - - auto ItemCollection = ItemCollections.AtPtr(Index, FCollectorUnitInfo::GetPropertiesSize()); - - if (Fortnite_Version < 8.10) - { - auto Cost = ItemCollection->GetInputCount()->GetValue(); - - if (!CurrentMaterial) - return ServerAttemptInteractOriginal(Context, Stack, Ret); - - auto MatInstance = WorldInventory->FindItemInstance(CurrentMaterial); - - if (!MatInstance) - return ServerAttemptInteractOriginal(Context, Stack, Ret); - - bool bShouldUpdate = false; - - if (!WorldInventory->RemoveItem(MatInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, Cost, true)) - return ServerAttemptInteractOriginal(Context, Stack, Ret); - - if (bShouldUpdate) - WorldInventory->Update(); - } - - for (int z = 0; z < ItemCollection->GetOutputItemEntry()->Num(); z++) - { - auto Entry = ItemCollection->GetOutputItemEntry()->AtPtr(z, FFortItemEntry::GetStructSize()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(Entry->GetItemDefinition(), Entry->GetCount(), Entry->GetLoadedAmmo(), MAX_DURABILITY, Entry->GetLevel()); - CreateData.SpawnLocation = LocationToSpawnLoot; - CreateData.PawnOwner = PlayerController->GetMyFortPawn(); // hmm - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - AFortPickup::SpawnPickup(CreateData); - } - - static auto bCurrentInteractionSuccessOffset = ItemCollector->GetOffset("bCurrentInteractionSuccess", false); - - if (bCurrentInteractionSuccessOffset != -1) - { - static auto bCurrentInteractionSuccessFieldMask = GetFieldMask(ItemCollector->GetProperty("bCurrentInteractionSuccess")); - ItemCollector->SetBitfieldValue(bCurrentInteractionSuccessOffset, bCurrentInteractionSuccessFieldMask, true); // idek if this is needed - } - - static auto DoVendDeath = FindObject(L"/Game/Athena/Items/Gameplay/VendingMachine/B_Athena_VendingMachine.B_Athena_VendingMachine_C.DoVendDeath"); - - if (DoVendDeath) - { - ItemCollector->ProcessEvent(DoVendDeath); - ItemCollector->K2_DestroyActor(); - } - } - - return ServerAttemptInteractOriginal(Context, Stack, Ret); -} - -void AFortPlayerController::ServerAttemptAircraftJumpHook(AFortPlayerController* PC, FRotator ClientRotation) -{ - auto PlayerController = Cast(Engine_Version < 424 ? PC : ((UActorComponent*)PC)->GetOwner()); - - if (Engine_Version < 424 && !Globals::bLateGame.load()) - return ServerAttemptAircraftJumpOriginal(PC, ClientRotation); - - if (!PlayerController) - return ServerAttemptAircraftJumpOriginal(PC, ClientRotation); - - // if (!PlayerController->bInAircraft) - // return; - - LOG_INFO(LogDev, "ServerAttemptAircraftJumpHook!"); - - auto GameMode = (AFortGameModeAthena*)GetWorld()->GetGameMode(); - auto GameState = GameMode->GetGameStateAthena(); - - AActor* AircraftToJumpFrom = nullptr; - - static auto AircraftsOffset = GameState->GetOffset("Aircrafts", false); - - if (AircraftsOffset == -1) - { - static auto AircraftOffset = GameState->GetOffset("Aircraft"); - AircraftToJumpFrom = GameState->Get(AircraftOffset); - } - else - { - auto Aircrafts = GameState->GetPtr>(AircraftsOffset); - AircraftToJumpFrom = Aircrafts->Num() > 0 ? Aircrafts->at(0) : nullptr; // skunky - } - - if (!AircraftToJumpFrom) - return ServerAttemptAircraftJumpOriginal(PC, ClientRotation); - - if (false) - { - auto NewPawn = GameMode->SpawnDefaultPawnForHook(GameMode, (AController*)PlayerController, AircraftToJumpFrom); - PlayerController->Possess(NewPawn); - } - else - { - if (false) - { - // honestly idk why this doesnt work - - auto NAME_Inactive = UKismetStringLibrary::Conv_StringToName(L"NAME_Inactive"); - - LOG_INFO(LogDev, "name Comp: {}", NAME_Inactive.ComparisonIndex.Value); - - PlayerController->GetStateName() = NAME_Inactive; - PlayerController->SetPlayerIsWaiting(true); - PlayerController->ServerRestartPlayer(); - } - else - { - GameMode->RestartPlayer(PlayerController); - } - - // we are supposed to do some skydivign stuff here but whatever - } - - auto NewPawnAsFort = PlayerController->GetMyFortPawn(); - - if (Fortnite_Version >= 18) // TODO (Milxnor) Find a better fix and move this - { - static auto StormEffectClass = FindObject(L"/Game/Athena/SafeZone/GE_OutsideSafeZoneDamage.GE_OutsideSafeZoneDamage_C"); - auto PlayerState = PlayerController->GetPlayerStateAthena(); - - PlayerState->GetAbilitySystemComponent()->RemoveActiveGameplayEffectBySourceEffect(StormEffectClass, 1, PlayerState->GetAbilitySystemComponent()); - } - - if (NewPawnAsFort) - { - NewPawnAsFort->SetHealth(100); // needed with server restart player? - - if (Globals::bLateGame) - { - NewPawnAsFort->SetShield(100); - - NewPawnAsFort->TeleportTo(AircraftToJumpFrom->GetActorLocation(), FRotator()); - } - } - - // PlayerController->ServerRestartPlayer(); - // return ServerAttemptAircraftJumpOriginal(PC, ClientRotation); -} - -void AFortPlayerController::ServerSuicideHook(AFortPlayerController* PlayerController) -{ - LOG_INFO(LogDev, "Suicide!"); - - auto Pawn = PlayerController->GetPawn(); - - if (!Pawn) - return; - - // theres some other checks here idk - - if (!Pawn->IsA(AFortPlayerPawn::StaticClass())) // Why FortPlayerPawn? Ask Fortnite - return; - - // suicide doesn't actually call force kill but its basically the same function - - static auto ForceKillFn = FindObject(L"/Script/FortniteGame.FortPawn.ForceKill"); // exists on 1.2 and 19.10 with same params so I assume it's the same on every other build. - - FGameplayTag DeathReason; // unused on 1.7.2 - AActor* KillerActor = nullptr; // its just 0 in suicide (not really but easiest way to explain it) - - struct { FGameplayTag DeathReason; AController* KillerController; AActor* KillerActor; } AFortPawn_ForceKill_Params{ DeathReason, PlayerController, KillerActor }; - - Pawn->ProcessEvent(ForceKillFn, &AFortPawn_ForceKill_Params); - - //PlayerDeathReport->ServerTimeForRespawn && PlayerDeathReport->ServerTimeForResurrect = 0? // I think this is what they do on 1.7.2 I'm too lazy to double check though. -} - -void AFortPlayerController::ServerDropAllItemsHook(AFortPlayerController* PlayerController, UFortItemDefinition* IgnoreItemDef) -{ - LOG_INFO(LogDev, "DropAllItems!"); - PlayerController->DropAllItems({ IgnoreItemDef }); -} - -void AFortPlayerController::ServerCreateBuildingActorHook(UObject* Context, FFrame* Stack, void* Ret) -{ - auto PlayerController = (AFortPlayerController*)Context; - - if (!PlayerController) // ?? - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - - auto PlayerStateAthena = Cast(PlayerController->GetPlayerState()); - - if (!PlayerStateAthena) - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - - UClass* BuildingClass = nullptr; - FVector BuildLocation; - FRotator BuildRotator; - bool bMirrored; - - if (Fortnite_Version >= 8.30) - { - struct FCreateBuildingActorData { uint32_t BuildingClassHandle; FVector BuildLoc; FRotator BuildRot; bool bMirrored; }; - auto CreateBuildingData = (FCreateBuildingActorData*)Stack->Locals; - - BuildLocation = CreateBuildingData->BuildLoc; - BuildRotator = CreateBuildingData->BuildRot; - bMirrored = CreateBuildingData->bMirrored; - - static auto BroadcastRemoteClientInfoOffset = PlayerController->GetOffset("BroadcastRemoteClientInfo"); - auto BroadcastRemoteClientInfo = PlayerController->Get(BroadcastRemoteClientInfoOffset); - - static auto RemoteBuildableClassOffset = BroadcastRemoteClientInfo->GetOffset("RemoteBuildableClass"); - BuildingClass = BroadcastRemoteClientInfo->Get(RemoteBuildableClassOffset); - } - else - { - struct FBuildingClassData { UClass* BuildingClass; int PreviousBuildingLevel; int UpgradeLevel; }; - struct SCBAParams { FBuildingClassData BuildingClassData; FVector BuildLoc; FRotator BuildRot; bool bMirrored; }; - - auto Params = (SCBAParams*)Stack->Locals; - - BuildingClass = Params->BuildingClassData.BuildingClass; - BuildLocation = Params->BuildLoc; - BuildRotator = Params->BuildRot; - bMirrored = Params->bMirrored; - } - - // LOG_INFO(LogDev, "BuildingClass {}", __int64(BuildingClass)); - - if (!BuildingClass) - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - - auto GameState = Cast(((AFortGameMode*)GetWorld()->GetGameMode())->GetGameState()); - - auto StructuralSupportSystem = GameState->GetStructuralSupportSystem(); - - if (StructuralSupportSystem) - { - if (!StructuralSupportSystem->IsWorldLocValid(BuildLocation)) - { - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - } - } - - if (!GameState->IsPlayerBuildableClass(BuildingClass)) - { - LOG_INFO(LogDev, "Cheater most likely."); - // PlayerController->GetAnticheatComponent().AddAndCheck(Severity::HIGH); - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - } - - TArray ExistingBuildings; - char idk; - static __int64 (*CantBuild)(UObject*, UObject*, FVector, FRotator, char, TArray*, char*) = decltype(CantBuild)(Addresses::CantBuild); - bool bCanBuild = !CantBuild(GetWorld(), BuildingClass, BuildLocation, BuildRotator, bMirrored, &ExistingBuildings, &idk); - - if (!bCanBuild) - { - ExistingBuildings.Free(); - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - } - - FTransform Transform{}; - Transform.Translation = BuildLocation; - Transform.Rotation = BuildRotator.Quaternion(); - Transform.Scale3D = { 1, 1, 1 }; - - auto BuildingActor = GetWorld()->SpawnActor(BuildingClass, Transform); - - if (!BuildingActor) - { - ExistingBuildings.Free(); - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - } - - auto MatDefinition = UFortKismetLibrary::K2_GetResourceItemDefinition(BuildingActor->GetResourceType()); - - auto MatInstance = WorldInventory->FindItemInstance(MatDefinition); - - bool bBuildFree = PlayerController->DoesBuildFree(); - - // LOG_INFO(LogDev, "MatInstance->GetItemEntry()->GetCount(): {}", MatInstance->GetItemEntry()->GetCount()); - - int MinimumMaterial = 10; - bool bShouldDestroy = MatInstance && MatInstance->GetItemEntry() ? MatInstance->GetItemEntry()->GetCount() < MinimumMaterial : true; - - if (bShouldDestroy && !bBuildFree) - { - ExistingBuildings.Free(); - BuildingActor->SilentDie(); - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - } - - for (int i = 0; i < ExistingBuildings.Num(); ++i) - { - auto ExistingBuilding = ExistingBuildings.At(i); - - ExistingBuilding->K2_DestroyActor(); - } - - ExistingBuildings.Free(); - - BuildingActor->SetPlayerPlaced(true); - BuildingActor->InitializeBuildingActor(PlayerController, BuildingActor, true); - BuildingActor->SetTeam(PlayerStateAthena->GetTeamIndex()); // required? - - if (!bBuildFree) - { - bool bShouldUpdate = false; - WorldInventory->RemoveItem(MatInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, 10); - - if (bShouldUpdate) - WorldInventory->Update(); - } - - /* - - GET_PLAYLIST(GameState); - - if (CurrentPlaylist) - { - // CurrentPlaylist->ApplyModifiersToActor(BuildingActor); // seems automatic - } */ - - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); -} - -AActor* AFortPlayerController::SpawnToyInstanceHook(UObject* Context, FFrame* Stack, AActor** Ret) -{ - LOG_INFO(LogDev, "SpawnToyInstance!"); - - auto PlayerController = Cast(Context); - - UClass* ToyClass = nullptr; - FTransform SpawnPosition; - - Stack->StepCompiledIn(&ToyClass); - Stack->StepCompiledIn(&SpawnPosition); - - SpawnToyInstanceOriginal(Context, Stack, Ret); - - if (!ToyClass) - return nullptr; - - auto Params = CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn, false, PlayerController); - auto NewToy = GetWorld()->SpawnActor(ToyClass, SpawnPosition, Params); - // free(Params); // ? - - static auto ActiveToyInstancesOffset = PlayerController->GetOffset("ActiveToyInstances"); - auto& ActiveToyInstances = PlayerController->Get>(ActiveToyInstancesOffset); - - static auto ToySummonCountsOffset = PlayerController->GetOffset("ToySummonCounts"); - auto& ToySummonCounts = PlayerController->Get>(ToySummonCountsOffset); - - // ActiveToyInstances.Add(NewToy); - - *Ret = NewToy; - return *Ret; -} - -void AFortPlayerController::DropSpecificItemHook(UObject* Context, FFrame& Stack, void* Ret) -{ - UFortItemDefinition* DropItemDef = nullptr; - - Stack.StepCompiledIn(&DropItemDef); - - if (!DropItemDef) - return; - - auto PlayerController = Cast(Context); - - if (!PlayerController) - return DropSpecificItemOriginal(Context, Stack, Ret); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return DropSpecificItemOriginal(Context, Stack, Ret); - - auto ItemInstance = WorldInventory->FindItemInstance(DropItemDef); - - if (!ItemInstance) - return DropSpecificItemOriginal(Context, Stack, Ret); - - PlayerController->ServerAttemptInventoryDropHook(PlayerController, ItemInstance->GetItemEntry()->GetItemGuid(), ItemInstance->GetItemEntry()->GetCount()); - - return DropSpecificItemOriginal(Context, Stack, Ret); -} - -void AFortPlayerController::ServerAttemptInventoryDropHook(AFortPlayerController* PlayerController, FGuid ItemGuid, int Count) -{ - LOG_INFO(LogDev, "ServerAttemptInventoryDropHook Dropping: {}", Count); - - auto Pawn = PlayerController->GetMyFortPawn(); - - if (Count < 0 || !Pawn) - return; - - if (auto PlayerControllerAthena = Cast(PlayerController)) - { - if (PlayerControllerAthena->IsInGhostMode()) - return; - } - - // TODO If the player is in a vehicle and has a vehicle weapon, don't let them drop. - - auto WorldInventory = PlayerController->GetWorldInventory(); - auto ReplicatedEntry = WorldInventory->FindReplicatedEntry(ItemGuid); - - if (!ReplicatedEntry || ReplicatedEntry->GetCount() < Count) - return; - - auto ItemDefinition = Cast(ReplicatedEntry->GetItemDefinition()); - - if (!ItemDefinition || !ItemDefinition->CanBeDropped()) - return; - - static auto DropBehaviorOffset = ItemDefinition->GetOffset("DropBehavior", false); - - EWorldItemDropBehavior DropBehavior = DropBehaviorOffset != -1 ? ItemDefinition->GetDropBehavior() : EWorldItemDropBehavior::EWorldItemDropBehavior_MAX; - - if (!ItemDefinition->ShouldIgnoreRespawningOnDrop() && DropBehavior != EWorldItemDropBehavior::DestroyOnDrop) - { - PickupCreateData CreateData; - CreateData.ItemEntry = ReplicatedEntry; - CreateData.SpawnLocation = Pawn->GetActorLocation(); - CreateData.bToss = true; - CreateData.OverrideCount = Count; - CreateData.PawnOwner = Pawn; - CreateData.bRandomRotation = true; - CreateData.SourceType = EFortPickupSourceTypeFlag::GetPlayerValue(); - CreateData.bShouldFreeItemEntryWhenDeconstructed = false; - - auto Pickup = AFortPickup::SpawnPickup(CreateData); - - if (!Pickup) - return; - } - - bool bShouldUpdate = false; - - if (!WorldInventory->RemoveItem(ItemGuid, &bShouldUpdate, Count, true, DropBehavior == EWorldItemDropBehavior::DropAsPickupDestroyOnEmpty)) - return; - - if (bShouldUpdate) - WorldInventory->Update(); -} - -void AFortPlayerController::ServerPlayEmoteItemHook(AFortPlayerController* PlayerController, UObject* EmoteAsset) -{ - auto PlayerState = (AFortPlayerStateAthena*)PlayerController->GetPlayerState(); - auto Pawn = PlayerController->GetPawn(); - - if (!EmoteAsset || !PlayerState || !Pawn) - return; - - auto AbilitySystemComponent = PlayerState->GetAbilitySystemComponent(); - - if (!AbilitySystemComponent) - return; - - UObject* AbilityToUse = nullptr; - - static auto AthenaSprayItemDefinitionClass = FindObject(L"/Script/FortniteGame.AthenaSprayItemDefinition"); - static auto AthenaToyItemDefinitionClass = FindObject(L"/Script/FortniteGame.AthenaToyItemDefinition"); - - if (EmoteAsset->IsA(AthenaSprayItemDefinitionClass)) - { - static auto SprayGameplayAbilityDefault = FindObject(L"/Game/Abilities/Sprays/GAB_Spray_Generic.Default__GAB_Spray_Generic_C"); - AbilityToUse = SprayGameplayAbilityDefault; - } - - else if (EmoteAsset->IsA(AthenaToyItemDefinitionClass)) - { - static auto ToySpawnAbilityOffset = EmoteAsset->GetOffset("ToySpawnAbility"); - auto& ToySpawnAbilitySoft = EmoteAsset->Get>(ToySpawnAbilityOffset); - - static auto BGAClass = FindObject(L"/Script/Engine.BlueprintGeneratedClass"); - - auto ToySpawnAbility = ToySpawnAbilitySoft.Get(BGAClass, true); - - if (ToySpawnAbility) - AbilityToUse = ToySpawnAbility->CreateDefaultObject(); - } - - // LOG_INFO(LogDev, "Before AbilityToUse: {}", AbilityToUse ? AbilityToUse->GetFullName() : "InvalidObject"); - - if (!AbilityToUse) - { - static auto EmoteGameplayAbilityDefault = FindObject(L"/Game/Abilities/Emotes/GAB_Emote_Generic.Default__GAB_Emote_Generic_C"); - AbilityToUse = EmoteGameplayAbilityDefault; - } - - if (!AbilityToUse) - return; - - static auto AthenaDanceItemDefinitionClass = FindObject(L"/Script/FortniteGame.AthenaDanceItemDefinition"); - - if (EmoteAsset->IsA(AthenaDanceItemDefinitionClass)) - { - static auto EmoteAsset_bMovingEmoteOffset = EmoteAsset->GetOffset("bMovingEmote", false); - static auto bMovingEmoteOffset = Pawn->GetOffset("bMovingEmote", false); - - if (bMovingEmoteOffset != -1 && EmoteAsset_bMovingEmoteOffset != -1) - { - static auto bMovingEmoteFieldMask = GetFieldMask(Pawn->GetProperty("bMovingEmote")); - static auto EmoteAsset_bMovingEmoteFieldMask = GetFieldMask(EmoteAsset->GetProperty("bMovingEmote")); - Pawn->SetBitfieldValue(bMovingEmoteOffset, bMovingEmoteFieldMask, EmoteAsset->ReadBitfieldValue(EmoteAsset_bMovingEmoteOffset, EmoteAsset_bMovingEmoteFieldMask)); - } - - static auto bMoveForwardOnlyOffset = EmoteAsset->GetOffset("bMoveForwardOnly", false); - static auto bMovingEmoteForwardOnlyOffset = Pawn->GetOffset("bMovingEmoteForwardOnly", false); - - if (bMovingEmoteForwardOnlyOffset != -1 && bMoveForwardOnlyOffset != -1) - { - static auto bMovingEmoteForwardOnlyFieldMask = GetFieldMask(Pawn->GetProperty("bMovingEmoteForwardOnly")); - static auto bMoveForwardOnlyFieldMask = GetFieldMask(EmoteAsset->GetProperty("bMoveForwardOnly")); - Pawn->SetBitfieldValue(bMovingEmoteOffset, bMovingEmoteForwardOnlyFieldMask, EmoteAsset->ReadBitfieldValue(bMoveForwardOnlyOffset, bMoveForwardOnlyFieldMask)); - } - - static auto WalkForwardSpeedOffset = EmoteAsset->GetOffset("WalkForwardSpeed", false); - static auto EmoteWalkSpeedOffset = Pawn->GetOffset("EmoteWalkSpeed", false); - - if (EmoteWalkSpeedOffset != -1 && WalkForwardSpeedOffset != -1) - { - Pawn->Get(EmoteWalkSpeedOffset) = EmoteAsset->Get(WalkForwardSpeedOffset); - } - } - - int outHandle = 0; - - FGameplayAbilitySpec* Spec = MakeNewSpec((UClass*)AbilityToUse, EmoteAsset, true); - - if (!Spec) - return; - - static unsigned int* (*GiveAbilityAndActivateOnce)(UAbilitySystemComponent* ASC, int* outHandle, __int64 Spec, FGameplayEventData* TriggerEventData) = decltype(GiveAbilityAndActivateOnce)(Addresses::GiveAbilityAndActivateOnce); // EventData is only on ue500? - - if (GiveAbilityAndActivateOnce) - { - GiveAbilityAndActivateOnce(AbilitySystemComponent, &outHandle, __int64(Spec), nullptr); - } -} - -uint8 ToDeathCause(const FGameplayTagContainer& TagContainer, bool bWasDBNO = false, AFortPawn* Pawn = nullptr) -{ - static auto ToDeathCauseFn = FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.ToDeathCause"); - - if (ToDeathCauseFn) - { - struct - { - FGameplayTagContainer InTags; // (ConstParm, Parm, OutParm, ReferenceParm, NativeAccessSpecifierPublic) - bool bWasDBNO; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - uint8_t ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortPlayerStateAthena_ToDeathCause_Params{ TagContainer, bWasDBNO }; - - AFortPlayerStateAthena::StaticClass()->ProcessEvent(ToDeathCauseFn, &AFortPlayerStateAthena_ToDeathCause_Params); - - return AFortPlayerStateAthena_ToDeathCause_Params.ReturnValue; - } - - static bool bHaveFoundAddress = false; - - static uint64 Addr = 0; - - if (!bHaveFoundAddress) - { - bHaveFoundAddress = true; - - if (Engine_Version == 419) - Addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 41 0F B6 F8 48 8B DA 48 8B F1 E8 ? ? ? ? 33 ED").Get(); - if (Engine_Version == 420) - Addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 0F B6 FA 48 8B D9 E8 ? ? ? ? 33 F6 48 89 74 24").Get(); - if (Engine_Version == 421) // 5.1 - Addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 0F B6 FA 48 8B D9 E8 ? ? ? ? 33").Get(); - - if (!Addr) - { - LOG_WARN(LogPlayer, "Failed to find ToDeathCause address!"); - return 0; - } - } - - if (!Addr) - { - return 0; - } - - if (Engine_Version == 419) - { - static uint8(*sub_7FF7AB499410)(AFortPawn* Pawn, FGameplayTagContainer TagContainer, char bWasDBNOIg) = decltype(sub_7FF7AB499410)(Addr); - return sub_7FF7AB499410(Pawn, TagContainer, bWasDBNO); - } - - static uint8 (*sub_7FF7AB499410)(FGameplayTagContainer TagContainer, char bWasDBNOIg) = decltype(sub_7FF7AB499410)(Addr); - return sub_7FF7AB499410(TagContainer, bWasDBNO); -} - -DWORD WINAPI SpectateThread(LPVOID PC) -{ - auto PlayerController = (UObject*)PC; - - if (!PlayerController->IsValidLowLevel()) - return 0; - - auto SpectatingPC = Cast(PlayerController); - - if (!SpectatingPC) - return 0; - - Sleep(3000); - - LOG_INFO(LogDev, "bugha!"); - - SpectatingPC->SpectateOnDeath(); - - return 0; -} - -DWORD WINAPI RestartThread(LPVOID) -{ - // We should probably use unreal engine's timing system for this. - // There is no way to restart that I know of without closing the connection to the clients. - - bIsInAutoRestart = true; - - float SecondsBeforeRestart = 10; - Sleep(SecondsBeforeRestart * 1000); - - LOG_INFO(LogDev, "Auto restarting!"); - - Restart(); - - bIsInAutoRestart = false; - - return 0; -} - -void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerController, void* DeathReport) -{ - auto GameState = Cast(((AFortGameMode*)GetWorld()->GetGameMode())->GetGameState()); - auto DeadPawn = Cast(PlayerController->GetPawn()); - auto DeadPlayerState = Cast(PlayerController->GetPlayerState()); - auto KillerPawn = Cast(*(AFortPawn**)(__int64(DeathReport) + MemberOffsets::DeathReport::KillerPawn)); - auto KillerPlayerState = Cast(*(AFortPlayerState**)(__int64(DeathReport) + MemberOffsets::DeathReport::KillerPlayerState)); - - if (!DeadPawn || !GameState || !DeadPlayerState) - return ClientOnPawnDiedOriginal(PlayerController, DeathReport); - - auto DeathLocation = DeadPawn->GetActorLocation(); - - static auto FallDamageEnumValue = 1; - - uint8_t DeathCause = 0; - - if (Fortnite_Version > 1.8 || Fortnite_Version == 1.11) - { - auto DeathInfo = DeadPlayerState->GetDeathInfo(); // Alloc(DeathInfoStructSize); - DeadPlayerState->ClearDeathInfo(); - - auto/*&*/ Tags = MemberOffsets::FortPlayerPawn::CorrectTags == 0 ? FGameplayTagContainer() - : DeadPawn->Get(MemberOffsets::FortPlayerPawn::CorrectTags); - // *(FGameplayTagContainer*)(__int64(DeathReport) + MemberOffsets::DeathReport::Tags); - - // LOG_INFO(LogDev, "Tags: {}", Tags.ToStringSimple(true)); - - DeathCause = ToDeathCause(Tags, false, DeadPawn); // DeadPawn->IsDBNO() ?? - - LOG_INFO(LogDev, "DeathCause: {}", (int)DeathCause); - LOG_INFO(LogDev, "DeadPawn->IsDBNO(): {}", DeadPawn->IsDBNO()); - LOG_INFO(LogDev, "KillerPlayerState: {}", __int64(KillerPlayerState)); - - *(bool*)(__int64(DeathInfo) + MemberOffsets::DeathInfo::bDBNO) = DeadPawn->IsDBNO(); - *(uint8*)(__int64(DeathInfo) + MemberOffsets::DeathInfo::DeathCause) = DeathCause; - *(AActor**)(__int64(DeathInfo) + MemberOffsets::DeathInfo::FinisherOrDowner) = KillerPlayerState ? KillerPlayerState : DeadPlayerState; - - if (MemberOffsets::DeathInfo::DeathLocation != -1) - *(FVector*)(__int64(DeathInfo) + MemberOffsets::DeathInfo::DeathLocation) = DeathLocation; - - if (MemberOffsets::DeathInfo::DeathTags != -1) - *(FGameplayTagContainer*)(__int64(DeathInfo) + MemberOffsets::DeathInfo::DeathTags) = Tags; - - if (MemberOffsets::DeathInfo::bInitialized != -1) - *(bool*)(__int64(DeathInfo) + MemberOffsets::DeathInfo::bInitialized) = true; - - if (DeathCause == FallDamageEnumValue) - { - if (MemberOffsets::FortPlayerPawnAthena::LastFallDistance != -1) - *(float*)(__int64(DeathInfo) + MemberOffsets::DeathInfo::Distance) = DeadPawn->Get(MemberOffsets::FortPlayerPawnAthena::LastFallDistance); - } - else - { - if (MemberOffsets::DeathInfo::Distance != -1) - *(float*)(__int64(DeathInfo) + MemberOffsets::DeathInfo::Distance) = KillerPawn ? KillerPawn->GetDistanceTo(DeadPawn) : 0; - } - - if (MemberOffsets::FortPlayerState::PawnDeathLocation != -1) - DeadPlayerState->Get(MemberOffsets::FortPlayerState::PawnDeathLocation) = DeathLocation; - - static auto OnRep_DeathInfoFn = FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.OnRep_DeathInfo"); - - if (OnRep_DeathInfoFn) - { - DeadPlayerState->ProcessEvent(OnRep_DeathInfoFn); - } - - if (KillerPlayerState && KillerPlayerState != DeadPlayerState) - { - if (MemberOffsets::FortPlayerStateAthena::KillScore != -1) - KillerPlayerState->Get(MemberOffsets::FortPlayerStateAthena::KillScore)++; - - if (MemberOffsets::FortPlayerStateAthena::TeamKillScore != -1) - KillerPlayerState->Get(MemberOffsets::FortPlayerStateAthena::TeamKillScore)++; - - KillerPlayerState->ClientReportKill(DeadPlayerState); - - /* LoopMutators([&](AFortAthenaMutator* Mutator) { - if (auto TDM_Mutator = Cast(Mutator)) - { - struct - { - int EventId; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int EventParam1; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int EventParam2; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int EventParam3; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortAthenaMutator_TDM_OnMutatorGameplayEvent_Params{ 1, 0, 0, 0 }; - - static auto TDM_OnMutatorGameplayEventFn = FindObject("/Script/FortniteGame.FortAthenaMutator_TDM.OnMutatorGameplayEvent"); - TDM_Mutator->ProcessEvent(TDM_OnMutatorGameplayEventFn, &AFortAthenaMutator_TDM_OnMutatorGameplayEvent_Params); - } - }); */ - - // KillerPlayerState->OnRep_Kills(); - } - - // LOG_INFO(LogDev, "Reported kill."); - - if (AmountOfHealthSiphon != 0) - { - if (KillerPawn && KillerPawn != DeadPawn) - { - float Health = KillerPawn->GetHealth(); - float Shield = KillerPawn->GetShield(); - - int MaxHealth = 100; - int MaxShield = 100; - int AmountGiven = 0; - /* - int ShieldGiven = 0; - int HealthGiven = 0; - */ - - if ((MaxHealth - Health) > 0) - { - int AmountToGive = MaxHealth - Health >= AmountOfHealthSiphon ? AmountOfHealthSiphon : MaxHealth - Health; - KillerPawn->SetHealth(Health + AmountToGive); - AmountGiven += AmountToGive; - } - - if ((MaxShield - Shield) > 0 && AmountGiven < AmountOfHealthSiphon) - { - int AmountToGive = MaxShield - Shield >= AmountOfHealthSiphon ? AmountOfHealthSiphon : MaxShield - Shield; - AmountToGive -= AmountGiven; - - if (AmountToGive > 0) - { - KillerPawn->SetShield(Shield + AmountToGive); - AmountGiven += AmountToGive; - } - } - - if (AmountGiven > 0) - { - - } - } - } - } - - bool bIsRespawningAllowed = GameState->IsRespawningAllowed(DeadPlayerState); - - if (!bIsRespawningAllowed) - { - bool bDropInventory = true; - - LoopMutators([&](AFortAthenaMutator* Mutator) - { - if (auto FortAthenaMutator_InventoryOverride = Cast(Mutator)) - { - if (FortAthenaMutator_InventoryOverride->GetDropAllItemsOverride(DeadPlayerState->GetTeamIndex()) == EAthenaLootDropOverride::ForceKeep) - { - bDropInventory = false; - } - } - } - ); - - if (bDropInventory) - { - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (WorldInventory) - { - auto& ItemInstances = WorldInventory->GetItemList().GetItemInstances(); - - std::vector> GuidAndCountsToRemove; - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.at(i); - - // LOG_INFO(LogDev, "[{}/{}] CurrentItemInstance {}", i, ItemInstances.Num(), __int64(ItemInstance)); - - if (!ItemInstance) - continue; - - auto ItemEntry = ItemInstance->GetItemEntry(); - auto WorldItemDefinition = Cast(ItemEntry->GetItemDefinition()); - - // LOG_INFO(LogDev, "[{}/{}] WorldItemDefinition {}", i, ItemInstances.Num(), WorldItemDefinition ? WorldItemDefinition->GetFullName() : "InvalidObject"); - - if (!WorldItemDefinition) - continue; - - auto ShouldBeDropped = WorldItemDefinition->CanBeDropped(); // WorldItemDefinition->ShouldDropOnDeath(); - - // LOG_INFO(LogDev, "[{}/{}] ShouldBeDropped {}", i, ItemInstances.Num(), ShouldBeDropped); - - if (!ShouldBeDropped) - continue; - - PickupCreateData CreateData; - CreateData.ItemEntry = ItemEntry; - CreateData.SourceType = EFortPickupSourceTypeFlag::GetPlayerValue(); - CreateData.Source = EFortPickupSpawnSource::GetPlayerEliminationValue(); - CreateData.SpawnLocation = DeathLocation; - - AFortPickup::SpawnPickup(CreateData); - - GuidAndCountsToRemove.push_back({ ItemEntry->GetItemGuid(), ItemEntry->GetCount() }); - // WorldInventory->RemoveItem(ItemEntry->GetItemGuid(), nullptr, ItemEntry->GetCount()); - } - - for (auto& Pair : GuidAndCountsToRemove) - { - WorldInventory->RemoveItem(Pair.first, nullptr, Pair.second, true); - } - - WorldInventory->Update(); - } - } - - auto GameMode = Cast(GetWorld()->GetGameMode()); - - LOG_INFO(LogDev, "PlayersLeft: {} IsDBNO: {}", GameState->GetPlayersLeft(), DeadPawn->IsDBNO()); - - if (!DeadPawn->IsDBNO()) - { - if (bHandleDeath) - { - if (Fortnite_Version > 1.8 || Fortnite_Version == 1.11) - { - static void (*RemoveFromAlivePlayers)(AFortGameModeAthena * GameMode, AFortPlayerController * PlayerController, APlayerState * PlayerState, APawn * FinisherPawn, - UFortWeaponItemDefinition * FinishingWeapon, uint8_t DeathCause, char a7) - = decltype(RemoveFromAlivePlayers)(Addresses::RemoveFromAlivePlayers); - - AActor* DamageCauser = *(AActor**)(__int64(DeathReport) + MemberOffsets::DeathReport::DamageCauser); - UFortWeaponItemDefinition* KillerWeaponDef = nullptr; - - static auto FortProjectileBaseClass = FindObject(L"/Script/FortniteGame.FortProjectileBase"); - - if (DamageCauser) - { - if (DamageCauser->IsA(FortProjectileBaseClass)) - { - auto Owner = Cast(DamageCauser->GetOwner()); - KillerWeaponDef = Owner->IsValidLowLevel() ? Owner->GetWeaponData() : nullptr; // I just added the IsValidLowLevel check because what if the weapon destroys (idk)? - } - if (auto Weapon = Cast(DamageCauser)) - { - KillerWeaponDef = Weapon->GetWeaponData(); - } - } - - RemoveFromAlivePlayers(GameMode, PlayerController, KillerPlayerState == DeadPlayerState ? nullptr : KillerPlayerState, KillerPawn, KillerWeaponDef, DeathCause, 0); - - /* - - STATS: - - Note: This isn't the exact order relative to other functions. - - ClientSendMatchStatsForPlayer - ClientSendTeamStatsForPlayer - ClientSendEndBattleRoyaleMatchForPlayer - - */ - - // FAthenaMatchStats.Stats[ERewardSource] // hmm - - /* - - // We need to check if their entire team is dead then I think we send it???? - - auto DeadControllerAthena = Cast(PlayerController); - - if (DeadControllerAthena && FAthenaMatchTeamStats::GetStruct()) - { - auto MatchReport = DeadControllerAthena->GetMatchReport(); - - LOG_INFO(LogDev, "MatchReport: {}", __int64(MatchReport)); - - if (MatchReport) - { - MatchReport->GetTeamStats()->GetPlace() = DeadPlayerState->GetPlace(); - MatchReport->GetTeamStats()->GetTotalPlayers() = AmountOfPlayersWhenBusStart; // hmm - MatchReport->HasTeamStats() = true; - - DeadControllerAthena->ClientSendTeamStatsForPlayer(MatchReport->GetTeamStats()); - } - } - - */ - - LOG_INFO(LogDev, "Removed!"); - } - - // LOG_INFO(LogDev, "KillerPlayerState->Place: {}", KillerPlayerState ? KillerPlayerState->GetPlace() : -1); - } - - if (Fortnite_Version < 6) // Spectating (is this the actual build or is it like 6.10 when they added it auto). - { - static auto bAllowSpectateAfterDeathOffset = GameMode->GetOffset("bAllowSpectateAfterDeath"); - - bool bAllowSpectate = GameMode->Get(bAllowSpectateAfterDeathOffset); - - LOG_INFO(LogDev, "bAllowSpectate: {}", bAllowSpectate); - - if (bAllowSpectate) - { - LOG_INFO(LogDev, "Starting Spectating!"); - - static auto PlayerToSpectateOnDeathOffset = PlayerController->GetOffset("PlayerToSpectateOnDeath"); - PlayerController->Get(PlayerToSpectateOnDeathOffset) = KillerPawn; - - CreateThread(0, 0, SpectateThread, (LPVOID)PlayerController, 0, 0); - } - } - } - - if (IsRestartingSupported() && Globals::bAutoRestart && !bIsInAutoRestart) - { - // wtf - - if (GameState->GetGamePhase() > EAthenaGamePhase::Warmup) - { - auto AllPlayerStates = UGameplayStatics::GetAllActorsOfClass(GetWorld(), AFortPlayerStateAthena::StaticClass()); - - bool bDidSomeoneWin = AllPlayerStates.Num() == 0; - - for (int i = 0; i < AllPlayerStates.Num(); ++i) - { - auto CurrentPlayerState = (AFortPlayerStateAthena*)AllPlayerStates.at(i); - - if (CurrentPlayerState->GetPlace() <= 1) - { - bDidSomeoneWin = true; - break; - } - } - - // LOG_INFO(LogDev, "bDidSomeoneWin: {}", bDidSomeoneWin); - - // if (GameState->GetGamePhase() == EAthenaGamePhase::EndGame) - if (bDidSomeoneWin) - { - CreateThread(0, 0, RestartThread, 0, 0, 0); - } - } - } - } - - if (DeadPlayerState->IsBot()) - { - // AllPlayerBotsToTick.remov3lbah - } - - DeadPlayerState->EndDBNOAbilities(); - - return ClientOnPawnDiedOriginal(PlayerController, DeathReport); -} - -void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit) -{ - if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced()) // We need more checks. - return; - - auto Pawn = PlayerController->GetMyFortPawn(); - - if (!Pawn) - return; - - auto PlayerState = PlayerController->GetPlayerState(); - - if (!PlayerState) - return; - - BuildingActorToEdit->SetEditingPlayer(PlayerState); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - static auto EditToolDef = FindObject(L"/Game/Items/Weapons/BuildingTools/EditTool.EditTool"); - - auto EditToolInstance = WorldInventory->FindItemInstance(EditToolDef); - - if (!EditToolInstance) - return; - - Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); - - auto EditTool = Cast(Pawn->GetCurrentWeapon()); - - if (!EditTool) - return; - - EditTool->GetEditActor() = BuildingActorToEdit; - EditTool->OnRep_EditActor(); -} - -void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame& Stack, void* Ret) -{ - auto PlayerController = (AFortPlayerController*)Context; - - auto PlayerState = (AFortPlayerState*)PlayerController->GetPlayerState(); - - auto Params = Stack.Locals; - - static auto RotationIterationsOffset = FindOffsetStruct("/Script/FortniteGame.FortPlayerController.ServerEditBuildingActor", "RotationIterations"); - static auto NewBuildingClassOffset = FindOffsetStruct("/Script/FortniteGame.FortPlayerController.ServerEditBuildingActor", "NewBuildingClass"); - static auto BuildingActorToEditOffset = FindOffsetStruct("/Script/FortniteGame.FortPlayerController.ServerEditBuildingActor", "BuildingActorToEdit"); - static auto bMirroredOffset = FindOffsetStruct("/Script/FortniteGame.FortPlayerController.ServerEditBuildingActor", "bMirrored"); - - auto BuildingActorToEdit = *(ABuildingSMActor**)(__int64(Params) + BuildingActorToEditOffset); - auto NewBuildingClass = *(UClass**)(__int64(Params) + NewBuildingClassOffset); - int RotationIterations = Fortnite_Version < 8.30 ? *(int*)(__int64(Params) + RotationIterationsOffset) : (int)(*(uint8*)(__int64(Params) + RotationIterationsOffset)); - auto bMirrored = *(char*)(__int64(Params) + bMirroredOffset); - - // LOG_INFO(LogDev, "RotationIterations: {}", RotationIterations); - - if (!BuildingActorToEdit || !NewBuildingClass || BuildingActorToEdit->IsDestroyed() || BuildingActorToEdit->GetEditingPlayer() != PlayerState) - { - // LOG_INFO(LogDev, "Cheater?"); - // LOG_INFO(LogDev, "BuildingActorToEdit->GetEditingPlayer(): {} PlayerState: {} NewBuildingClass: {} BuildingActorToEdit: {}", BuildingActorToEdit ? __int64(BuildingActorToEdit->GetEditingPlayer()) : -1, __int64(PlayerState), __int64(NewBuildingClass), __int64(BuildingActorToEdit)); - return ServerEditBuildingActorOriginal(Context, Stack, Ret); - } - - // if (!PlayerState || PlayerState->GetTeamIndex() != BuildingActorToEdit->GetTeamIndex()) - //return ServerEditBuildingActorOriginal(Context, Frame, Ret); - - BuildingActorToEdit->SetEditingPlayer(nullptr); - - static ABuildingSMActor* (*BuildingSMActorReplaceBuildingActor)(ABuildingSMActor*, __int64, UClass*, int, int, uint8_t, AFortPlayerController*) = - decltype(BuildingSMActorReplaceBuildingActor)(Addresses::ReplaceBuildingActor); - - if (auto BuildingActor = BuildingSMActorReplaceBuildingActor(BuildingActorToEdit, 1, NewBuildingClass, - BuildingActorToEdit->GetCurrentBuildingLevel(), RotationIterations, bMirrored, PlayerController)) - { - BuildingActor->SetPlayerPlaced(true); - } - - // we should do more things here - - return ServerEditBuildingActorOriginal(Context, Stack, Ret); -} - -void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToStopEditing) -{ - auto Pawn = PlayerController->GetMyFortPawn(); - - if (!BuildingActorToStopEditing || !Pawn - || BuildingActorToStopEditing->GetEditingPlayer() != PlayerController->GetPlayerState() - || BuildingActorToStopEditing->IsDestroyed()) - return; - - BuildingActorToStopEditing->SetEditingPlayer(nullptr); - - static auto EditToolDef = FindObject(L"/Game/Items/Weapons/BuildingTools/EditTool.EditTool"); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - auto EditToolInstance = WorldInventory->FindItemInstance(EditToolDef); - - if (!EditToolInstance) - return; - - Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); - - auto EditTool = Cast(Pawn->GetCurrentWeapon()); - - BuildingActorToStopEditing->GetEditingPlayer() = nullptr; - // BuildingActorToStopEditing->OnRep_EditingPlayer(); - - if (EditTool) - { - EditTool->GetEditActor() = nullptr; - EditTool->OnRep_EditActor(); - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerController.h b/dependencies/reboot/Project Reboot 3.0/FortPlayerController.h deleted file mode 100644 index 9458e0c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerController.h +++ /dev/null @@ -1,172 +0,0 @@ -#pragma once - -#include "PlayerController.h" -#include "FortInventory.h" -#include "FortPawn.h" - -#include "Rotator.h" -#include "BuildingSMActor.h" -#include "Stack.h" - -struct FFortAthenaLoadout -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.FortAthenaLoadout"); - return Struct; - } - - static int GetStructSize() - { - return GetStruct()->GetPropertiesSize(); - } - - UObject*& GetCharacter() - { - static auto CharacterOffset = FindOffsetStruct("/Script/FortniteGame.FortAthenaLoadout", "Character"); - return *(UObject**)(__int64(this) + CharacterOffset); - } - - UObject*& GetBackpack() - { - static auto BackpackOffset = FindOffsetStruct("/Script/FortniteGame.FortAthenaLoadout", "Backpack"); - return *(UObject**)(__int64(this) + BackpackOffset); - } - - UObject*& GetPickaxe() - { - static auto PickaxeOffset = FindOffsetStruct("/Script/FortniteGame.FortAthenaLoadout", "Pickaxe"); - return *(UObject**)(__int64(this) + PickaxeOffset); - } -}; - -class AFortPlayerController : public APlayerController -{ -public: - static inline void (*ClientOnPawnDiedOriginal)(AFortPlayerController* PlayerController, void* DeathReport); - static inline void (*ServerCreateBuildingActorOriginal)(UObject* Context, FFrame* Stack, void* Ret); - static inline void (*ServerAttemptInteractOriginal)(UObject* Context, FFrame* Stack, void* Ret); - static inline void (*ServerEditBuildingActorOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*DropSpecificItemOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline AActor* (*SpawnToyInstanceOriginal)(UObject* Context, FFrame* Stack, AActor** Ret); - static inline void (*ServerLoadingScreenDroppedOriginal)(UObject* Context, FFrame* Stack, void* Ret); - static inline void (*ServerAttemptAircraftJumpOriginal)(AFortPlayerController* PC, FRotator ClientRotation); - - void ClientReportDamagedResourceBuilding(ABuildingSMActor* BuildingSMActor, EFortResourceType PotentialResourceType, int PotentialResourceCount, bool bDestroyed, bool bJustHitWeakspot); - - AFortInventory*& GetWorldInventory() - { - static auto WorldInventoryOffset = GetOffset("WorldInventory"); - return Get(WorldInventoryOffset); - } - - AFortPawn*& GetMyFortPawn() // AFortPlayerPawn - { - static auto MyFortPawnOffset = GetOffset("MyFortPawn"); - return Get(MyFortPawnOffset); - } - - int GetCosmeticLoadoutOffset() - { - static auto CosmeticLoadoutPCOffset = this->GetOffset("CosmeticLoadoutPC", false); - - if (CosmeticLoadoutPCOffset == -1) - CosmeticLoadoutPCOffset = this->GetOffset("CustomizationLoadout", false); - - if (CosmeticLoadoutPCOffset == -1) - return -1; - - return CosmeticLoadoutPCOffset; - } - - FFortAthenaLoadout* GetCosmeticLoadout() - { - static auto CosmeticLoadoutPCOffset = GetCosmeticLoadoutOffset(); - auto CosmeticLoadout = this->GetPtr(CosmeticLoadoutPCOffset); - - return CosmeticLoadout; - } - - UFortItem* AddPickaxeToInventory() - { - auto CosmeticLoadout = GetCosmeticLoadout(); - auto CosmeticLoadoutPickaxe = CosmeticLoadout ? CosmeticLoadout->GetPickaxe() : nullptr; - - static auto WeaponDefinitionOffset = FindOffsetStruct("/Script/FortniteGame.AthenaPickaxeItemDefinition", "WeaponDefinition"); - - auto PickaxeDefinition = CosmeticLoadoutPickaxe ? CosmeticLoadoutPickaxe->Get(WeaponDefinitionOffset) - : FindObject(L"/Game/Athena/Items/Weapons/WID_Harvest_Pickaxe_Athena_C_T01.WID_Harvest_Pickaxe_Athena_C_T01"); - - auto WorldInventory = GetWorldInventory(); - - if (!WorldInventory || WorldInventory->GetPickaxeInstance()) - return nullptr; - - auto NewAndModifiedInstances = WorldInventory->AddItem(PickaxeDefinition, nullptr); - WorldInventory->Update(); - - return NewAndModifiedInstances.first.size() > 0 ? NewAndModifiedInstances.first[0] : nullptr; - } - - TSet& GetGadgetTrackedAttributeItemInstanceIds() // actually in zone - { - static auto GadgetTrackedAttributeItemInstanceIdsOffset = GetOffset("GadgetTrackedAttributeItemInstanceIds"); - return Get>(GadgetTrackedAttributeItemInstanceIdsOffset); - } - - bool IsPlayingEmote() - { - static auto IsPlayingEmoteFn = FindObject("/Script/FortniteGame.FortPlayerController.IsPlayingEmote"); - bool Ret; - this->ProcessEvent(IsPlayingEmoteFn, &Ret); - return Ret; - } - - bool& ShouldTryPickupSwap() - { - static auto bTryPickupSwapOffset = GetOffset("bTryPickupSwap"); - return Get(bTryPickupSwapOffset); - } - - bool HasTryPickupSwap() - { - static auto bTryPickupSwapOffset = GetOffset("bTryPickupSwap", false); - return bTryPickupSwapOffset != -1; - } - - void ClientEquipItem(const FGuid& ItemGuid, bool bForceExecution); - - bool DoesBuildFree(); - void DropAllItems(const std::vector& IgnoreItemDefs, bool bIgnoreSecondaryQuickbar = false, bool bRemoveIfNotDroppable = false, bool RemovePickaxe = false); - void ApplyCosmeticLoadout(); - - static void ServerSuicideHook(AFortPlayerController* PlayerController); - - static void ServerLoadingScreenDroppedHook(UObject* Context, FFrame* Stack, void* Ret); - static void ServerRepairBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToRepair); - static void ServerExecuteInventoryItemHook(AFortPlayerController* PlayerController, FGuid ItemGuid); - static void ServerAttemptInteractHook(UObject* Context, FFrame* Stack, void* Ret); - - static void ServerAttemptAircraftJumpHook(AFortPlayerController* PC, FRotator ClientRotation); - // static void ServerCreateBuildingActorHook(AFortPlayerController* PlayerController, FCreateBuildingActorData CreateBuildingData); - static void ServerCreateBuildingActorHook(UObject* Context, FFrame* Stack, void* Ret); - static AActor* SpawnToyInstanceHook(UObject* Context, FFrame* Stack, AActor** Ret); - static void DropSpecificItemHook(UObject* Context, FFrame& Stack, void* Ret); - - static void ServerDropAllItemsHook(AFortPlayerController* PlayerController, UFortItemDefinition* IgnoreItemDef); - - static void ServerAttemptInventoryDropHook(AFortPlayerController* PlayerController, FGuid ItemGuid, int Count); - static void ServerPlayEmoteItemHook(AFortPlayerController* PlayerController, UObject* EmoteAsset); - static void ClientOnPawnDiedHook(AFortPlayerController* PlayerController, void* DeathReport); - - static void ServerBeginEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit); - // static void ServerEditBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit, UClass* NewBuildingClass, int RotationIterations, char bMirrored); - static void ServerEditBuildingActorHook(UObject* Context, FFrame& Stack, void* Ret); - static void ServerEndEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToStopEditing); - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortPlayerController"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerControllerAthena.cpp b/dependencies/reboot/Project Reboot 3.0/FortPlayerControllerAthena.cpp deleted file mode 100644 index 0022705..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerControllerAthena.cpp +++ /dev/null @@ -1,621 +0,0 @@ -#include "FortPlayerControllerAthena.h" -#include "FortPlayerPawn.h" -#include "FortKismetLibrary.h" - -#include "SoftObjectPtr.h" -#include "globals.h" -#include "GameplayStatics.h" -#include "hooking.h" -#include "FortAthenaMutator_GiveItemsAtGamePhaseStep.h" -#include "DataTableFunctionLibrary.h" -#include "AthenaResurrectionComponent.h" -#include "FortAthenaMutator_InventoryOverride.h" -#include "FortGadgetItemDefinition.h" -#include "gui.h" - -void AFortPlayerControllerAthena::StartGhostModeHook(UObject* Context, FFrame* Stack, void* Ret) -{ - LOG_INFO(LogDev, __FUNCTION__); - - auto PlayerController = (AFortPlayerControllerAthena*)Context; - - UFortWorldItemDefinition* ItemProvidingGhostMode = nullptr; - - Stack->StepCompiledIn(&ItemProvidingGhostMode); - - if (!ItemProvidingGhostMode) - { - LOG_INFO(LogDev, "Null item!"); - return StartGhostModeOriginal(Context, Stack, Ret); - } - - if (!PlayerController->HasAuthority()) // for real - return StartGhostModeOriginal(Context, Stack, Ret); - - LOG_INFO(LogDev, "Attempting to give item {}", ItemProvidingGhostMode->IsValidLowLevel() ? ItemProvidingGhostMode->GetFullName() : "BadRead"); - - auto GhostModeRepData = PlayerController->GetGhostModeRepData(); - - if (GhostModeRepData->IsInGhostMode()) - { - LOG_INFO(LogDev, "Player is already in ghost mode!"); - return StartGhostModeOriginal(Context, Stack, Ret); - } - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return StartGhostModeOriginal(Context, Stack, Ret); - - auto PickaxeInstance = WorldInventory->GetPickaxeInstance(); - - // LOG_INFO(LogDev, "PickaxeInstance: {}", __int64(PickaxeInstance)); - - if (PickaxeInstance) - { - WorldInventory->RemoveItem(PickaxeInstance->GetItemEntry()->GetItemGuid(), nullptr, REMOVE_ALL_ITEMS, true); - // WorldInventory->Update(); - } - - bool bShouldUpdate = false; - auto NewAndModifiedInstances = WorldInventory->AddItem(ItemProvidingGhostMode, &bShouldUpdate, 1); - auto GhostModeItemInstance = NewAndModifiedInstances.first[0]; - - if (!GhostModeItemInstance) - return StartGhostModeOriginal(Context, Stack, Ret); - - // if (bShouldUpdate) - WorldInventory->Update(); - - PlayerController->AddPickaxeToInventory(); - WorldInventory->Update(); - - PlayerController->ServerExecuteInventoryItemHook(PlayerController, GhostModeItemInstance->GetItemEntry()->GetItemGuid()); - PlayerController->ClientEquipItem(GhostModeItemInstance->GetItemEntry()->GetItemGuid(), true); - LOG_INFO(LogDev, "Finished!"); - - return StartGhostModeOriginal(Context, Stack, Ret); -} - -void AFortPlayerControllerAthena::EndGhostModeHook(AFortPlayerControllerAthena* PlayerController) -{ - // I believe there are a lot of other places we should remove it (go to XREFs of K2_RemoveItemFromPlayer on a version like 6.21, and there will be something checking ghost stuff). - - LOG_INFO(LogDev, __FUNCTION__); - - if (!PlayerController->HasAuthority()) // for real - return EndGhostModeOriginal(PlayerController); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return EndGhostModeOriginal(PlayerController); - - FGhostModeRepData* GhostModeRepData = PlayerController->GetGhostModeRepData(); - UFortWorldItemDefinition* GhostModeItemDef = GhostModeRepData->GetGhostModeItemDef(); - - LOG_INFO(LogDev, "GhostModeItemDef: {}", GhostModeItemDef->IsValidLowLevel() ? GhostModeItemDef->GetFullName() : "BadRead"); - - if (!GhostModeItemDef) // bro IDFK - { - GhostModeItemDef = FindObject("/Game/Athena/Items/Gameplay/SpookyMist/AGID_SpookyMist.AGID_SpookyMist"); - } - - if (!GhostModeItemDef) - return EndGhostModeOriginal(PlayerController); - - auto GhostModeItemInstance = WorldInventory->FindItemInstance(GhostModeItemDef); - - LOG_INFO(LogDev, "GhostModeItemInstance: {}", GhostModeItemInstance->IsValidLowLevel() ? GhostModeItemInstance->GetFullName() : "BadRead"); - - if (!GhostModeItemInstance) - return EndGhostModeOriginal(PlayerController); - - auto PickaxeInstance = PlayerController->AddPickaxeToInventory(); - - WorldInventory->ForceNetUpdate(); - PlayerController->ForceNetUpdate(); - - bool bShouldUpdate = false; - int Count = GhostModeItemInstance->GetItemEntry()->GetCount(); // 1 - bool bForceRemoval = true; // false - WorldInventory->RemoveItem(GhostModeItemInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, Count, bForceRemoval); - - // if (bShouldUpdate) - WorldInventory->Update(); - - if (PickaxeInstance) - { - PlayerController->ClientEquipItem(PickaxeInstance->GetItemEntry()->GetItemGuid(), true); - } - - return EndGhostModeOriginal(PlayerController); -} - -void AFortPlayerControllerAthena::EnterAircraftHook(UObject* PC, AActor* Aircraft) -{ - auto PlayerController = Cast(Engine_Version < 424 ? PC : ((UActorComponent*)PC)->GetOwner()); - - if (!PlayerController) - return; - - // LOG_INFO(LogDev, "EnterAircraftHook"); - - EnterAircraftOriginal(PC, Aircraft); - - // TODO Check if the player successfully got in the aircraft. - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - std::vector> GuidAndCountsToRemove; - - auto& InventoryList = WorldInventory->GetItemList(); - - auto& ItemInstances = InventoryList.GetItemInstances(); - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemEntry = ItemInstances.at(i)->GetItemEntry(); - auto ItemDefinition = Cast(ItemEntry->GetItemDefinition()); - - if (!ItemDefinition) - continue; - - if (!ItemDefinition->CanBeDropped()) - continue; - - GuidAndCountsToRemove.push_back({ ItemEntry->GetItemGuid(), ItemEntry->GetCount() }); - } - - for (auto& Pair : GuidAndCountsToRemove) - { - WorldInventory->RemoveItem(Pair.first, nullptr, Pair.second, true); - } - - std::vector> FunctionsToCall; - LoopMutators([&](AFortAthenaMutator* Mutator) { FunctionsToCall.push_back(std::make_pair(Mutator, Mutator->FindFunction("OnGamePhaseStepChanged"))); }); - - auto HandleGiveItemsAtGamePhaseStepMutator = [&](AFortAthenaMutator* Mutator) { - if (auto GiveItemsAtGamePhaseStepMutator = Cast(Mutator)) - { - auto PhaseToGive = GiveItemsAtGamePhaseStepMutator->GetPhaseToGiveItems(); - auto& ItemsToGive = GiveItemsAtGamePhaseStepMutator->GetItemsToGive(); - - LOG_INFO(LogDev, "PhaseToGiveItems: {} ItemsToGive.Num(): {}", (int)PhaseToGive, ItemsToGive.Num()); - - if (PhaseToGive <= 5) // Flying or lower - { - for (int j = 0; j < ItemsToGive.Num(); j++) - { - auto ItemToGive = ItemsToGive.AtPtr(j, FItemsToGive::GetStructSize()); - - if (!ItemToGive->GetItemToDrop()) - continue; - - float Out2 = 0; - - if (!IsBadReadPtr(ItemToGive->GetNumberToGive().GetCurve().CurveTable, 8) && ItemToGive->GetNumberToGive().GetCurve().RowName.IsValid()) - { - Out2 = UDataTableFunctionLibrary::EvaluateCurveTableRow(ItemToGive->GetNumberToGive().GetCurve().CurveTable, ItemToGive->GetNumberToGive().GetCurve().RowName, 0.f); - } - - LOG_INFO(LogDev, "[{}] Out2: {} ItemToGive.ItemToDrop: {}", j, Out2, ItemToGive->GetItemToDrop()->IsValidLowLevel() ? ItemToGive->GetItemToDrop()->GetFullName() : "BadRead"); - - if (!Out2) // ? - continue; - - WorldInventory->AddItem(ItemToGive->GetItemToDrop(), nullptr, Out2); - } - } - } - }; - - LoopMutators(HandleGiveItemsAtGamePhaseStepMutator); - - /* if (auto GGMutator = Cast(Mutator)) - { - auto& WeaponEntries = GGMutator->GetWeaponEntries(); - - LOG_INFO(LogDev, "[{}] WeaponEntries.Num(): {}", i, WeaponEntries.Num()); - - for (int j = 0; j < WeaponEntries.Num(); j++) - { - WorldInventory->AddItem(WeaponEntries.at(j).Weapon, nullptr, 1); - } - } */ - - auto PlayerStateAthena = Cast(PlayerController->GetPlayerState()); - - auto AddInventoryOverrideTeamLoadouts = [&](AFortAthenaMutator* Mutator) - { - if (auto InventoryOverride = Cast(Mutator)) - { - auto TeamIndex = PlayerStateAthena->GetTeamIndex(); - auto LoadoutTeam = InventoryOverride->GetLoadoutTeamForTeamIndex(TeamIndex); - - if (LoadoutTeam.UpdateOverrideType == EAthenaInventorySpawnOverride::AircraftPhaseOnly) - { - auto LoadoutContainer = InventoryOverride->GetLoadoutContainerForTeamIndex(TeamIndex); - - for (int i = 0; i < LoadoutContainer.Loadout.Num(); ++i) - { - auto& ItemAndCount = LoadoutContainer.Loadout.at(i); - WorldInventory->AddItem(ItemAndCount.GetItem(), nullptr, ItemAndCount.GetCount()); - } - } - } - }; - - LoopMutators(AddInventoryOverrideTeamLoadouts); - - WorldInventory->Update(); - - // Should we equip the pickaxe for older builds here? - - if (Fortnite_Version < 2.5) // idk - { - /* auto PickaxeInstance = WorldInventory->GetPickaxeInstance(); - - if (!PickaxeInstance) - return; - - AFortPlayerController::ServerExecuteInventoryItemHook(PlayerController, PickaxeInstance->GetItemEntry()->GetItemGuid()); */ - } -} - -void AFortPlayerControllerAthena::ServerRequestSeatChangeHook(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex) -{ - auto Pawn = Cast(PlayerController->GetPawn()); - - if (!Pawn) - return ServerRequestSeatChangeOriginal(PlayerController, TargetSeatIndex); - - auto Vehicle = Pawn->GetVehicle(); - - if (!Vehicle) - return ServerRequestSeatChangeOriginal(PlayerController, TargetSeatIndex); - - auto OldVehicleWeaponDefinition = Pawn->GetVehicleWeaponDefinition(Vehicle); - - LOG_INFO(LogDev, "OldVehicleWeaponDefinition: {}", OldVehicleWeaponDefinition ? OldVehicleWeaponDefinition->GetFullName() : "BadRead"); - - if (!OldVehicleWeaponDefinition) - return ServerRequestSeatChangeOriginal(PlayerController, TargetSeatIndex); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return ServerRequestSeatChangeOriginal(PlayerController, TargetSeatIndex); - - auto OldVehicleWeaponInstance = WorldInventory->FindItemInstance(OldVehicleWeaponDefinition); - - if (OldVehicleWeaponInstance) - { - bool bShouldUpdate = false; - WorldInventory->RemoveItem(OldVehicleWeaponInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, OldVehicleWeaponInstance->GetItemEntry()->GetCount(), true); - - if (bShouldUpdate) - WorldInventory->Update(); - } - - auto RequestingVehicleWeaponDefinition = Vehicle->GetVehicleWeaponForSeat(TargetSeatIndex); - - if (!RequestingVehicleWeaponDefinition) - { - auto PickaxeInstance = WorldInventory->GetPickaxeInstance(); - - if (!PickaxeInstance) - return ServerRequestSeatChangeOriginal(PlayerController, TargetSeatIndex); - - AFortPlayerController::ServerExecuteInventoryItemHook(PlayerController, PickaxeInstance->GetItemEntry()->GetItemGuid()); // Bad, we should equip the last weapon. - return ServerRequestSeatChangeOriginal(PlayerController, TargetSeatIndex); - } - - auto NewAndModifiedInstances = WorldInventory->AddItem(RequestingVehicleWeaponDefinition, nullptr); - auto RequestedVehicleInstance = NewAndModifiedInstances.first[0]; - - if (!RequestedVehicleInstance) - return ServerRequestSeatChangeOriginal(PlayerController, TargetSeatIndex); - - WorldInventory->Update(); - - auto RequestedVehicleWeapon = Pawn->EquipWeaponDefinition(RequestingVehicleWeaponDefinition, RequestedVehicleInstance->GetItemEntry()->GetItemGuid()); - - return ServerRequestSeatChangeOriginal(PlayerController, TargetSeatIndex); -} - -void AFortPlayerControllerAthena::ServerRestartPlayerHook(AFortPlayerControllerAthena* Controller) -{ - static auto FortPlayerControllerZoneDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerZone"); - static auto ServerRestartPlayerFn = FindObject(L"/Script/Engine.PlayerController.ServerRestartPlayer"); - static auto ZoneServerRestartPlayer = __int64(FortPlayerControllerZoneDefault->VFTable[GetFunctionIdxOrPtr(ServerRestartPlayerFn) / 8]); - static void (*ZoneServerRestartPlayerOriginal)(AFortPlayerController*) = decltype(ZoneServerRestartPlayerOriginal)(__int64(ZoneServerRestartPlayer)); - - LOG_INFO(LogDev, "ServerRestartPlayerHook Call 0x{:x} returning with 0x{:x}!", ZoneServerRestartPlayer - __int64(_ReturnAddress()), __int64(ZoneServerRestartPlayerOriginal) - __int64(GetModuleHandleW(0))); - return ZoneServerRestartPlayerOriginal(Controller); -} - -void AFortPlayerControllerAthena::ServerGiveCreativeItemHook(AFortPlayerControllerAthena* Controller, FFortItemEntry CreativeItem) -{ - // Don't worry, the validate has a check if it is a creative enabled mode or not, but we need to add a volume check and permission check I think. - - auto CreativeItemPtr = &CreativeItem; - auto ItemDefinition = CreativeItemPtr->GetItemDefinition(); - - if (!ItemDefinition) - return; - - bool bShouldUpdate = false; - auto LoadedAmmo = -1; // CreativeItemPtr->GetLoadedAmmo() - Controller->GetWorldInventory()->AddItem(ItemDefinition, &bShouldUpdate, CreativeItemPtr->GetCount(), LoadedAmmo, false); - - if (bShouldUpdate) - Controller->GetWorldInventory()->Update(Controller); -} - -void AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook(AFortPlayerControllerAthena* Controller) -{ - LOG_INFO(LogDev, "ServerTeleportToPlaygroundLobbyIslandHook!"); - - auto Pawn = Controller->GetMyFortPawn(); - - if (!Pawn) - return; - - // TODO IsTeleportToCreativeHubAllowed - - static auto FortPlayerStartCreativeClass = FindObject(L"/Script/FortniteGame.FortPlayerStartCreative"); - auto AllCreativePlayerStarts = UGameplayStatics::GetAllActorsOfClass(GetWorld(), FortPlayerStartCreativeClass); - - for (int i = 0; i < AllCreativePlayerStarts.Num(); ++i) - { - auto CurrentPlayerStart = AllCreativePlayerStarts.at(i); - - static auto PlayerStartTagsOffset = CurrentPlayerStart->GetOffset("PlayerStartTags"); - auto bHasSpawnTag = CurrentPlayerStart->Get(PlayerStartTagsOffset).Contains("Playground.LobbyIsland.Spawn"); - - if (!bHasSpawnTag) - continue; - - Pawn->TeleportTo(CurrentPlayerStart->GetActorLocation(), Pawn->GetActorRotation()); - break; - } - - AllCreativePlayerStarts.Free(); -} - -void AFortPlayerControllerAthena::ServerAcknowledgePossessionHook(APlayerController* Controller, APawn* Pawn) -{ - static auto AcknowledgedPawnOffset = Controller->GetOffset("AcknowledgedPawn"); - - const APawn* OldAcknowledgedPawn = Controller->Get(AcknowledgedPawnOffset); - Controller->Get(AcknowledgedPawnOffset) = Pawn; - - auto ControllerAsFort = Cast(Controller); - auto PawnAsFort = Cast(Pawn); - auto PlayerStateAsFort = Cast(Pawn->GetPlayerState()); - - if (!PawnAsFort) - return; - - if (OldAcknowledgedPawn != PawnAsFort) - { - PawnAsFort->SetShield(StartingShield); - } - - if (Globals::bNoMCP) - { - static auto CustomCharacterPartClass = FindObject("/Script/FortniteGame.CustomCharacterPart"); - static auto backpackPart = LoadObject("/Game/Characters/CharacterParts/Backpacks/NoBackpack.NoBackpack", CustomCharacterPartClass); - - // PawnAsFort->ServerChoosePart(EFortCustomPartType::Backpack, backpackPart); - - return; - } - - ControllerAsFort->ApplyCosmeticLoadout(); -} - -void AFortPlayerControllerAthena::ServerPlaySquadQuickChatMessageHook(AFortPlayerControllerAthena* PlayerController, __int64 ChatEntry, __int64 SenderID) -{ - using UAthenaEmojiItemDefinition = UFortItemDefinition; - - auto PlayerStateAthena = Cast(PlayerController->GetPlayerState()); - - if (!PlayerStateAthena) - return; - - static auto IndexOffset = FindOffsetStruct("/Script/FortniteGame.AthenaQuickChatActiveEntry", "Index"); - auto Index = *(int8*)(__int64(ChatEntry) + IndexOffset); - - LOG_INFO(LogDev, "Index: {}", (int)Index); - - uint8 NewTeamMemberState = 0; - - switch (Index) - { - case 0: - NewTeamMemberState = 8; - break; - case 1: - NewTeamMemberState = 9; - break; - case 2: - NewTeamMemberState = 11; - break; - case 3: - NewTeamMemberState = 10; - break; - case 4: - NewTeamMemberState = 12; - break; - case 5: - NewTeamMemberState = 3; - break; - case 6: - NewTeamMemberState = 4; - break; - case 7: - NewTeamMemberState = 2; - break; - case 8: - NewTeamMemberState = 5; - break; - case 9: - NewTeamMemberState = 6; - break; - default: - break; - } - - NewTeamMemberState -= AmountToSubtractIndex; - - PlayerStateAthena->Get("ReplicatedTeamMemberState") = NewTeamMemberState; - PlayerStateAthena->Get("TeamMemberState") = NewTeamMemberState; // pretty sure unneeded - - static auto EmojiComm = FindObject(L"/Game/Athena/Items/Cosmetics/Dances/Emoji/Emoji_Comm.Emoji_Comm"); - PlayerController->ServerPlayEmoteItemHook(PlayerController, EmojiComm); - - static auto OnRep_ReplicatedTeamMemberStateFn = FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.OnRep_ReplicatedTeamMemberState"); - PlayerStateAthena->ProcessEvent(OnRep_ReplicatedTeamMemberStateFn); -} - -void AFortPlayerControllerAthena::GetPlayerViewPointHook(AFortPlayerControllerAthena* PlayerController, FVector& Location, FRotator& Rotation) -{ - // I don't know why but GetActorEyesViewPoint only works on some versions. - /* static auto GetActorEyesViewPointFn = FindObject(L"/Script/Engine.Actor.GetActorEyesViewPoint"); - static auto GetActorEyesViewPointIndex = GetFunctionIdxOrPtr(GetActorEyesViewPointFn) / 8; - - void (*GetActorEyesViewPointOriginal)(AActor* Actor, FVector* OutLocation, FRotator* OutRotation) = decltype(GetActorEyesViewPointOriginal)(PlayerController->VFTable[GetActorEyesViewPointIndex]); - return GetActorEyesViewPointOriginal(PlayerController, &Location, &Rotation); */ - - if (auto MyFortPawn = PlayerController->GetMyFortPawn()) - { - Location = MyFortPawn->GetActorLocation(); - Rotation = PlayerController->GetControlRotation(); - return; - } - - return AFortPlayerControllerAthena::GetPlayerViewPointOriginal(PlayerController, Location, Rotation); -} - -void AFortPlayerControllerAthena::ServerReadyToStartMatchHook(AFortPlayerControllerAthena* PlayerController) -{ - LOG_INFO(LogDev, "ServerReadyToStartMatch!"); - - if (Fortnite_Version <= 2.5) // techinally we should do this at the end of OnReadyToStartMatch - { - static auto QuickBarsOffset = PlayerController->GetOffset("QuickBars", false); - - if (QuickBarsOffset != -1) - { - auto& QuickBars = PlayerController->Get(QuickBarsOffset); - - // LOG_INFO(LogDev, "QuickBarsOld: {}", __int64(QuickBars)); - - if (QuickBars) - return ServerReadyToStartMatchOriginal(PlayerController); - - static auto FortQuickBarsClass = FindObject("/Script/FortniteGame.FortQuickBars"); - - QuickBars = GetWorld()->SpawnActor(FortQuickBarsClass); - - // LOG_INFO(LogDev, "QuickBarsNew: {}", __int64(QuickBars)); - - if (!QuickBars) - return ServerReadyToStartMatchOriginal(PlayerController); - - PlayerController->Get(QuickBarsOffset)->SetOwner(PlayerController); - } - } - - return ServerReadyToStartMatchOriginal(PlayerController); -} - - -void AFortPlayerControllerAthena::UpdateTrackedAttributesHook(AFortPlayerControllerAthena* PlayerController) -{ - LOG_INFO(LogDev, "UpdateTrackedAttributesHook Return: 0x{:x}", __int64(_ReturnAddress()) - __int64(GetModuleHandleW(0))); - - // IDK IF GADGET IS A PARAM OR WHAT - - auto PlayerState = Cast(PlayerController->GetPlayerState()); // really we only need zone - - if (!PlayerState) - return; - - auto ASC = PlayerState->GetAbilitySystemComponent(); - - if (!ASC) - return; - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - auto& ItemInstances = WorldInventory->GetItemList().GetItemInstances(); - - std::vector ItemInstancesToRemove; - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.at(i); - auto GadgetItemDefinition = Cast(ItemInstance->GetItemEntry()->GetItemDefinition()); - - if (!GadgetItemDefinition) - continue; - - if (!GadgetItemDefinition->ShouldDestroyGadgetWhenTrackedAttributesIsZero()) - continue; - - bool bIsTrackedAttributesZero = true; - - for (int i = 0; i < GadgetItemDefinition->GetTrackedAttributes().Num(); ++i) - { - auto& CurrentTrackedAttribute = GadgetItemDefinition->GetTrackedAttributes().at(i); - - int CurrentAttributeValue = -1; - - for (int i = 0; i < ASC->GetSpawnedAttributes().Num(); ++i) - { - auto CurrentSpawnedAttribute = ASC->GetSpawnedAttributes().at(i); - - if (CurrentSpawnedAttribute->IsA(CurrentTrackedAttribute.AttributeOwner)) - { - auto PropertyOffset = CurrentSpawnedAttribute->GetOffset(CurrentTrackedAttribute.GetAttributePropertyName()); - - if (PropertyOffset != -1) - { - if (CurrentSpawnedAttribute->GetPtr(PropertyOffset)->GetCurrentValue() > 0) - { - bIsTrackedAttributesZero = false; - break; // hm - } - } - } - } - } - - if (bIsTrackedAttributesZero) - { - ItemInstancesToRemove.push_back(ItemInstance); - } - } - - for (auto ItemInstanceToRemove : ItemInstancesToRemove) - { - auto GadgetItemDefinition = Cast(ItemInstanceToRemove->GetItemEntry()->GetItemDefinition()); - - WorldInventory->RemoveItem(ItemInstanceToRemove->GetItemEntry()->GetItemGuid(), nullptr, ItemInstanceToRemove->GetItemEntry()->GetCount(), true); - - static auto MulticastTriggerOnGadgetTrackedAttributeDestroyedFXFn = FindObject(L"/Script/FortniteGame.FortPlayerStateZone.MulticastTriggerOnGadgetTrackedAttributeDestroyedFX"); - PlayerState->ProcessEvent(MulticastTriggerOnGadgetTrackedAttributeDestroyedFXFn, &GadgetItemDefinition); - } - - if (ItemInstancesToRemove.size() > 0) - WorldInventory->Update(); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerControllerAthena.h b/dependencies/reboot/Project Reboot 3.0/FortPlayerControllerAthena.h deleted file mode 100644 index 842bc68..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerControllerAthena.h +++ /dev/null @@ -1,267 +0,0 @@ -#pragma once - -#include "FortPlayerController.h" -#include "FortPlayerStateAthena.h" -#include "FortPlayerPawn.h" -#include "SoftObjectPtr.h" -#include "FortKismetLibrary.h" -#include "AthenaMarkerComponent.h" -#include "FortVolume.h" -#include "AthenaPlayerMatchReport.h" - -static void ApplyHID(AFortPlayerPawn* Pawn, UObject* HeroDefinition, bool bUseServerChoosePart = false) -{ - using UFortHeroSpecialization = UObject; - - static auto SpecializationsOffset = HeroDefinition->GetOffset("Specializations"); - auto& Specializations = HeroDefinition->Get>>(SpecializationsOffset); - - auto PlayerState = Pawn->GetPlayerState(); - - for (int i = 0; i < Specializations.Num(); i++) - { - auto& SpecializationSoft = Specializations.at(i); - - static auto FortHeroSpecializationClass = FindObject(L"/Script/FortniteGame.FortHeroSpecialization"); - auto Specialization = SpecializationSoft.Get(FortHeroSpecializationClass, true); - - if (Specialization) - { - static auto Specialization_CharacterPartsOffset = Specialization->GetOffset("CharacterParts"); - auto& CharacterParts = Specialization->Get>>(Specialization_CharacterPartsOffset); - - static auto CustomCharacterPartClass = FindObject(L"/Script/FortniteGame.CustomCharacterPart"); - - if (bUseServerChoosePart) - { - for (int z = 0; z < CharacterParts.Num(); z++) - { - Pawn->ServerChoosePart((EFortCustomPartType)z, CharacterParts.at(z).Get(CustomCharacterPartClass, true)); - } - - continue; // hm? - } - - bool aa; - - TArray CharacterPartsaa; - - for (int z = 0; z < CharacterParts.Num(); z++) - { - auto& CharacterPartSoft = CharacterParts.at(z, GetSoftObjectSize()); - auto CharacterPart = CharacterPartSoft.Get(CustomCharacterPartClass, true); - - CharacterPartsaa.Add(CharacterPart); - - continue; - } - - UFortKismetLibrary::ApplyCharacterCosmetics(GetWorld(), CharacterPartsaa, PlayerState, &aa); - CharacterPartsaa.Free(); - } - } -} - -static bool ApplyCID(AFortPlayerPawn* Pawn, UObject* CID, bool bUseServerChoosePart = false) -{ - if (!CID) - return false; - - auto PlayerController = Cast(Pawn->GetController()); - - if (!PlayerController) - return false; - - if (bUseServerChoosePart) - { - if (Pawn) - { - - } - } - - /* auto PCCosmeticLoadout = PlayerController->GetCosmeticLoadout(); - - if (!PCCosmeticLoadout) - { - LOG_INFO(LogCosmetics, "PCCosmeticLoadout is not set! Will not be able to apply skin."); - return false; - } - - auto PawnCosmeticLoadout = PlayerController->GetCosmeticLoadout(); - - if (!PawnCosmeticLoadout) - { - LOG_INFO(LogCosmetics, "PawnCosmeticLoadout is not set! Will not be able to apply skin."); - return false; - } - - PCCosmeticLoadout->GetCharacter() = CID; - PawnCosmeticLoadout->GetCharacter() = CID; - PlayerController->ApplyCosmeticLoadout(); // would cause recursive - - return true; */ - - if (Fortnite_Version == 1.72) - return false; - - static auto HeroDefinitionOffset = CID->GetOffset("HeroDefinition"); - auto HeroDefinition = CID->Get(HeroDefinitionOffset); - - ApplyHID(Pawn, HeroDefinition, bUseServerChoosePart); - - // static auto HeroTypeOffset = PlayerState->GetOffset("HeroType"); - // PlayerState->Get(HeroTypeOffset) = HeroDefinition; - - return true; -} - -struct FGhostModeRepData -{ - bool& IsInGhostMode() - { - static auto bInGhostModeOffset = FindOffsetStruct("/Script/FortniteGame.GhostModeRepData", "bInGhostMode"); - return *(bool*)(__int64(this) + bInGhostModeOffset); - } - - UFortWorldItemDefinition*& GetGhostModeItemDef() - { - static auto GhostModeItemDefOffset = FindOffsetStruct("/Script/FortniteGame.GhostModeRepData", "GhostModeItemDef"); - return *(UFortWorldItemDefinition**)(__int64(this) + GhostModeItemDefOffset); - } -}; - -class AFortPlayerControllerAthena : public AFortPlayerController -{ -public: - static inline void (*GetPlayerViewPointOriginal)(AFortPlayerControllerAthena* PlayerController, FVector& Location, FRotator& Rotation); - static inline void (*ServerReadyToStartMatchOriginal)(AFortPlayerControllerAthena* PlayerController); - static inline void (*ServerRequestSeatChangeOriginal)(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex); - static inline void (*EnterAircraftOriginal)(UObject* PC, AActor* Aircraft); - static inline void (*StartGhostModeOriginal)(UObject* Context, FFrame* Stack, void* Ret); - static inline void (*EndGhostModeOriginal)(AFortPlayerControllerAthena* PlayerController); - - void SpectateOnDeath() // actually in zone - { - static auto SpectateOnDeathFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerZone.SpectateOnDeath") ? - FindObject(L"/Script/FortniteGame.FortPlayerControllerZone.SpectateOnDeath") : - FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.SpectateOnDeath"); - - this->ProcessEvent(SpectateOnDeathFn); - } - - class UAthenaResurrectionComponent*& GetResurrectionComponent() - { - static auto ResurrectionComponentOffset = GetOffset("ResurrectionComponent"); - return Get(ResurrectionComponentOffset); - } - - AFortPlayerStateAthena* GetPlayerStateAthena() - { - return (AFortPlayerStateAthena*)GetPlayerState(); - } - - FGhostModeRepData* GetGhostModeRepData() - { - static auto GhostModeRepDataOffset = GetOffset("GhostModeRepData", false); - - if (GhostModeRepDataOffset == -1) - return nullptr; - - return GetPtr(GhostModeRepDataOffset); - } - - bool IsInGhostMode() - { - auto GhostModeRepData = GetGhostModeRepData(); - - if (!GhostModeRepData) - return false; - - return GhostModeRepData->IsInGhostMode(); - } - - UAthenaMarkerComponent* GetMarkerComponent() - { - static auto MarkerComponentOffset = GetOffset("MarkerComponent"); - return Get(MarkerComponentOffset); - } - - AFortVolume*& GetCreativePlotLinkedVolume() - { - static auto CreativePlotLinkedVolumeOffset = GetOffset("CreativePlotLinkedVolume"); - return Get(CreativePlotLinkedVolumeOffset); - } - - void ClientClearDeathNotification() // actually in zone - { - auto ClientClearDeathNotificationFn = FindFunction("ClientClearDeathNotification"); - - if (ClientClearDeathNotificationFn) - this->ProcessEvent(ClientClearDeathNotificationFn); - } - - UAthenaPlayerMatchReport*& GetMatchReport() - { - static auto MatchReportOffset = GetOffset("MatchReport"); - return Get(MatchReportOffset); - } - - void ClientSendTeamStatsForPlayer(FAthenaMatchTeamStats* TeamStats) - { - static auto ClientSendTeamStatsForPlayerFn = FindObject("/Script/FortniteGame.FortPlayerControllerAthena.ClientSendTeamStatsForPlayer"); - static auto ParamSize = ClientSendTeamStatsForPlayerFn->GetPropertiesSize(); - auto Params = malloc(ParamSize); - - memcpy_s(Params, ParamSize, TeamStats, TeamStats->GetStructSize()); - - this->ProcessEvent(ClientSendTeamStatsForPlayerFn, Params); - - free(Params); - } - - void RespawnPlayerAfterDeath(bool bEnterSkydiving) - { - static auto RespawnPlayerAfterDeathFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.RespawnPlayerAfterDeath"); - - if (RespawnPlayerAfterDeathFn) - { - this->ProcessEvent(RespawnPlayerAfterDeathFn, &bEnterSkydiving); - } - else - { - // techinally we can remake this as all it really does on older versions is clear deathinfo (I think?) - } - } - - void ClientOnPawnRevived(AController* EventInstigator) // actually zone // idk what this actually does but i call it - { - static auto ClientOnPawnRevivedFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerZone.ClientOnPawnRevived"); - this->ProcessEvent(ClientOnPawnRevivedFn, &EventInstigator); - } - - bool& IsMarkedAlive() - { - static auto bMarkedAliveOffset = GetOffset("bMarkedAlive"); - return Get(bMarkedAliveOffset); - } - - static void StartGhostModeHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but eh - static void EndGhostModeHook(AFortPlayerControllerAthena* PlayerController); - static void EnterAircraftHook(UObject* PC, AActor* Aircraft); - static void ServerRequestSeatChangeHook(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex); // actually in zone - static void ServerRestartPlayerHook(AFortPlayerControllerAthena* Controller); - static void ServerGiveCreativeItemHook(AFortPlayerControllerAthena* Controller, FFortItemEntry CreativeItem); - static void ServerTeleportToPlaygroundLobbyIslandHook(AFortPlayerControllerAthena* Controller); - static void ServerAcknowledgePossessionHook(APlayerController* Controller, APawn* Pawn); - static void ServerPlaySquadQuickChatMessageHook(AFortPlayerControllerAthena* PlayerController, __int64 ChatEntry, __int64 SenderID); - static void GetPlayerViewPointHook(AFortPlayerControllerAthena* PlayerController, FVector& Location, FRotator& Rotation); - static void ServerReadyToStartMatchHook(AFortPlayerControllerAthena* PlayerController); - static void UpdateTrackedAttributesHook(AFortPlayerControllerAthena* PlayerController); - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerPawn.cpp b/dependencies/reboot/Project Reboot 3.0/FortPlayerPawn.cpp deleted file mode 100644 index 263a71d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerPawn.cpp +++ /dev/null @@ -1,379 +0,0 @@ -#include "FortPlayerPawn.h" -#include -#include "FortPlayerController.h" -#include "FortGadgetItemDefinition.h" -#include "FortPlayerControllerAthena.h" -#include "FortPlayerPawnAthena.h" - -FFortAthenaLoadout* AFortPlayerPawn::GetCosmeticLoadout() -{ - static auto CosmeticLoadoutOffset = GetOffset("CosmeticLoadout", false); - - if (CosmeticLoadoutOffset == -1) - CosmeticLoadoutOffset = GetOffset("CustomizationLoadout"); - - if (CosmeticLoadoutOffset == -1) - return nullptr; - - return GetPtr(CosmeticLoadoutOffset); -} - -bool DBNOCheck(AFortPlayerPawn* Pawn, AController* EventInstigator) -{ - bool res = false; - - if (Pawn->IsDBNO()) - { - if (EventInstigator) - { - // idk what this does but this is my interpretation - - auto PlayerState = Cast(Pawn->GetPlayerState()); - auto InstigatorPlayerState = Cast(EventInstigator->GetPlayerState()); - - if (PlayerState && InstigatorPlayerState) - { - if (PlayerState->GetTeamIndex() == InstigatorPlayerState->GetTeamIndex()) - { - res = true; - } - } - } - } - - return res; -} - -void AFortPlayerPawn::ServerReviveFromDBNOHook(AFortPlayerPawn* Pawn, AController* EventInstigator) -{ - LOG_INFO(LogDev, "ServerReviveFromDBNOHook!"); - - if (!DBNOCheck(Pawn, EventInstigator)) - return; - - auto PlayerController = Cast(Pawn->GetController()); - - if (!PlayerController) - return; - - auto PlayerState = Cast(PlayerController->GetPlayerState()); - - if (!PlayerState) - return; - - bool IsRevivingSelf = EventInstigator == PlayerController; - - /* - UObject* ReviveGameplayEffect = nullptr; - - if (IsRevivingSelf) - else - */ - - PlayerState->EndDBNOAbilities(); - - Pawn->SetDBNO(false); - Pawn->SetHasPlayedDying(false); - - Pawn->SetHealth(30); // TODO Get value from SetByCallerReviveHealth? - - Pawn->OnRep_IsDBNO(); - - PlayerController->ClientOnPawnRevived(EventInstigator); // We should call the function that calls this. - PlayerController->RespawnPlayerAfterDeath(false); // nooo - - if (auto PawnAthena = Cast(Pawn)) // im too lazy to make another hook for fortplayerpawnathena - { - if (!PawnAthena->IsDBNO()) - { - PawnAthena->GetDBNORevivalStacking() = 0; - } - } -} - -void AFortPlayerPawn::ServerHandlePickupWithRequestedSwapHook(UObject* Context, FFrame* Stack, void* Ret) -{ - auto Pawn = (AFortPlayerPawn*)Context; - auto Controller = Cast(Pawn->GetController()); - - if (!Controller) - return ServerHandlePickupWithRequestedSwapOriginal(Context, Stack, Ret); - - auto Params = Stack->Locals; - - static auto PickupOffset = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawn.ServerHandlePickupWithRequestedSwap", "Pickup"); - static auto SwapOffset = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawn.ServerHandlePickupWithRequestedSwap", "Swap"); - - auto Pickup = *(AFortPickup**)(__int64(Params) + PickupOffset); - auto& Swap = *(FGuid*)(__int64(Params) + SwapOffset); - - // LOG_INFO(LogDev, "Pickup: {}", Pickup->IsValidLowLevel() ? Pickup->GetFullName() : "BadRead"); - - if (!Pickup) - return ServerHandlePickupWithRequestedSwapOriginal(Context, Stack, Ret); - - static auto bPickedUpOffset = Pickup->GetOffset("bPickedUp"); - - if (Pickup->Get(bPickedUpOffset)) - { - LOG_INFO(LogDev, "Trying to pickup picked up weapon (Swap)?"); - return ServerHandlePickupWithRequestedSwapOriginal(Context, Stack, Ret); - } - - static auto IncomingPickupsOffset = Pawn->GetOffset("IncomingPickups"); - Pawn->Get>(IncomingPickupsOffset).Add(Pickup); - - auto PickupLocationData = Pickup->GetPickupLocationData(); - - PickupLocationData->GetPickupTarget() = Pawn; - PickupLocationData->GetFlyTime() = 0.40f; - PickupLocationData->GetItemOwner() = Pawn; - // PickupLocationData->GetStartDirection() = InStartDirection; - PickupLocationData->GetPickupGuid() = Swap; - - Controller->ShouldTryPickupSwap() = true; - - static auto OnRep_PickupLocationDataFn = FindObject(L"/Script/FortniteGame.FortPickup.OnRep_PickupLocationData"); - Pickup->ProcessEvent(OnRep_PickupLocationDataFn); - - Pickup->Get(bPickedUpOffset) = true; - - static auto OnRep_bPickedUpFn = FindObject(L"/Script/FortniteGame.FortPickup.OnRep_bPickedUp"); - Pickup->ProcessEvent(OnRep_bPickedUpFn); - - return ServerHandlePickupWithRequestedSwapOriginal(Context, Stack, Ret); -} - -void AFortPlayerPawn::ServerChoosePart(EFortCustomPartType Part, UObject* ChosenCharacterPart) -{ - static auto fn = FindObject(L"/Script/FortniteGame.FortPlayerPawn.ServerChoosePart"); - - struct - { - EFortCustomPartType Part; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UObject* ChosenCharacterPart; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortPlayerPawn_ServerChoosePart_Params{Part, ChosenCharacterPart}; - - this->ProcessEvent(fn, &AFortPlayerPawn_ServerChoosePart_Params); -} - -void AFortPlayerPawn::ForceLaunchPlayerZipline() // Thanks android -{ - float ZiplineJumpDampening = -0.5f; - float ZiplineJumpStrength = 1500.f; - - static auto CharacterMovementOffset = GetOffset("CharacterMovement"); - auto CharacterMovement = this->Get(CharacterMovementOffset); - - static auto VelocityOffset = CharacterMovement->GetOffset("Velocity"); - auto& v23 = CharacterMovement->Get(VelocityOffset); - //v23.X = abs(v23.X); - //v23.Y = abs(v23.Y); - - FVector v21 = { -750, -750, ZiplineJumpStrength }; - - if (ZiplineJumpDampening * v23.X >= -750.f) - v21.X = fminf(ZiplineJumpDampening * v23.X, 750); - - if (ZiplineJumpDampening * v23.Y >= -750.f) - v21.Y = fminf(ZiplineJumpDampening * v23.Y, 750); - - // todo check if in vehicle - - static auto LaunchCharacterFn = FindObject("/Script/Engine.Character.LaunchCharacter"); - - struct - { - FVector LaunchVelocity; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bXYOverride; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bZOverride; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } ACharacter_LaunchCharacter_Params{ v21, false, false }; - ProcessEvent(LaunchCharacterFn, &ACharacter_LaunchCharacter_Params); -} - -AActor* AFortPlayerPawn::ServerOnExitVehicle(ETryExitVehicleBehavior ExitForceBehavior) -{ - static auto ServerOnExitVehicleFn = FindObject("/Script/FortniteGame.FortPlayerPawn.ServerOnExitVehicle"); - struct - { - ETryExitVehicleBehavior ExitForceBehavior; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AActor* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AFortPlayerPawn_ServerOnExitVehicle_Params{ExitForceBehavior}; - - this->ProcessEvent(ServerOnExitVehicleFn, &AFortPlayerPawn_ServerOnExitVehicle_Params); - - return AFortPlayerPawn_ServerOnExitVehicle_Params.ReturnValue; -} - -AFortAthenaVehicle* AFortPlayerPawn::GetVehicle() // hm should we call the reflecterd function? -{ - static auto VehicleStateLocalOffset = this->GetOffset("VehicleStateLocal"); - static auto VehicleOffset = FindOffsetStruct("/Script/FortniteGame.VehiclePawnState", "Vehicle"); - return Cast(*(AActor**)(__int64(this->GetPtr<__int64>(VehicleStateLocalOffset)) + VehicleOffset)); -} - -UFortWeaponItemDefinition* AFortPlayerPawn::GetVehicleWeaponDefinition(AFortAthenaVehicle* Vehicle) -{ - if (!Vehicle) - return nullptr; - - return Vehicle->GetVehicleWeaponForSeat(Vehicle->FindSeatIndex(this)); -} - -void AFortPlayerPawn::UnEquipVehicleWeaponDefinition(UFortWeaponItemDefinition* VehicleWeaponDefinition) -{ - if (!VehicleWeaponDefinition) - return; - - auto PlayerController = Cast(GetController()); - - if (!PlayerController) - return; - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - auto VehicleInstance = WorldInventory->FindItemInstance(VehicleWeaponDefinition); - - if (!VehicleInstance) - return; - - bool bShouldUpdate = false; - WorldInventory->RemoveItem(VehicleInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, VehicleInstance->GetItemEntry()->GetCount(), true); - - if (bShouldUpdate) - WorldInventory->Update(); - - auto PickaxeInstance = WorldInventory->GetPickaxeInstance(); - - if (!PickaxeInstance) - return; - - AFortPlayerController::ServerExecuteInventoryItemHook(PlayerController, PickaxeInstance->GetItemEntry()->GetItemGuid()); // Bad, we should equip the last weapon. -} - -void AFortPlayerPawn::StartGhostModeExitHook(UObject* Context, FFrame* Stack, void* Ret) -{ - LOG_INFO(LogDev, __FUNCTION__); - - auto Pawn = (AFortPlayerPawn*)Context; - - auto Controller = Cast(Pawn->GetController()); - - if (!Controller) - return; - - auto WorldInventory = Controller->GetWorldInventory(); - - auto SpookyMistItemDefinition = FindObject("/Game/Athena/Items/Gameplay/SpookyMist/AGID_SpookyMist.AGID_SpookyMist"); - auto SpookyMistInstance = WorldInventory->FindItemInstance(SpookyMistItemDefinition); - - if (SpookyMistInstance) - { - bool bShouldUpdate = false; - WorldInventory->RemoveItem(SpookyMistInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, 1, true); - - if (bShouldUpdate) - WorldInventory->Update(); - - Controller->ApplyCosmeticLoadout(); - } - - return StartGhostModeExitOriginal(Context, Stack, Ret); -} - -AActor* AFortPlayerPawn::ServerOnExitVehicleHook(AFortPlayerPawn* PlayerPawn, ETryExitVehicleBehavior ExitForceBehavior) -{ - auto VehicleWeaponDefinition = PlayerPawn->GetVehicleWeaponDefinition(PlayerPawn->GetVehicle()); - LOG_INFO(LogDev, "VehicleWeaponDefinition: {}", VehicleWeaponDefinition ? VehicleWeaponDefinition->GetFullName() : "BadRead"); - PlayerPawn->UnEquipVehicleWeaponDefinition(VehicleWeaponDefinition); - - return ServerOnExitVehicleOriginal(PlayerPawn, ExitForceBehavior); -} - -void AFortPlayerPawn::ServerSendZiplineStateHook(AFortPlayerPawn* Pawn, FZiplinePawnState InZiplineState) -{ - static auto ZiplineStateOffset = Pawn->GetOffset("ZiplineState"); - - auto PawnZiplineState = Pawn->GetPtr<__int64>(ZiplineStateOffset); - - static auto AuthoritativeValueOffset = FindOffsetStruct("/Script/FortniteGame.ZiplinePawnState", "AuthoritativeValue"); - - if (*(int*)(__int64(&InZiplineState) + AuthoritativeValueOffset) > *(int*)(__int64(PawnZiplineState) + AuthoritativeValueOffset)) - { - static auto ZiplinePawnStateStruct = FindObject("/Script/FortniteGame.ZiplinePawnState"); - static auto ZiplinePawnStateSize = ZiplinePawnStateStruct->GetPropertiesSize(); - - CopyStruct(PawnZiplineState, &InZiplineState, ZiplinePawnStateSize); - - static auto bIsZipliningOffset = FindOffsetStruct("/Script/FortniteGame.ZiplinePawnState", "bIsZiplining"); - static auto bJumpedOffset = FindOffsetStruct("/Script/FortniteGame.ZiplinePawnState", "bJumped"); - - if (!(*(bool*)(__int64(PawnZiplineState) + bIsZipliningOffset))) - { - if ((*(bool*)(__int64(PawnZiplineState) + bJumpedOffset))) - { - Pawn->ForceLaunchPlayerZipline(); - } - } - } - - static void (*OnRep_ZiplineState)(AFortPlayerPawn* Pawn) = decltype(OnRep_ZiplineState)(Addresses::OnRep_ZiplineState); - - if (OnRep_ZiplineState) - OnRep_ZiplineState(Pawn); -} - -void AFortPlayerPawn::ServerHandlePickupHook(AFortPlayerPawn* Pawn, AFortPickup* Pickup, float InFlyTime, FVector InStartDirection, bool bPlayPickupSound) -{ - if (!Pickup) - return; - - static auto bPickedUpOffset = Pickup->GetOffset("bPickedUp"); - - // LOG_INFO(LogDev, "InFlyTime: {}", InFlyTime); - - if (Pickup->Get(bPickedUpOffset)) - { - LOG_INFO(LogDev, "Trying to pickup picked up weapon?"); - return; - } - - auto PlayerControllerAthena = Cast(Pawn->GetController()); - - if (PlayerControllerAthena && PlayerControllerAthena->IsInGhostMode()) - return; - - static auto IncomingPickupsOffset = Pawn->GetOffset("IncomingPickups"); - Pawn->Get>(IncomingPickupsOffset).Add(Pickup); - - auto PickupLocationData = Pickup->GetPickupLocationData(); - - PickupLocationData->GetPickupTarget() = Pawn; - PickupLocationData->GetFlyTime() = 0.40f; - PickupLocationData->GetItemOwner() = Pawn; - // PickupLocationData->GetStartDirection() = InStartDirection; - PickupLocationData->GetPickupGuid() = Pawn->GetCurrentWeapon() ? Pawn->GetCurrentWeapon()->GetItemEntryGuid() : FGuid(); - - static auto OnRep_PickupLocationDataFn = FindObject(L"/Script/FortniteGame.FortPickup.OnRep_PickupLocationData"); - Pickup->ProcessEvent(OnRep_PickupLocationDataFn); - - Pickup->Get(bPickedUpOffset) = true; - - static auto OnRep_bPickedUpFn = FindObject(L"/Script/FortniteGame.FortPickup.OnRep_bPickedUp"); - Pickup->ProcessEvent(OnRep_bPickedUpFn); - } - -void AFortPlayerPawn::ServerHandlePickupInfoHook(AFortPlayerPawn* Pawn, AFortPickup* Pickup, __int64 Params) -{ - LOG_INFO(LogDev, "ServerHandlePickupInfo!"); - return ServerHandlePickupHook(Pawn, Pickup, 0.40f, FVector(), false); -} - -UClass* AFortPlayerPawn::StaticClass() -{ - static auto Class = FindObject("/Script/FortniteGame.FortPlayerPawn"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerPawn.h b/dependencies/reboot/Project Reboot 3.0/FortPlayerPawn.h deleted file mode 100644 index 985c9f8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerPawn.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "FortPawn.h" -#include "FortPickup.h" -#include "FortAthenaVehicle.h" - -struct PadHex100 { char pad[0x100]; }; - -using FZiplinePawnState = PadHex100; - -enum class EFortCustomPartType : uint8_t // todo move -{ - Head = 0, - Body = 1, - Hat = 2, - Backpack = 3, - Charm = 4, - Face = 5, - NumTypes = 6, - EFortCustomPartType_MAX = 7 -}; - -enum class ETryExitVehicleBehavior : uint8_t -{ - DoNotForce = 0, - ForceOnBlocking = 1, - ForceAlways = 2, - ETryExitVehicleBehavior_MAX = 3 -}; - -class AFortPlayerPawn : public AFortPawn -{ -public: - static inline AActor* (*ServerOnExitVehicleOriginal)(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle - static inline void (*StartGhostModeExitOriginal)(UObject* Context, FFrame* Stack, void* Ret); - static inline void (*ServerHandlePickupWithRequestedSwapOriginal)(UObject* Context, FFrame* Stack, void* Ret); - - struct FFortAthenaLoadout* GetCosmeticLoadout(); - void ServerChoosePart(EFortCustomPartType Part, class UObject* ChosenCharacterPart); - void ForceLaunchPlayerZipline(); // Thanks android - AActor* ServerOnExitVehicle(ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle - - AFortAthenaVehicle* GetVehicle(); - UFortWeaponItemDefinition* GetVehicleWeaponDefinition(AFortAthenaVehicle* Vehicle); - void UnEquipVehicleWeaponDefinition(UFortWeaponItemDefinition* VehicleWeaponDefinition); - - static void ServerReviveFromDBNOHook(AFortPlayerPawn* Pawn, AController* EventInstigator); - static void ServerHandlePickupWithRequestedSwapHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but idk - static void StartGhostModeExitHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but eh - static AActor* ServerOnExitVehicleHook(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle - static void ServerSendZiplineStateHook(AFortPlayerPawn* Pawn, FZiplinePawnState InZiplineState); - static void ServerHandlePickupHook(AFortPlayerPawn* Pawn, AFortPickup* Pickup, float InFlyTime, FVector InStartDirection, bool bPlayPickupSound); - static void ServerHandlePickupInfoHook(AFortPlayerPawn* Pawn, AFortPickup* Pickup, __int64 Params); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerPawnAthena.cpp b/dependencies/reboot/Project Reboot 3.0/FortPlayerPawnAthena.cpp deleted file mode 100644 index 91b08b7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerPawnAthena.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "FortPlayerPawnAthena.h" -#include "FortInventory.h" -#include "FortPlayerControllerAthena.h" - -void AFortPlayerPawnAthena::OnCapsuleBeginOverlapHook(UObject* Context, FFrame* Stack, void* Ret) -{ - using UPrimitiveComponent = UObject; - - auto Pawn = (AFortPlayerPawnAthena*)Context; - UPrimitiveComponent* OverlappedComp; - AActor* OtherActor; - UPrimitiveComponent* OtherComp; - int OtherBodyIndex; - bool bFromSweep; - auto SweepResultPtr = (FHitResult*)std::realloc(0, FHitResult::GetStructSize()); - - // LOG_INFO(LogDev, "OnCapsuleBeginOverlapHook!"); - - Stack->StepCompiledIn(&OverlappedComp); - Stack->StepCompiledIn(&OtherActor); - Stack->StepCompiledIn(&OtherComp); - Stack->StepCompiledIn(&OtherBodyIndex); - Stack->StepCompiledIn(&bFromSweep); - Stack->StepCompiledIn(SweepResultPtr); - - std::free(SweepResultPtr); - - // LOG_INFO(LogDev, "OtherActor: {}", __int64(OtherActor)); - // LOG_INFO(LogDev, "OtherActorName: {}", OtherActor->IsValidLowLevel() ? OtherActor->GetName() : "BadRead") - - if (auto Pickup = Cast(OtherActor)) - { - static auto PawnWhoDroppedPickupOffset = Pickup->GetOffset("PawnWhoDroppedPickup"); - - if (Pickup->Get(PawnWhoDroppedPickupOffset) != Pawn) - { - auto ItemDefinition = Pickup->GetPrimaryPickupItemEntry()->GetItemDefinition(); - - if (!ItemDefinition) - { - return; - } - - auto PlayerController = Cast(Pawn->GetController()); - - if (!PlayerController) - { - return; - } - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - { - return; - } - - auto& ItemInstances = WorldInventory->GetItemList().GetItemInstances(); - - bool ItemDefGoingInPrimary = IsPrimaryQuickbar(ItemDefinition); - int PrimarySlotsFilled = 0; - bool bCanStack = false; - bool bFoundStack = false; - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.at(i); - - if (!ItemInstance) - continue; - - auto CurrentItemDefinition = ItemInstance->GetItemEntry()->GetItemDefinition(); - - if (!CurrentItemDefinition) - continue; - - if (ItemDefGoingInPrimary && IsPrimaryQuickbar(CurrentItemDefinition)) - PrimarySlotsFilled++; - - bool bIsInventoryFull = (PrimarySlotsFilled /* - 6 */) >= 5; - - if (CurrentItemDefinition == ItemDefinition) - { - bFoundStack = true; - - if (ItemInstance->GetItemEntry()->GetCount() < ItemDefinition->GetMaxStackSize()) - { - bCanStack = true; - break; - } - } - - if (bIsInventoryFull) - { - return; - } - } - - // std::cout << "bCanStack: " << bCanStack << '\n'; - // std::cout << "bFoundStack: " << bFoundStack << '\n'; - - if (!bCanStack ? (!bFoundStack ? true : ItemDefinition->DoesAllowMultipleStacks()) : true) - ServerHandlePickupHook(Pawn, Pickup, 0.4f, FVector(), true); - } - } - - // return OnCapsuleBeginOverlapOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerPawnAthena.h b/dependencies/reboot/Project Reboot 3.0/FortPlayerPawnAthena.h deleted file mode 100644 index 831ae43..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerPawnAthena.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "FortPlayerPawn.h" - -class AFortPlayerPawnAthena : public AFortPlayerPawn -{ -public: - static inline void (*OnCapsuleBeginOverlapOriginal)(UObject* Context, FFrame* Stack, void* Ret); - - uint8& GetDBNORevivalStacking() - { - static auto DBNORevivalStackingOffset = GetOffset("DBNORevivalStacking"); - return Get(DBNORevivalStackingOffset); - } - - static void OnCapsuleBeginOverlapHook(UObject* Context, FFrame* Stack, void* Ret); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerState.cpp b/dependencies/reboot/Project Reboot 3.0/FortPlayerState.cpp deleted file mode 100644 index 83cead1..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerState.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "FortPlayerState.h" - -void AFortPlayerState::EndDBNOAbilities() -{ - static auto GAB_AthenaDBNOClass = FindObject(L"/Game/Abilities/NPC/Generic/GAB_AthenaDBNO.Default__GAB_AthenaDBNO_C"); - - auto ASC = this->GetAbilitySystemComponent(); - - if (!ASC) - return; - - FGameplayAbilitySpec* DBNOSpec = nullptr; - - UObject* ClassToFind = GAB_AthenaDBNOClass->ClassPrivate; - - auto compareAbilities = [&DBNOSpec, &ClassToFind](FGameplayAbilitySpec* Spec) { - auto CurrentAbility = Spec->GetAbility(); - - if (CurrentAbility->ClassPrivate == ClassToFind) - { - DBNOSpec = Spec; - return; - } - }; - - LoopSpecs(ASC, compareAbilities); - - if (!DBNOSpec) - return; - - ASC->ClientCancelAbility(DBNOSpec->GetHandle(), DBNOSpec->GetActivationInfo()); - ASC->ClientEndAbility(DBNOSpec->GetHandle(), DBNOSpec->GetActivationInfo()); - ASC->ServerEndAbility(DBNOSpec->GetHandle(), DBNOSpec->GetActivationInfo(), nullptr); -} - -bool AFortPlayerState::AreUniqueIDsIdentical(FUniqueNetIdRepl* A, FUniqueNetIdRepl* B) -{ - return A->IsIdentical(B); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerState.h b/dependencies/reboot/Project Reboot 3.0/FortPlayerState.h deleted file mode 100644 index d6b872b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerState.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "OnlineReplStructs.h" -#include "PlayerState.h" -#include "AbilitySystemComponent.h" - -class AFortPlayerState : public APlayerState -{ -public: - UAbilitySystemComponent*& GetAbilitySystemComponent() - { - static auto AbilitySystemComponentOffset = GetOffset("AbilitySystemComponent"); - return this->Get(AbilitySystemComponentOffset); - } - - int& GetWorldPlayerId() - { - static auto WorldPlayerIdOffset = GetOffset("WorldPlayerId"); - return this->Get(WorldPlayerIdOffset); - } - - void EndDBNOAbilities(); - - static bool AreUniqueIDsIdentical(FUniqueNetIdRepl* A, FUniqueNetIdRepl* B); - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortPlayerState"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerStateAthena.cpp b/dependencies/reboot/Project Reboot 3.0/FortPlayerStateAthena.cpp deleted file mode 100644 index 6b961bd..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerStateAthena.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "FortPlayerStateAthena.h" -#include "Stack.h" -#include "FortPlayerControllerAthena.h" - -void AFortPlayerStateAthena::ServerSetInAircraftHook(UObject* Context, FFrame& Stack, void* Ret) -{ - /* LOG_INFO(LogDev, "bLateGame: {}", Globals::bLateGame) - - if (Globals::bLateGame) - return ServerSetInAircraftOriginal(Context, Stack, Ret); */ - - auto PlayerState = (AFortPlayerStateAthena*)Context; - auto PlayerController = Cast(PlayerState->GetOwner()); - - if (!PlayerController) - return ServerSetInAircraftOriginal(Context, Stack, Ret); - - // std::cout << "PlayerController->IsInAircraft(): " << PlayerController->IsInAircraft() << '\n'; - - struct aaa { bool wtf; }; - - auto bNewInAircraft = ((aaa*)Stack.Locals)->wtf;// *(bool*)Stack.Locals; - LOG_INFO(LogDev, "bNewInAircraft: {}", bNewInAircraft); - auto WorldInventory = PlayerController->GetWorldInventory(); - auto& InventoryList = WorldInventory->GetItemList(); - - auto& ItemInstances = InventoryList.GetItemInstances(); - - bool bOverrideDontClearInventory = false; - - if (/* (bNewInAircraft && !PlayerController->IsInAircraft()) || */ /* (Globals::bLateGame ? bNewInAircraft : true)) && */ - !Globals::bLateGame.load() && ItemInstances.Num() && !bOverrideDontClearInventory) - { - static auto CurrentShieldOffset = PlayerState->GetOffset("CurrentShield"); - - if (CurrentShieldOffset != -1) - PlayerState->Get(CurrentShieldOffset) = 0; // real - } - - return ServerSetInAircraftOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlayerStateAthena.h b/dependencies/reboot/Project Reboot 3.0/FortPlayerStateAthena.h deleted file mode 100644 index 60867d9..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlayerStateAthena.h +++ /dev/null @@ -1,138 +0,0 @@ -#pragma once - -#include "FortPlayerState.h" -#include "Stack.h" - -struct FFortRespawnData -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.FortRespawnData"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - bool& IsRespawnDataAvailable() - { - static auto bRespawnDataAvailableOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "bRespawnDataAvailable"); - return *(bool*)(__int64(this) + bRespawnDataAvailableOffset); - } - - bool& IsClientReady() - { - static auto bClientIsReadyOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "bClientIsReady"); - return *(bool*)(__int64(this) + bClientIsReadyOffset); - } - - bool& IsServerReady() - { - static auto bServerIsReadyOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "bServerIsReady"); - return *(bool*)(__int64(this) + bServerIsReadyOffset); - } -}; - -struct FDeathInfo -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.DeathInfo"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - bool& IsDBNO() - { - static auto bDBNOOffset = FindOffsetStruct("/Script/FortniteGame.DeathInfo", "bDBNO"); - return *(bool*)(__int64(this) + bDBNOOffset); - } -}; - -class AFortPlayerStateAthena : public AFortPlayerState -{ -public: - static inline void (*ServerSetInAircraftOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - uint8& GetSquadId() - { - static auto SquadIdOffset = GetOffset("SquadId"); - return Get(SquadIdOffset); - } - - uint8& GetTeamIndex() - { - static auto TeamIndexOffset = GetOffset("TeamIndex"); - return Get(TeamIndexOffset); - } - - int& GetPlace() - { - static auto PlaceOffset = GetOffset("Place"); - return Get(PlaceOffset); - } - - FFortRespawnData* GetRespawnData() - { - static auto RespawnDataOffset = GetOffset("RespawnData"); - return GetPtr(RespawnDataOffset); - } - - bool IsInAircraft() - { - static auto bInAircraftOffset = GetOffset("bInAircraft"); - static auto bInAircraftFieldMask = GetFieldMask(GetProperty("bInAircraft")); - return ReadBitfieldValue(bInAircraftOffset, bInAircraftFieldMask); - } - - bool HasThankedBusDriver() - { - static auto bThankedBusDriverOffset = GetOffset("bThankedBusDriver"); - static auto bThankedBusDriverFieldMask = GetFieldMask(GetProperty("bThankedBusDriver")); - return ReadBitfieldValue(bThankedBusDriverOffset, bThankedBusDriverFieldMask); - } - - bool& IsResurrectingNow() - { - static auto bResurrectingNowOffset = GetOffset("bResurrectingNow", false); - - // if (bResurrectingNowOffset == -1) - // return false; - - return Get(bResurrectingNowOffset); - } - - void ClientReportKill(AFortPlayerStateAthena* Player) - { - static auto ClientReportKillFn = FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.ClientReportKill"); - this->ProcessEvent(ClientReportKillFn, &Player); - } - - void OnRep_DeathInfo() - { - static auto OnRep_DeathInfoFn = FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.OnRep_DeathInfo"); - - if (OnRep_DeathInfoFn) // needed? - { - this->ProcessEvent(OnRep_DeathInfoFn); - } - } - - FDeathInfo* GetDeathInfo() - { - return GetPtr(MemberOffsets::FortPlayerStateAthena::DeathInfo); - } - - void ClearDeathInfo() - { - RtlSecureZeroMemory(GetDeathInfo(), FDeathInfo::GetStructSize()); // TODO FREE THE DEATHTAGS - } - - static void ServerSetInAircraftHook(UObject* Context, FFrame& Stack, void* Ret); - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortPlayerStateAthena"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlaylist.h b/dependencies/reboot/Project Reboot 3.0/FortPlaylist.h deleted file mode 100644 index 48e2a44..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlaylist.h +++ /dev/null @@ -1,317 +0,0 @@ -#pragma once - -#include "Object.h" -#include "Array.h" -#include "FortAbilitySet.h" -#include "SoftObjectPtr.h" -#include "FortPlayerPawnAthena.h" -#include "GameplayTagContainer.h" -#include "BuildingActor.h" -#include "FortPlayerPawnAthena.h" -#include "GameplayAbilityTypes.h" - -struct FGameplayTagRequirements -{ - FGameplayTagContainer RequireTags; // 0x0000(0x0020) (Edit, BlueprintVisible, NativeAccessSpecifierPublic) - FGameplayTagContainer IgnoreTags; // 0x0020(0x0020) (Edit, BlueprintVisible, NativeAccessSpecifierPublic) -}; - -enum class EFortDeliveryInfoBuildingActorSpecification : uint8_t -{ - All = 0, - PlayerBuildable = 1, - NonPlayerBuildable = 2, - EFortDeliveryInfoBuildingActorSpecification_MAX = 3 -}; - -struct FFortDeliveryInfoRequirementsFilter -{ - bool ShouldApplyToPawns() - { - static auto bApplyToPlayerPawnsOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bApplyToPlayerPawns"); - static auto bApplyToPlayerPawnsFieldMask = GetFieldMask(FindPropertyStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bApplyToPlayerPawns")); - return ReadBitfield((PlaceholderBitfield*)(__int64(this) + bApplyToPlayerPawnsOffset), bApplyToPlayerPawnsFieldMask); - } - - bool ShouldApplyToBuildingActors() - { - static auto bApplyToBuildingActorsOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bApplyToBuildingActors"); - static auto bApplyToBuildingActorsFieldMask = GetFieldMask(FindPropertyStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bApplyToBuildingActors")); - return ReadBitfield((PlaceholderBitfield*)(__int64(this) + bApplyToBuildingActorsOffset), bApplyToBuildingActorsFieldMask); - } - - bool ShouldConsiderTeam() - { - static auto bConsiderTeamOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bConsiderTeam"); - static auto bConsiderTeamFieldMask = GetFieldMask(FindPropertyStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "bConsiderTeam")); - return ReadBitfield((PlaceholderBitfield*)(__int64(this) + bConsiderTeamOffset), bConsiderTeamFieldMask); - } - - FGameplayTagRequirements& GetTargetTagRequirements() - { - static auto TargetTagRequirementsOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "TargetTagRequirements"); - return *(FGameplayTagRequirements*)(__int64(this) + TargetTagRequirementsOffset); - } - - EFortDeliveryInfoBuildingActorSpecification& GetBuildingActorSpecification() - { - static auto BuildingActorSpecificationOffset = FindOffsetStruct("/Script/FortniteGame.FortDeliveryInfoRequirementsFilter", "BuildingActorSpecification"); - return *(EFortDeliveryInfoBuildingActorSpecification*)(__int64(this) + BuildingActorSpecificationOffset); - } - - bool DoesActorFollowsRequirements(AActor* Actor) - { - // TODO ADD TEAM CHECK! (We can use UFortKismetLibrary::GetActorTeam) - - if (auto BuildingActor = Cast(Actor)) - { - if (!ShouldApplyToBuildingActors()) - return false; - - //if (GetTargetTagRequirements().RequireTags.GameplayTags.Num() > 0 && GetTargetTagRequirements().) // idk todo - - if (GetBuildingActorSpecification() == EFortDeliveryInfoBuildingActorSpecification::PlayerBuildable && BuildingActor->IsPlayerBuildable()) - return true; - - if (GetBuildingActorSpecification() == EFortDeliveryInfoBuildingActorSpecification::NonPlayerBuildable && !BuildingActor->IsPlayerBuildable()) - return true; - - return GetBuildingActorSpecification() == EFortDeliveryInfoBuildingActorSpecification::All; - } - - else if (auto Pawn = Cast(Actor)) - { - return ShouldApplyToPawns(); - } - - else if (auto PlayerState = Cast(Actor)) - { - return ShouldApplyToPawns(); // scuffed - } - - return false; - } -}; - -struct FFortGameplayEffectDeliveryInfo -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.FortGameplayEffectDeliveryInfo"); - return Struct; - } - - static int GetStructSize() - { - return GetStruct()->GetPropertiesSize(); - } - - FFortDeliveryInfoRequirementsFilter* GetDeliveryRequirements() - { - static auto DeliveryRequirementsOffset = FindOffsetStruct("/Script/FortniteGame.FortGameplayEffectDeliveryInfo", "DeliveryRequirements"); - return (FFortDeliveryInfoRequirementsFilter*)(__int64(this) + DeliveryRequirementsOffset); - } - - TArray& GetGameplayEffects() - { - static auto GameplayEffectsOffset = FindOffsetStruct("/Script/FortniteGame.FortGameplayEffectDeliveryInfo", "GameplayEffects"); - return *(TArray*)(__int64(this) + GameplayEffectsOffset); - } -}; - -struct FFortAbilitySetDeliveryInfo -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.FortAbilitySetDeliveryInfo"); - return Struct; - } - - static int GetStructSize() - { - return GetStruct()->GetPropertiesSize(); - } - - FFortDeliveryInfoRequirementsFilter* GetDeliveryRequirements() - { - static auto DeliveryRequirementsOffset = FindOffsetStruct("/Script/FortniteGame.FortAbilitySetDeliveryInfo", "DeliveryRequirements"); - return (FFortDeliveryInfoRequirementsFilter*)(__int64(this) + DeliveryRequirementsOffset); - } - - TArray>& GetAbilitySets() - { - static auto AbilitySetsOffset = FindOffsetStruct("/Script/FortniteGame.FortAbilitySetDeliveryInfo", "AbilitySets"); - return *(TArray>*)(__int64(this) + AbilitySetsOffset); - } -}; - -class UFortGameplayModifierItemDefinition : public UObject -{ -public: - TArray& GetPersistentGameplayEffects() - { - static auto PersistentGameplayEffectsOffset = GetOffset("PersistentGameplayEffects"); - return this->Get>(PersistentGameplayEffectsOffset); - } - - TArray& GetPersistentAbilitySets() - { - static auto PersistentAbilitySetsOffset = GetOffset("PersistentAbilitySets"); - return this->Get>(PersistentAbilitySetsOffset); - } - - void ApplyModifierToActor(AActor* Actor) - { - if (!Actor) - return; - - // TODO Use the UAbilitySystemInterface or whatever - - UAbilitySystemComponent* AbilitySystemComponent = nullptr; - - if (auto BuildingActor = Cast(Actor)) - { - static auto AbilitySystemComponentOffset = BuildingActor->GetOffset("AbilitySystemComponent"); - AbilitySystemComponent = BuildingActor->Get(AbilitySystemComponentOffset); - } - - else if (auto PlayerState = Cast(Actor)) - { - AbilitySystemComponent = PlayerState->GetAbilitySystemComponent(); - } - - else if (auto Pawn = Cast(Actor)) - { - static auto AbilitySystemComponentOffset = Pawn->GetOffset("AbilitySystemComponent"); - AbilitySystemComponent = Pawn->Get(AbilitySystemComponentOffset); - } - - if (!AbilitySystemComponent) - { - LOG_INFO(LogDev, "Unable to find ASC for {}", Actor->GetName()); - return; - } - - for (int z = 0; z < this->GetPersistentAbilitySets().Num(); z++) - { - auto& AbilitySetDeliveryInfo = this->GetPersistentAbilitySets().at(z, FFortAbilitySetDeliveryInfo::GetStructSize()); - - if (!AbilitySetDeliveryInfo.GetDeliveryRequirements()->DoesActorFollowsRequirements(Actor)) - continue; - - auto& CurrentAbilitySets = AbilitySetDeliveryInfo.GetAbilitySets(); - - for (int j = 0; j < CurrentAbilitySets.Num(); j++) - { - auto& CurrentAbilitySetSoft = CurrentAbilitySets.at(j); - auto CurrentAbilitySet = CurrentAbilitySetSoft.Get(UFortAbilitySet::StaticClass(), true); - - if (!CurrentAbilitySet->IsValidLowLevel()) - continue; - - CurrentAbilitySet->GiveToAbilitySystem(AbilitySystemComponent); - } - } - - for (int z = 0; z < this->GetPersistentGameplayEffects().Num(); z++) - { - auto& GameplayEffectDeliveryInfo = this->GetPersistentGameplayEffects().at(z, FFortGameplayEffectDeliveryInfo::GetStructSize()); - - if (!GameplayEffectDeliveryInfo.GetDeliveryRequirements()->DoesActorFollowsRequirements(Actor)) - continue; - - auto& CurrentGameplayEffects = GameplayEffectDeliveryInfo.GetGameplayEffects(); - - for (int j = 0; j < CurrentGameplayEffects.Num(); j++) - { - auto& CurrentGameplayEffectInfo = CurrentGameplayEffects.at(j); - auto& CurrentGameplayEffectSoft = CurrentGameplayEffectInfo.GameplayEffect; - static auto ClassClass = FindObject("/Script/CoreUObject.Class"); - auto CurrentGameplayEffect = CurrentGameplayEffectSoft.Get(ClassClass, true); - - if (!CurrentGameplayEffect) - continue; - - // LOG_INFO(LogDev, "Giving GameplayEffect {}", CurrentGameplayEffect->GetFullName()); - AbilitySystemComponent->ApplyGameplayEffectToSelf(CurrentGameplayEffect, CurrentGameplayEffectInfo.Level); - } - } - } -}; - - -struct FAthenaScoreData -{ - -}; - -struct FWinConditionScoreData -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.WinConditionScoreData"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - FScalableFloat* GetGoalScore() - { - static auto GoalScoreOffset = FindOffsetStruct("/Script/FortniteGame.WinConditionScoreData", "GoalScore"); - return (FScalableFloat*)(__int64(this) + GoalScoreOffset); - } - - FScalableFloat* GetBigScoreThreshold() - { - static auto BigScoreThresholdOffset = FindOffsetStruct("/Script/FortniteGame.WinConditionScoreData", "BigScoreThreshold"); - return (FScalableFloat*)(__int64(this) + BigScoreThresholdOffset); - } - - TArray& GetScoreDataList() - { - static auto ScoreDataListOffset = FindOffsetStruct("/Script/FortniteGame.WinConditionScoreData", "ScoreDataList"); - return *(TArray*)(__int64(this) + ScoreDataListOffset); - } -}; - -class UFortPlaylist : public UObject -{ -public: - TArray>& GetModifierList() - { - static auto ModifierListOffset = this->GetOffset("ModifierList"); - return this->Get>>(ModifierListOffset); - } - - FWinConditionScoreData* GetScoringData() - { - static auto ScoringDataOffset = GetOffset("ScoringData"); - return GetPtr(ScoringDataOffset); - } - - void ApplyModifiersToActor(AActor* Actor) - { - if (!Actor) - return; - - static auto ModifierListOffset = this->GetOffset("ModifierList", false); - - if (ModifierListOffset == -1) - return; - - auto& ModifierList = this->GetModifierList(); - - static auto FortGameplayModifierItemDefinitionClass = FindObject(L"/Script/FortniteGame.FortGameplayModifierItemDefinition"); - - for (int i = 0; i < ModifierList.Num(); ++i) - { - auto& ModifierSoft = ModifierList.at(i); - auto StrongModifier = ModifierSoft.Get(FortGameplayModifierItemDefinitionClass, true); - - if (!StrongModifier) - continue; - - StrongModifier->ApplyModifierToActor(Actor); - } - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlaylistAthena.h b/dependencies/reboot/Project Reboot 3.0/FortPlaylistAthena.h deleted file mode 100644 index 994d957..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlaylistAthena.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "FortPlaylist.h" - -enum class EAthenaRespawnType : uint8_t -{ - None = 0, - InfiniteRespawn = 1, - InfiniteRespawnExceptStorm = 2, - EAthenaRespawnType_MAX = 3 -}; - -class UFortPlaylistAthena : public UFortPlaylist -{ -public: - EAthenaRespawnType& GetRespawnType() - { - static auto RespawnTypeOffset = GetOffset("RespawnType"); - return Get(RespawnTypeOffset); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortPlaylistAthena"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlaysetItemDefinition.cpp b/dependencies/reboot/Project Reboot 3.0/FortPlaysetItemDefinition.cpp deleted file mode 100644 index 93a457b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlaysetItemDefinition.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "FortPlaysetItemDefinition.h" - -#include "PlaysetLevelStreamComponent.h" - -void UFortPlaysetItemDefinition::ShowPlayset(UFortPlaysetItemDefinition* PlaysetItemDef, AFortVolume* Volume) -{ - /* This doesn't stream it to the client. - - static auto SpawnPlaysetFn = FindObject("/Script/FortniteGame.FortPlaysetItemDefinition.SpawnPlayset"); - - struct - { - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UFortPlaysetItemDefinition* Playset; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Location; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FRotator Rotation; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - char pad[0x100]; // idk out param stuff - } UFortPlaysetItemDefinition_SpawnPlayset_Params{GetWorld(), PlaysetItemDef, Volume->GetActorLocation(), FRotator()}; - - static auto defaultObj = FindObject("/Script/FortniteGame.Default__FortPlaysetItemDefinition"); - defaultObj->ProcessEvent(SpawnPlaysetFn, &UFortPlaysetItemDefinition_SpawnPlayset_Params); - - return; */ - - auto VolumeToUse = Volume; - - static auto PlaysetLevelStreamComponentClass = FindObject("/Script/FortniteGame.PlaysetLevelStreamComponent"); - auto LevelStreamComponent = (UPlaysetLevelStreamComponent*)VolumeToUse->GetComponentByClass(PlaysetLevelStreamComponentClass); - - if (!LevelStreamComponent) - { - return; - } - - static auto SetPlaysetFn = FindObject("/Script/FortniteGame.PlaysetLevelStreamComponent.SetPlayset"); - LevelStreamComponent->ProcessEvent(SetPlaysetFn, &PlaysetItemDef); - - LoadPlaysetOriginal(LevelStreamComponent); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortPlaysetItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortPlaysetItemDefinition.h deleted file mode 100644 index 5be8ce2..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortPlaysetItemDefinition.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "FortItemDefinition.h" -#include "FortVolume.h" - -extern inline __int64 (*LoadPlaysetOriginal)(class UPlaysetLevelStreamComponent* a1) = nullptr; - -class UFortPlaysetItemDefinition : public UFortItemDefinition // UFortAccountItemDefinition -{ -public: - static void ShowPlayset(UFortPlaysetItemDefinition* PlaysetItemDef, AFortVolume* Volume); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortQuickBars.h b/dependencies/reboot/Project Reboot 3.0/FortQuickBars.h deleted file mode 100644 index c15aded..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortQuickBars.h +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once - -#include "reboot.h" - -enum class EFortQuickBars : uint8_t // WRONG!!! It has a creative quickbar, do not use unless you know what you are doing. -{ - Primary = 0, - Secondary = 1, - Max_None = 2, - EFortQuickBars_MAX = 3 -}; - -struct FQuickBarSlot -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/FortniteGame.QuickBarSlot"); - return Struct; - } - - static int GetStructSize() - { - return GetStruct()->GetPropertiesSize(); - } - - TArray& GetItems() - { - static auto ItemsOffset = FindOffsetStruct("/Script/FortniteGame.QuickBarSlot", "Items"); - return *(TArray*)(__int64(this) + ItemsOffset); - } -}; - -struct FQuickBar -{ - TArray& GetSlots() - { - static auto SlotsOffset = FindOffsetStruct("/Script/FortniteGame.QuickBar", "Slots"); - return *(TArray*)(__int64(this) + SlotsOffset); - } -}; - -class AFortQuickBars : public AActor -{ -public: - void ServerRemoveItemInternal(const FGuid& Item, bool bFindReplacement, bool bForce) - { - static auto ServerRemoveItemInternalFn = FindObject("/Script/FortniteGame.FortQuickBars.ServerRemoveItemInternal"); - - struct - { - FGuid Item; // (Parm, IsPlainOldData) - bool bFindReplacement; // (Parm, ZeroConstructor, IsPlainOldData) - bool bForce; // (Parm, ZeroConstructor, IsPlainOldData) - } AFortQuickBars_ServerRemoveItemInternal_Params{ Item, bFindReplacement, bForce }; - ProcessEvent(ServerRemoveItemInternalFn, &AFortQuickBars_ServerRemoveItemInternal_Params); - } - - void EmptySlot(EFortQuickBars InQuickBar, int SlotIndex) - { - static auto EmptySlotFn = FindObject("/Script/FortniteGame.FortQuickBars.EmptySlot"); - struct - { - EFortQuickBars InQuickBar; // (Parm, ZeroConstructor, IsPlainOldData) - int SlotIndex; // (Parm, ZeroConstructor, IsPlainOldData) - } AFortQuickBars_EmptySlot_Params{ InQuickBar, SlotIndex }; - - this->ProcessEvent(EmptySlotFn, &AFortQuickBars_EmptySlot_Params); - } - - int GetSlotIndex(const FGuid& Item, EFortQuickBars QuickBars = EFortQuickBars::Max_None) - { - static auto PrimaryQuickBarOffset = GetOffset("PrimaryQuickBar"); - static auto SecondaryQuickBarOffset = GetOffset("SecondaryQuickBar"); - auto PrimaryQuickBar = GetPtr(PrimaryQuickBarOffset); - auto SecondaryQuickBar = GetPtr(SecondaryQuickBarOffset); - - if (QuickBars == EFortQuickBars::Primary || QuickBars == EFortQuickBars::Max_None) - { - auto& PrimaryQuickBarSlots = PrimaryQuickBar->GetSlots(); - - for (int i = 0; i < PrimaryQuickBarSlots.Num(); ++i) - { - auto Slot = PrimaryQuickBarSlots.AtPtr(i, FQuickBarSlot::GetStructSize()); - - auto& SlotItems = Slot->GetItems(); - - for (int z = 0; z < SlotItems.Num(); z++) - { - auto& CurrentItem = SlotItems.at(z); - - if (CurrentItem == Item) - return i; - } - } - } - - if (QuickBars == EFortQuickBars::Secondary || QuickBars == EFortQuickBars::Max_None) - { - auto& SecondaryQuickBarSlots = SecondaryQuickBar->GetSlots(); - - for (int i = 0; i < SecondaryQuickBarSlots.Num(); ++i) - { - auto Slot = SecondaryQuickBarSlots.AtPtr(i, FQuickBarSlot::GetStructSize()); - - auto& SlotItems = Slot->GetItems(); - - for (int z = 0; z < SlotItems.Num(); z++) - { - auto& CurrentItem = SlotItems.at(z); - - if (CurrentItem == Item) - return i; - } - } - } - - return -1; - } - - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortQuickBars"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortResourceItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortResourceItemDefinition.h deleted file mode 100644 index 8ffa742..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortResourceItemDefinition.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "FortWorldItemDefinition.h" - -class UFortResourceItemDefinition : public UFortWorldItemDefinition -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortSafeZoneIndicator.cpp b/dependencies/reboot/Project Reboot 3.0/FortSafeZoneIndicator.cpp deleted file mode 100644 index 4710767..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortSafeZoneIndicator.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "FortSafeZoneIndicator.h" - -#include "FortGameModeAthena.h" -#include "reboot.h" -#include "KismetSystemLibrary.h" - -void AFortSafeZoneIndicator::SkipShrinkSafeZone() -{ - auto GameState = Cast(((AFortGameMode*)GetWorld()->GetGameMode())->GetGameState()); - - GetSafeZoneStartShrinkTime() = GameState->GetServerWorldTimeSeconds(); - GetSafeZoneFinishShrinkTime() = GameState->GetServerWorldTimeSeconds() + 0.2; -} - -void AFortSafeZoneIndicator::OnSafeZoneStateChangeHook(AFortSafeZoneIndicator* SafeZoneIndicator, EFortSafeZoneState NewState, bool bInitial) -{ - auto GameState = Cast(GetWorld()->GetGameState()); - - LOG_INFO(LogDev, "OnSafeZoneStateChangeHook!"); - - return OnSafeZoneStateChangeOriginal(SafeZoneIndicator, NewState, bInitial); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortSafeZoneIndicator.h b/dependencies/reboot/Project Reboot 3.0/FortSafeZoneIndicator.h deleted file mode 100644 index e7e3a9f..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortSafeZoneIndicator.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "Actor.h" - -enum class EFortSafeZoneState : uint8_t -{ - None = 0, - Starting = 1, - Holding = 2, - Shrinking = 3, - EFortSafeZoneState_MAX = 4 -}; - -class AFortSafeZoneIndicator : public AActor -{ -public: - static inline void (*OnSafeZoneStateChangeOriginal)(AFortSafeZoneIndicator* SafeZoneIndicator, EFortSafeZoneState NewState, bool bInitial); - - float& GetSafeZoneStartShrinkTime() - { - static auto SafeZoneStartShrinkTimeOffset = GetOffset("SafeZoneStartShrinkTime"); - return Get(SafeZoneStartShrinkTimeOffset); - } - - float& GetSafeZoneFinishShrinkTime() - { - static auto SafeZoneFinishShrinkTimeOffset = GetOffset("SafeZoneFinishShrinkTime"); - return Get(SafeZoneFinishShrinkTimeOffset); - } - - void SkipShrinkSafeZone(); - - static void OnSafeZoneStateChangeHook(AFortSafeZoneIndicator* SafeZoneIndicator, EFortSafeZoneState NewState, bool bInitial); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortVehicleItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortVehicleItemDefinition.h deleted file mode 100644 index 8b0abb3..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortVehicleItemDefinition.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include "SoftObjectPtr.h" -#include "FortWorldItemDefinition.h" -#include "GameplayAbilityTypes.h" - -class UFortVehicleItemDefinition : public UFortWorldItemDefinition -{ -public: - FScalableFloat* GetMinPercentWithGas() - { - static auto MinPercentWithGasOffset = GetOffset("MinPercentWithGas"); - return GetPtr(MinPercentWithGasOffset); - } - - FScalableFloat* GetMaxPercentWithGas() - { - static auto MaxPercentWithGasOffset = GetOffset("MaxPercentWithGas"); - return GetPtr(MaxPercentWithGasOffset); - } - - FScalableFloat* GetVehicleMinSpawnPercent() - { - static auto VehicleMinSpawnPercentOffset = GetOffset("VehicleMinSpawnPercent"); - return GetPtr(VehicleMinSpawnPercentOffset); - } - - FScalableFloat* GetVehicleMaxSpawnPercent() - { - static auto VehicleMaxSpawnPercentOffset = GetOffset("VehicleMaxSpawnPercent"); - return GetPtr(VehicleMaxSpawnPercentOffset); - } - - TSoftObjectPtr* GetVehicleActorClassSoft() - { - static auto VehicleActorClassOffset = GetOffset("VehicleActorClass"); - return GetPtr>(VehicleActorClassOffset); - } - - UClass* GetVehicleActorClass() - { - static auto BGAClass = FindObject(L"/Script/Engine.BlueprintGeneratedClass"); - return GetVehicleActorClassSoft()->Get(BGAClass, true); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortVehicleItemDefinition"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortVolume.h b/dependencies/reboot/Project Reboot 3.0/FortVolume.h deleted file mode 100644 index 48909b6..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortVolume.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "BuildingActor.h" - -enum class EVolumeState : uint8_t -{ - Uninitialized = 0, - ReadOnly = 1, - Initializing = 2, - Ready = 3, - EVolumeState_MAX = 4 -}; - -class AFortVolume : public ABuildingActor // ABuildingGameplayActor -{ -public: - EVolumeState& GetVolumeState() - { - static auto VolumeStateOffset = GetOffset("VolumeState"); - return Get(VolumeStateOffset); - } - - void SetCurrentPlayset(class UFortPlaysetItemDefinition* NewPlayset) - { - static auto SetCurrentPlaysetFn = FindObject("/Script/FortniteGame.FortVolume.SetCurrentPlayset"); - this->ProcessEvent(SetCurrentPlaysetFn, &NewPlayset); - } - - void UpdateSize(const FVector& Scale) - { - static auto UpdateSizeFn = FindObject("/Script/FortniteGame.FortVolume.UpdateSize"); - this->ProcessEvent(UpdateSizeFn, (FVector*)&Scale); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortVolumeManager.cpp b/dependencies/reboot/Project Reboot 3.0/FortVolumeManager.cpp deleted file mode 100644 index da31e27..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortVolumeManager.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "FortVolumeManager.h" - -AFortVolume* AFortVolumeManager::SpawnVolumeHook(AFortVolumeManager* VolumeManager, UClass* VolumeActor, UFortPlaysetItemDefinition* Playset, FVector Location, FRotator Rotation) -{ - // They inlined SetPlayset idk why - - static auto VolumeObjectsOffset = VolumeManager->GetOffset("VolumeObjects"); - auto& VolumeObjects = VolumeManager->Get>(VolumeObjectsOffset); - - LOG_INFO(LogDev, "SpawnVolumeHook!"); - auto ret = SpawnVolumeOriginal(VolumeManager, VolumeActor, Playset, Location, Rotation); - - return ret; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortVolumeManager.h b/dependencies/reboot/Project Reboot 3.0/FortVolumeManager.h deleted file mode 100644 index 4f31cab..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortVolumeManager.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "FortVolume.h" - -#include "FortPlaysetItemDefinition.h" - -class AFortVolumeManager : public AActor -{ -public: - static inline AFortVolume* (*SpawnVolumeOriginal)(AFortVolumeManager* VolumeManager, UClass* VolumeActor, UFortPlaysetItemDefinition* Playset, FVector Location, FRotator Rotation); - - static AFortVolume* SpawnVolumeHook(AFortVolumeManager* VolumeManager, UClass* VolumeActor, UFortPlaysetItemDefinition* Playset, FVector Location, FRotator Rotation); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortWeapon.cpp b/dependencies/reboot/Project Reboot 3.0/FortWeapon.cpp deleted file mode 100644 index 9e1303d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortWeapon.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "FortWeapon.h" -#include "FortPlayerPawn.h" - -#include "reboot.h" -#include "FortPlayerController.h" - -void AFortWeapon::OnPlayImpactFXHook(AFortWeapon* Weapon, __int64 HitResult, uint8_t ImpactPhysicalSurface, UObject* SpawnedPSC) -{ - // grappler - - auto Pawn = Cast(Weapon->GetOwner()); - - if (!Pawn) - return OnPlayImpactFXOriginal(Weapon, HitResult, ImpactPhysicalSurface, SpawnedPSC); - - auto Controller = Cast(Pawn->GetController()); - auto CurrentWeapon = Pawn->GetCurrentWeapon(); - auto WorldInventory = Controller ? Controller->GetWorldInventory() : nullptr; - - if (!WorldInventory || !CurrentWeapon) - return OnPlayImpactFXOriginal(Weapon, HitResult, ImpactPhysicalSurface, SpawnedPSC); - - auto AmmoCount = CurrentWeapon->GetAmmoCount(); - - WorldInventory->CorrectLoadedAmmo(CurrentWeapon->GetItemEntryGuid(), AmmoCount); - - return OnPlayImpactFXOriginal(Weapon, HitResult, ImpactPhysicalSurface, SpawnedPSC); -} - -void AFortWeapon::ServerReleaseWeaponAbilityHook(UObject* Context, FFrame* Stack, void* Ret) -{ - return ServerReleaseWeaponAbilityOriginal(Context, Stack, Ret); -} - -UClass* AFortWeapon::StaticClass() -{ - static auto Class = FindObject(L"/Script/FortniteGame.FortWeapon"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortWeapon.h b/dependencies/reboot/Project Reboot 3.0/FortWeapon.h deleted file mode 100644 index 3cb8387..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortWeapon.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "Actor.h" -#include "GameplayAbilitySpec.h" -#include "Stack.h" - -class AFortWeapon : public AActor -{ -public: - static inline void (*ServerReleaseWeaponAbilityOriginal)(UObject* Context, FFrame* Stack, void* Ret); - static inline void (*OnPlayImpactFXOriginal)(AFortWeapon* Weapon, __int64 HitResult, uint8_t ImpactPhysicalSurface, UObject* SpawnedPSC); - - template - T* GetWeaponData() - { - static auto WeaponDataOffset = GetOffset("WeaponData"); - return Get(WeaponDataOffset); - } - - FGuid& GetItemEntryGuid() - { - static auto ItemEntryGuidOffset = GetOffset("ItemEntryGuid"); - return Get(ItemEntryGuidOffset); - } - - int& GetAmmoCount() - { - static auto AmmoCountOffset = GetOffset("AmmoCount"); - return Get(AmmoCountOffset); - } - - static void OnPlayImpactFXHook(AFortWeapon* Weapon, __int64 HitResult, uint8_t ImpactPhysicalSurface, UObject* SpawnedPSC); - static void ServerReleaseWeaponAbilityHook(UObject* Context, FFrame* Stack, void* Ret); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortWeaponItemDefinition.cpp b/dependencies/reboot/Project Reboot 3.0/FortWeaponItemDefinition.cpp deleted file mode 100644 index 2f15387..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortWeaponItemDefinition.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "FortWeaponItemDefinition.h" - -#include "DataTable.h" -#include "SoftObjectPtr.h" - -int UFortWeaponItemDefinition::GetClipSize() -{ - static auto WeaponStatHandleOffset = GetOffset("WeaponStatHandle"); - auto& WeaponStatHandle = Get(WeaponStatHandleOffset); - - auto Table = WeaponStatHandle.DataTable; - - if (!Table) - return 0; - - auto& RowMap = Table->GetRowMap(); - - void* Row = nullptr; - - for (int i = 0; i < RowMap.Pairs.Elements.Data.Num(); ++i) - { - auto& Pair = RowMap.Pairs.Elements.Data.at(i).ElementData.Value; - - if (Pair.Key() == WeaponStatHandle.RowName) - { - Row = Pair.Value(); - break; - } - } - - if (!Row) - return 0; - - static auto ClipSizeOffset = FindOffsetStruct("/Script/FortniteGame.FortBaseWeaponStats", "ClipSize"); - return *(int*)(__int64(Row) + ClipSizeOffset); -} - -UFortWorldItemDefinition* UFortWeaponItemDefinition::GetAmmoData() -{ - static auto AmmoDataOffset = GetOffset("AmmoData"); - auto AmmoData = GetPtr>(AmmoDataOffset); - return AmmoData->Get(); -} - -UClass* UFortWeaponItemDefinition::StaticClass() -{ - static auto Class = FindObject(L"/Script/FortniteGame.FortWeaponItemDefinition"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortWeaponItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortWeaponItemDefinition.h deleted file mode 100644 index 6439145..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortWeaponItemDefinition.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "FortWorldItemDefinition.h" - -class UFortWeaponItemDefinition : public UFortWorldItemDefinition -{ -public: - int GetClipSize(); - UFortWorldItemDefinition* GetAmmoData(); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortWeaponMeleeItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortWeaponMeleeItemDefinition.h deleted file mode 100644 index a9567e5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortWeaponMeleeItemDefinition.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "FortWeaponItemDefinition.h" -#include "reboot.h" - -class UFortWeaponMeleeItemDefinition : public UFortWeaponItemDefinition -{ -public: - static UClass* StaticClass() - { - static auto Class = FindObject("/Script/FortniteGame.FortWeaponMeleeItemDefinition"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortWeaponRangedMountedCannon.cpp b/dependencies/reboot/Project Reboot 3.0/FortWeaponRangedMountedCannon.cpp deleted file mode 100644 index a696774..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortWeaponRangedMountedCannon.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "FortWeaponRangedMountedCannon.h" -#include "FortAthenaVehicle.h" -#include "FortPlayerPawnAthena.h" -#include "FortAthenaSKPushCannon.h" -#include "FortMountedCannon.h" - -bool AFortWeaponRangedMountedCannon::FireActorInCannon(FVector LaunchDir, bool bIsServer) -{ - static auto InstigatorOffset = GetOffset("Instigator"); - auto Pawn = Cast(this->Get(InstigatorOffset)); - - LOG_INFO(LogDev, "Pawn: {}", __int64(Pawn)); - LOG_INFO(LogDev, "LaunchDir.X: {} LaunchDir.Y: {} LaunchDir.Z: {}", LaunchDir.X, LaunchDir.Y, LaunchDir.Z); - - if (!Pawn) - return false; - - auto Vehicle = Pawn->GetVehicle(); - - LOG_INFO(LogDev, "Vehicle: {}", __int64(Vehicle)); - - if (!Vehicle) - return false; - - auto PushCannon = Cast(Vehicle); - - LOG_INFO(LogDev, "PushCannon: {}", __int64(PushCannon)); - - if (!PushCannon) - { - auto MountedCannon = Cast(Vehicle); - - LOG_INFO(LogDev, "MountedCannon: {}", __int64(MountedCannon)); - - if (MountedCannon) - { - if (bIsServer - && this->HasAuthority() - // theres another Pawn check with their vehicle here, not sure what it is. - ) - { - MountedCannon->ShootPawnOut(); - } - } - - return false; - } - - if (!Vehicle->GetPawnAtSeat(1)) - return false; - - if (bIsServer) - { - if (this->HasAuthority()) - PushCannon->ShootPawnOut(LaunchDir); - } - - return true; -} - -void AFortWeaponRangedMountedCannon::ServerFireActorInCannonHook(AFortWeaponRangedMountedCannon* Cannon, FVector LaunchDir) -{ - Cannon->FireActorInCannon(LaunchDir, true); - return; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortWeaponRangedMountedCannon.h b/dependencies/reboot/Project Reboot 3.0/FortWeaponRangedMountedCannon.h deleted file mode 100644 index 3303d33..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortWeaponRangedMountedCannon.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "Actor.h" - -class AFortWeaponRangedMountedCannon : public AActor // : public AFortWeaponRangedForVehicle -{ -public: - bool FireActorInCannon(FVector LaunchDir, bool bIsServer = true); - static void ServerFireActorInCannonHook(AFortWeaponRangedMountedCannon* Cannon, FVector LaunchDir); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/FortWorldItemDefinition.h b/dependencies/reboot/Project Reboot 3.0/FortWorldItemDefinition.h deleted file mode 100644 index d5298c7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/FortWorldItemDefinition.h +++ /dev/null @@ -1,138 +0,0 @@ -#pragma once - -#include "FortItemDefinition.h" -#include "FortLootLevel.h" - -enum class EWorldItemDropBehavior : uint8_t -{ - DropAsPickup = 0, - DestroyOnDrop = 1, - DropAsPickupDestroyOnEmpty = 2, - EWorldItemDropBehavior_MAX = 3 -}; - -struct FFortLootLevelData : public FTableRowBase -{ -public: - FName Category; // 0x8(0x8)(Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int32 LootLevel; // 0x10(0x4)(Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int32 MinItemLevel; // 0x14(0x4)(Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int32 MaxItemLevel; // 0x18(0x4)(Edit, BlueprintVisible, BlueprintReadOnly, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - uint8 Pad_B94[0x4]; // Fixing Size Of Struct [ Dumper-7 ] -}; - -class UFortWorldItemDefinition : public UFortItemDefinition -{ -public: - bool CanBeDropped() - { - static auto bCanBeDroppedOffset = GetOffset("bCanBeDropped"); - static auto bCanBeDroppedFieldMask = GetFieldMask(GetProperty("bCanBeDropped")); - return ReadBitfieldValue(bCanBeDroppedOffset, bCanBeDroppedFieldMask); - } - - int& GetDropCount() - { - static auto DropCountOffset = GetOffset("DropCount"); - return Get(DropCountOffset); - } - - int PickLevel(int PreferredLevel) // well min level and maxlevel is sometimes in ufortowrlditemdeifnit9 then on older versions ufortitemdefinitoj so idk wher tyo put this - { - static auto MinLevelOffset = GetOffset("MinLevel"); - static auto MaxLevelOffset = GetOffset("MaxLevel"); - - const int MinLevel = Get(MinLevelOffset); - const int MaxLevel = Get(MaxLevelOffset); - - int PickedLevel = 0; - - if (PreferredLevel >= MinLevel) - PickedLevel = PreferredLevel; - - if (MaxLevel >= 0) - { - if (PickedLevel <= MaxLevel) - return PickedLevel; - return MaxLevel; - } - - return PickedLevel; - } - - FDataTableCategoryHandle& GetLootLevelData() - { - static auto LootLevelDataOffset = GetOffset("LootLevelData"); - return Get(LootLevelDataOffset); - } - - int GetFinalLevel(int WorldLevel) - { - auto ItemLevel = UFortLootLevel::GetItemLevel(GetLootLevelData(), WorldLevel); - - return PickLevel(ItemLevel >= 0 ? ItemLevel : 0); - } - - EWorldItemDropBehavior& GetDropBehavior() - { - static auto DropBehaviorOffset = GetOffset("DropBehavior"); - return Get(DropBehaviorOffset); - } - - bool ShouldDropOnDeath() - { - static auto bDropOnDeathOffset = GetOffset("bDropOnDeath"); - static auto bDropOnDeathFieldMask = GetFieldMask(GetProperty("bDropOnDeath")); - return ReadBitfieldValue(bDropOnDeathOffset, bDropOnDeathFieldMask); - } - - bool ShouldIgnoreRespawningOnDrop() - { - static auto bIgnoreRespawningForDroppingAsPickupOffset = GetOffset("bIgnoreRespawningForDroppingAsPickup", false); - - if (bIgnoreRespawningForDroppingAsPickupOffset == -1) - return false; - - static auto bIgnoreRespawningForDroppingAsPickupFieldMask = GetFieldMask(GetProperty("bIgnoreRespawningForDroppingAsPickup")); - return ReadBitfieldValue(bIgnoreRespawningForDroppingAsPickupOffset, bIgnoreRespawningForDroppingAsPickupFieldMask); - } - - bool ShouldPersistWhenFinalStackEmpty() - { - static auto bPersistInInventoryWhenFinalStackEmptyOffset = GetOffset("bPersistInInventoryWhenFinalStackEmpty", false); - - if (bPersistInInventoryWhenFinalStackEmptyOffset == -1) - return false; - - static auto bPersistInInventoryWhenFinalStackEmptyFieldMask = GetFieldMask(GetProperty("bPersistInInventoryWhenFinalStackEmpty")); - return ReadBitfieldValue(bPersistInInventoryWhenFinalStackEmptyOffset, bPersistInInventoryWhenFinalStackEmptyFieldMask); - } - - bool ShouldFocusWhenAdded() - { - static auto bForceFocusWhenAddedOffset = GetOffset("bForceFocusWhenAdded", false); - - if (bForceFocusWhenAddedOffset == -1) - return false; - - static auto bForceFocusWhenAddedFieldMask = GetFieldMask(GetProperty("bForceFocusWhenAdded")); - return ReadBitfieldValue(bForceFocusWhenAddedOffset, bForceFocusWhenAddedFieldMask); - } - - bool ShouldForceFocusWhenAdded() - { - static auto bForceFocusWhenAddedOffset = GetOffset("bForceFocusWhenAdded"); - - if (bForceFocusWhenAddedOffset == -1) - return false; - - static auto bForceFocusWhenAddedFieldMask = GetFieldMask(GetProperty("bForceFocusWhenAdded")); - return ReadBitfieldValue(bForceFocusWhenAddedOffset, bForceFocusWhenAddedFieldMask); - } - - static UClass* StaticClass() - { - static auto Class = FindObject(L"/Script/FortniteGame.FortWorldItemDefinition"); - return Class; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Function.h b/dependencies/reboot/Project Reboot 3.0/Function.h deleted file mode 100644 index 6d3de55..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Function.h +++ /dev/null @@ -1,56 +0,0 @@ -// FROM 4.23 - -#pragma once - -#include "TypeCompatibleBytes.h" - -#if defined(_WIN32) && !defined(_WIN64) -// Don't use inline storage on Win32, because that will affect the alignment of TFunction, and we can't pass extra-aligned types by value on Win32. -#define TFUNCTION_USES_INLINE_STORAGE 0 -#elif USE_SMALL_TFUNCTIONS -#define TFUNCTION_USES_INLINE_STORAGE 0 -#else -#define TFUNCTION_USES_INLINE_STORAGE 1 -#define TFUNCTION_INLINE_SIZE 32 -#define TFUNCTION_INLINE_ALIGNMENT 16 -#endif - -template -struct TFunctionRefBase; - -template -struct TFunctionRefBase -{ - Ret(*Callable)(void*, ParamTypes&...); - - StorageType Storage; - -#if ENABLE_TFUNCTIONREF_VISUALIZATION - // To help debug visualizers - TDebugHelper DebugPtrStorage; -#endif -}; - -struct FFunctionStorage -{ - FFunctionStorage() - : HeapAllocation(nullptr) - { - } - - void* HeapAllocation; -#if TFUNCTION_USES_INLINE_STORAGE - // Inline storage for an owned object - TAlignedBytes InlineAllocation; -#endif -}; - -template -struct TFunctionStorage : FFunctionStorage -{ -}; - -template -class TFunction final : public TFunctionRefBase, FuncType> -{ -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameInstance.h b/dependencies/reboot/Project Reboot 3.0/GameInstance.h deleted file mode 100644 index 80d6525..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameInstance.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "Object.h" - -#include "TimerManager.h" - -class UGameInstance : public UObject -{ -public: - inline FTimerManager& GetTimerManager() const - { - static auto TimerManagerOffset = 0x90; - return **(FTimerManager**)(__int64(TimerManagerOffset)); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameMode.cpp b/dependencies/reboot/Project Reboot 3.0/GameMode.cpp deleted file mode 100644 index 16a02fb..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameMode.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "GameMode.h" - -#include "reboot.h" - -void AGameMode::RestartGame() -{ - static auto RestartGameFn = FindObject("/Script/Engine.GameMode.RestartGame"); - this->ProcessEvent(RestartGameFn); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameMode.h b/dependencies/reboot/Project Reboot 3.0/GameMode.h deleted file mode 100644 index 00534e3..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameMode.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "GameModeBase.h" - -class AGameMode : public AGameModeBase -{ -public: - - void RestartGame(); - - class AGameState*& GetGameState() - { - static auto GameStateOffset = this->GetOffset("GameState"); - return this->Get(GameStateOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameModeBase.cpp b/dependencies/reboot/Project Reboot 3.0/GameModeBase.cpp deleted file mode 100644 index 8c2c8a4..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameModeBase.cpp +++ /dev/null @@ -1,266 +0,0 @@ -#include "GameModeBase.h" - -#include "reboot.h" -#include "FortPlayerControllerAthena.h" -#include "FortGameModeAthena.h" -#include "FortLootPackage.h" -#include "FortAthenaMutator_GiveItemsAtGamePhaseStep.h" -#include "DataTableFunctionLibrary.h" -#include "FortAthenaMutator_GG.h" -#include "FortAthenaMutator_InventoryOverride.h" - -void AGameModeBase::RestartPlayerAtTransform(AController* NewPlayer, FTransform SpawnTransform) -{ - static auto RestartPlayerAtTransformFn = FindObject(L"/Script/Engine.GameModeBase.RestartPlayerAtTransform"); - - struct - { - AController* NewPlayer; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FTransform SpawnTransform; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - } AGameModeBase_RestartPlayerAtTransform_Params{ NewPlayer, SpawnTransform }; - - this->ProcessEvent(RestartPlayerAtTransformFn, &AGameModeBase_RestartPlayerAtTransform_Params); -} - -void AGameModeBase::RestartPlayerAtPlayerStart(AController* NewPlayer, AActor* StartSpot) -{ - static auto RestartPlayerAtPlayerStartFn = FindObject(L"/Script/Engine.GameModeBase.RestartPlayerAtPlayerStart"); - - struct - { - AController* NewPlayer; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AActor* StartSpot; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AGameModeBase_RestartPlayerAtPlayerStart_Params{ NewPlayer, StartSpot }; - - this->ProcessEvent(RestartPlayerAtPlayerStartFn, &AGameModeBase_RestartPlayerAtPlayerStart_Params); -} - -void AGameModeBase::RestartPlayer(AController* NewPlayer) -{ - static auto RestartPlayerFn = FindObject(L"/Script/Engine.GameModeBase.RestartPlayer"); - this->ProcessEvent(RestartPlayerFn, &NewPlayer); -} - -UClass* AGameModeBase::GetDefaultPawnClassForController(AController* InController) -{ - static auto GetDefaultPawnClassForControllerFn = FindObject(L"/Script/Engine.GameModeBase.GetDefaultPawnClassForController"); - struct - { - AController* InController; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UClass* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AGameModeBase_GetDefaultPawnClassForController_Params{InController}; - - this->ProcessEvent(GetDefaultPawnClassForControllerFn, &AGameModeBase_GetDefaultPawnClassForController_Params); - - return AGameModeBase_GetDefaultPawnClassForController_Params.ReturnValue; -} - -void AGameModeBase::ChangeName(AController* Controller, const FString& NewName, bool bNameChange) -{ - static auto ChangeNameFn = FindObject(L"/Script/Engine.GameModeBase.ChangeName"); - - struct - { - AController* Controller; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - struct FString NewName; // (Parm, ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bNameChange; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AGameModeBase_ChangeName_Params{ Controller, NewName, bNameChange }; - - this->ProcessEvent(ChangeNameFn, &AGameModeBase_ChangeName_Params); -} - -AActor* AGameModeBase::K2_FindPlayerStart(AController* Player, FString IncomingName) -{ - static auto K2_FindPlayerStartFn = FindObject(L"/Script/Engine.GameModeBase.K2_FindPlayerStart"); - - struct - { - AController* Player; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FString IncomingName; // (Parm, ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AActor* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } AGameModeBase_K2_FindPlayerStart_Params{ Player, IncomingName }; - - this->ProcessEvent(K2_FindPlayerStartFn, &AGameModeBase_K2_FindPlayerStart_Params); - - return AGameModeBase_K2_FindPlayerStart_Params.ReturnValue; -} - -APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AController* NewPlayer, AActor* StartSpot) -{ - LOG_INFO(LogDev, "SpawnDefaultPawnForHook!"); - - auto NewPlayerAsAthena = Cast(NewPlayer); - - if (!NewPlayerAsAthena) - return nullptr; // return original? - - auto PlayerStateAthena = NewPlayerAsAthena->GetPlayerStateAthena(); - - if (!PlayerStateAthena) - return nullptr; // return original? - - static auto PawnClass = FindObject(L"/Game/Athena/PlayerPawn_Athena.PlayerPawn_Athena_C"); - static auto DefaultPawnClassOffset = GameMode->GetOffset("DefaultPawnClass"); - GameMode->Get(DefaultPawnClassOffset) = PawnClass; - - bool bUseSpawnActor = Fortnite_Version >= 20; - - static auto SpawnDefaultPawnAtTransformFn = FindObject(L"/Script/Engine.GameModeBase.SpawnDefaultPawnAtTransform"); - - FTransform SpawnTransform = StartSpot->GetTransform(); - APawn* NewPawn = nullptr; - - if (bUseSpawnActor) - { - NewPawn = GetWorld()->SpawnActor(PawnClass, SpawnTransform, CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn)); - } - else - { - struct { AController* NewPlayer; FTransform SpawnTransform; APawn* ReturnValue; } - AGameModeBase_SpawnDefaultPawnAtTransform_Params{ NewPlayer, SpawnTransform }; - - GameMode->ProcessEvent(SpawnDefaultPawnAtTransformFn, &AGameModeBase_SpawnDefaultPawnAtTransform_Params); - - NewPawn = AGameModeBase_SpawnDefaultPawnAtTransform_Params.ReturnValue; - } - - if (!NewPawn) - return nullptr; - - bool bIsRespawning = false; // reel - - auto ASC = PlayerStateAthena->GetAbilitySystemComponent(); - auto GameState = ((AFortGameModeAthena*)GameMode)->GetGameStateAthena(); - - GET_PLAYLIST(GameState); - - if (CurrentPlaylist) // Apply gameplay effects from playlist // We need to move this maybe? - { - CurrentPlaylist->ApplyModifiersToActor(PlayerStateAthena); - } - - auto PlayerAbilitySet = GetPlayerAbilitySet(); // Apply default gameplay effects // We need to move maybe? - - if (PlayerAbilitySet && ASC) - { - PlayerAbilitySet->ApplyGrantedGameplayAffectsToAbilitySystem(ASC); - } - - if (!bIsRespawning) - { - auto WorldInventory = NewPlayerAsAthena->GetWorldInventory(); - - if (WorldInventory->IsValidLowLevel()) - { - if (!WorldInventory->GetPickaxeInstance()) - { - // TODO Check Playlist->bRequirePickaxeInStartingInventory - - auto& StartingItems = ((AFortGameModeAthena*)GameMode)->GetStartingItems(); - - NewPlayerAsAthena->AddPickaxeToInventory(); - - for (int i = 0; i < StartingItems.Num(); ++i) - { - auto& StartingItem = StartingItems.at(i); - - WorldInventory->AddItem(StartingItem.GetItem(), nullptr, StartingItem.GetCount()); - } - - /* if (Globals::bLateGame) - { - auto SpawnIslandTierGroup = UKismetStringLibrary::Conv_StringToName(L"Loot_AthenaFloorLoot_Warmup"); - - for (int i = 0; i < 5; ++i) - { - auto LootDrops = PickLootDrops(SpawnIslandTierGroup); - - for (auto& LootDrop : LootDrops) - { - WorldInventory->AddItem(LootDrop.ItemDefinition, nullptr, LootDrop.Count, LootDrop.LoadedAmmo); - } - } - } */ - - auto AddInventoryOverrideTeamLoadouts = [&](AFortAthenaMutator* Mutator) - { - if (auto InventoryOverride = Cast(Mutator)) - { - auto TeamIndex = PlayerStateAthena->GetTeamIndex(); - auto LoadoutTeam = InventoryOverride->GetLoadoutTeamForTeamIndex(TeamIndex); - - if (LoadoutTeam.UpdateOverrideType == EAthenaInventorySpawnOverride::Always) - { - auto LoadoutContainer = InventoryOverride->GetLoadoutContainerForTeamIndex(TeamIndex); - - for (int i = 0; i < LoadoutContainer.Loadout.Num(); ++i) - { - auto& ItemAndCount = LoadoutContainer.Loadout.at(i); - WorldInventory->AddItem(ItemAndCount.GetItem(), nullptr, ItemAndCount.GetCount()); - } - } - } - }; - - LoopMutators(AddInventoryOverrideTeamLoadouts); - } - - const auto& ItemInstances = WorldInventory->GetItemList().GetItemInstances(); - const auto& ReplicatedEntries = WorldInventory->GetItemList().GetReplicatedEntries(); - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.at(i); - - if (!ItemInstance) continue; - - auto WeaponItemDefinition = Cast(ItemInstance->GetItemEntry()->GetItemDefinition()); - - if (!WeaponItemDefinition) continue; - - ItemInstance->GetItemEntry()->GetLoadedAmmo() = WeaponItemDefinition->GetClipSize(); - WorldInventory->GetItemList().MarkItemDirty(ItemInstance->GetItemEntry()); - } - - for (int i = 0; i < ReplicatedEntries.Num(); ++i) - { - auto ReplicatedEntry = ReplicatedEntries.AtPtr(i, FFortItemEntry::GetStructSize()); - - auto WeaponItemDefinition = Cast(ReplicatedEntry->GetItemDefinition()); - - if (!WeaponItemDefinition) continue; - - ReplicatedEntry->GetLoadedAmmo() = WeaponItemDefinition->GetClipSize(); - WorldInventory->GetItemList().MarkItemDirty(ReplicatedEntry); - } - - WorldInventory->Update(); - } - } - else - { - // TODO I DONT KNOW WHEN TO DO THIS - - /* - - static auto DeathInfoStruct = FindObject(L"/Script/FortniteGame.DeathInfo"); - static auto DeathInfoStructSize = DeathInfoStruct->GetPropertiesSize(); - RtlSecureZeroMemory(DeathInfo, DeathInfoStructSize); // TODO FREE THE DEATHTAGS - - static auto OnRep_DeathInfoFn = FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.OnRep_DeathInfo"); - - if (OnRep_DeathInfoFn) - { - PlayerStateAthena->ProcessEvent(OnRep_DeathInfoFn); - } - - */ - - // NewPlayerAsAthena->ClientClearDeathNotification(); - // NewPlayerAsAthena->RespawnPlayerAfterDeath(true); - } - - // LOG_INFO(LogDev, "Finish SpawnDefaultPawnFor!"); - - return NewPawn; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameModeBase.h b/dependencies/reboot/Project Reboot 3.0/GameModeBase.h deleted file mode 100644 index 86ebe3d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameModeBase.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "Actor.h" - -#include "Controller.h" -#include "Pawn.h" -#include "UnrealString.h" - -class AGameModeBase : public AActor // AInfo -{ -public: - UClass* GetDefaultPawnClassForController(AController* InController); - void ChangeName(AController* Controller, const FString& NewName, bool bNameChange); - AActor* K2_FindPlayerStart(AController* Player, FString IncomingName); - void RestartPlayerAtTransform(AController* NewPlayer, FTransform SpawnTransform); - void RestartPlayerAtPlayerStart(AController* NewPlayer, AActor* StartSpot); - void RestartPlayer(AController* NewPlayer); - - static APawn* SpawnDefaultPawnForHook(AGameModeBase* GameMode, AController* NewPlayer, AActor* StartSpot); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameSession.h b/dependencies/reboot/Project Reboot 3.0/GameSession.h deleted file mode 100644 index 38c626c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameSession.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "Controller.h" - -class AGameSession : public AActor -{ -public: - static inline void (*KickPlayerOriginal)(AGameSession*, AController*); - - static void KickPlayerHook(AGameSession*, AController*) { return; } - -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameState.cpp b/dependencies/reboot/Project Reboot 3.0/GameState.cpp deleted file mode 100644 index 7a7970a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameState.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "GameState.h" - -#include "GameplayStatics.h" - -#include "reboot.h" - -float AGameState::GetServerWorldTimeSeconds() -{ - UWorld* World = GetWorld(); - if (World) - { - static auto ServerWorldTimeSecondsDeltaOffset = this->GetOffset("ServerWorldTimeSecondsDelta"); - return UGameplayStatics::GetTimeSeconds(World) + Get(ServerWorldTimeSecondsDeltaOffset); - } - - return 0.f; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameState.h b/dependencies/reboot/Project Reboot 3.0/GameState.h deleted file mode 100644 index 968b012..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameState.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "Actor.h" - -class AGameState : public AActor -{ -public: - float GetServerWorldTimeSeconds(); // should be in AGameStateBase -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameplayAbilitySpec.h b/dependencies/reboot/Project Reboot 3.0/GameplayAbilitySpec.h deleted file mode 100644 index cfea209..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameplayAbilitySpec.h +++ /dev/null @@ -1,105 +0,0 @@ -#pragma once - -#include "Class.h" -#include "NetSerialization.h" - -#include "reboot.h" - -struct FGameplayAbilitySpecHandle -{ - int Handle; - - /* void GenerateNewHandle() - { - if (true) - { - Handle = rand(); - } - else - { - static int GHandle = 1; - Handle = ++GHandle; - } - } */ -}; - -struct FGameplayAbilityActivationInfo // TODO Move -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject("/Script/GameplayAbilities.GameplayAbilityActivationInfo"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } -}; - -struct FGameplayAbilitySpec : FFastArraySerializerItem -{ - static int GetStructSize() - { - static auto GameplayAbilitySpecStruct = FindObject("/Script/GameplayAbilities.GameplayAbilitySpec"); - static auto StructSize = GameplayAbilitySpecStruct->GetPropertiesSize(); - // *(int*)(__int64(GameplayAbilitySpecStruct) + Offsets::PropertiesSize); - // LOG_INFO(LogAbilities, "StructSize: {}", StructSize); - return StructSize; - } - - UObject*& GetAbility() - { - static auto AbilityOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "Ability"); - return *(UObject**)(__int64(this) + AbilityOffset); - } - - FGameplayAbilitySpecHandle& GetHandle() - { - static auto HandleOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "Handle"); - return *(FGameplayAbilitySpecHandle*)(__int64(this) + HandleOffset); - } - - FGameplayAbilityActivationInfo* GetActivationInfo() - { - static auto ActivationInfoOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "ActivationInfo"); - return (FGameplayAbilityActivationInfo*)(__int64(this) + ActivationInfoOffset); - } -}; - -static FGameplayAbilitySpec* MakeNewSpec(UClass* GameplayAbilityClass, UObject* SourceObject = nullptr, bool bAlreadyIsDefault = false) -{ - auto NewSpec = Alloc(FGameplayAbilitySpec::GetStructSize()); - - if (!NewSpec) - return nullptr; - - auto DefaultAbility = bAlreadyIsDefault ? GameplayAbilityClass : GameplayAbilityClass->CreateDefaultObject(); - - static auto ActiveCountOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "ActiveCount", false); - - bool bUseNativeSpecConstructor = Addresses::SpecConstructor; - - if (bUseNativeSpecConstructor) - { - static __int64 (*SpecConstructor)(__int64 spec, UObject* Ability, int Level, int InputID, UObject* SourceObject) = decltype(SpecConstructor)(Addresses::SpecConstructor); - - SpecConstructor(__int64(NewSpec), DefaultAbility, 1, -1, SourceObject); - } - else - { - static auto LevelOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "Level"); - static auto SourceObjectOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "SourceObject"); - static auto InputIDOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "InputID"); - static auto GameplayEffectHandleOffset = FindOffsetStruct("/Script/GameplayAbilities.GameplayAbilitySpec", "GameplayEffectHandle", false); - - ((FFastArraySerializerItem*)NewSpec)->MostRecentArrayReplicationKey = -1; - ((FFastArraySerializerItem*)NewSpec)->ReplicationID = -1; - ((FFastArraySerializerItem*)NewSpec)->ReplicationKey = -1; - - NewSpec->GetHandle().Handle = rand(); // proper! - NewSpec->GetAbility() = DefaultAbility; - *(int*)(__int64(NewSpec) + LevelOffset) = 1; - *(int*)(__int64(NewSpec) + InputIDOffset) = -1; - *(UObject**)(__int64(NewSpec) + SourceObjectOffset) = SourceObject; - } - - return NewSpec; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameplayAbilityTypes.h b/dependencies/reboot/Project Reboot 3.0/GameplayAbilityTypes.h deleted file mode 100644 index 669ad11..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameplayAbilityTypes.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "Array.h" -#include "Map.h" -#include "CurveTable.h" -#include "GameplayAbilitySpec.h" - -struct FGameplayAbilitySpecHandleAndPredictionKey -{ - FGameplayAbilitySpecHandle AbilityHandle; - int32 PredictionKeyAtCreation; -}; - -/*struct FGameplayAbilityReplicatedDataContainer -{ - typedef TPair> FKeyDataPair; - - TArray InUseData; - TArray> FreeData; -}; */ - -struct FScalableFloat // todo check where this actually goes -{ - float& GetValue() - { - static auto FloatOffset = FindOffsetStruct("/Script/GameplayAbilities.ScalableFloat", "Value"); - return *(float*)(__int64(this) + FloatOffset); - } - - FCurveTableRowHandle& GetCurve() - { - static auto CurveOffset = FindOffsetStruct("/Script/GameplayAbilities.ScalableFloat", "Curve"); - return *(FCurveTableRowHandle*)(__int64(this) + CurveOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameplayStatics.cpp b/dependencies/reboot/Project Reboot 3.0/GameplayStatics.cpp deleted file mode 100644 index 8ae158b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameplayStatics.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include "GameplayStatics.h" - -#include "reboot.h" - -TArray UGameplayStatics::GetAllActorsOfClass(const UObject* WorldContextObject, UClass* ActorClass) -{ - static auto fn = FindObject(L"/Script/Engine.GameplayStatics.GetAllActorsOfClass"); - - struct { const UObject* WorldContextObject; UClass* ActorClass; TArray OutActors; } - UGameplayStatics_GetAllActorsOfClass_Params{ WorldContextObject, ActorClass }; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(fn, &UGameplayStatics_GetAllActorsOfClass_Params); - - return UGameplayStatics_GetAllActorsOfClass_Params.OutActors; -} - -float UGameplayStatics::GetTimeSeconds(UObject* WorldContextObject) -{ - static auto fn = FindObject(L"/Script/Engine.GameplayStatics.GetTimeSeconds"); - - struct { UObject* WorldContextObject; float TimeSeconds; } GetTimeSecondsParams{WorldContextObject}; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(fn, &GetTimeSecondsParams); - - return GetTimeSecondsParams.TimeSeconds; -} - -UObject* UGameplayStatics::SpawnObject(UClass* ObjectClass, UObject* Outer) -{ - static auto fn = FindObject("/Script/Engine.GameplayStatics.SpawnObject"); - - struct - { - UClass* ObjectClass; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UObject* Outer; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UObject* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UGameplayStatics_SpawnObject_Params{ObjectClass, Outer}; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(fn, &UGameplayStatics_SpawnObject_Params); - - return UGameplayStatics_SpawnObject_Params.ReturnValue; -} - -/* void UGameplayStatics::OpenLevel(UObject* WorldContextObject, FName LevelName, bool bAbsolute, const FString& Options) -{ - static auto fn = FindObject("/Script/Engine.GameplayStatics.OpenLevel"); - - struct - { - UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName LevelName; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bAbsolute; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FString Options; // (Parm, ZeroConstructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UGameplayStatics_OpenLevel_Params{WorldContextObject, LevelName, bAbsolute, Options}; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(fn, &UGameplayStatics_OpenLevel_Params); -} */ - -void UGameplayStatics::RemovePlayer(APlayerController* Player, bool bDestroyPawn) -{ - static auto fn = FindObject("/Script/Engine.GameplayStatics.RemovePlayer"); - - struct - { - APlayerController* Player; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bDestroyPawn; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UGameplayStatics_RemovePlayer_Params{Player, bDestroyPawn}; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(fn, &UGameplayStatics_RemovePlayer_Params); -} - -AActor* UGameplayStatics::BeginDeferredActorSpawnFromClass(const UObject* WorldContextObject, UClass* ActorClass, const FTransform& SpawnTransform, ESpawnActorCollisionHandlingMethod CollisionHandlingOverride, AActor* Owner) -{ - static auto fn = FindObject(L"/Script/Engine.GameplayStatics.BeginDeferredActorSpawnFromClass"); - - struct - { - const UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UClass* ActorClass; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FTransform SpawnTransform; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - ESpawnActorCollisionHandlingMethod CollisionHandlingOverride; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AActor* Owner; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - AActor* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UGameplayStatics_BeginDeferredActorSpawnFromClass_Params{ WorldContextObject, ActorClass, SpawnTransform, CollisionHandlingOverride, Owner }; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(fn, &UGameplayStatics_BeginDeferredActorSpawnFromClass_Params); - - return UGameplayStatics_BeginDeferredActorSpawnFromClass_Params.ReturnValue; -} - -AActor* UGameplayStatics::FinishSpawningActor(AActor* Actor, const FTransform& SpawnTransform) -{ - static auto FinishSpawningActorFn = FindObject(L"/Script/Engine.GameplayStatics.FinishSpawningActor"); - - struct - { - AActor* Actor; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FTransform SpawnTransform; // (ConstParm, Parm, OutParm, ReferenceParm, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - AActor* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UGameplayStatics_FinishSpawningActor_Params{ Actor, SpawnTransform }; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(FinishSpawningActorFn, &UGameplayStatics_FinishSpawningActor_Params); - - return UGameplayStatics_FinishSpawningActor_Params.ReturnValue; -} - -void UGameplayStatics::LoadStreamLevel(UObject* WorldContextObject, FName LevelName, bool bMakeVisibleAfterLoad, bool bShouldBlockOnLoad, const FLatentActionInfo& LatentInfo) -{ - static auto LoadStreamLevelFn = FindObject(L"/Script/Engine.GameplayStatics.LoadStreamLevel"); - - struct - { - UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName LevelName; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bMakeVisibleAfterLoad; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bShouldBlockOnLoad; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FLatentActionInfo LatentInfo; // (Parm, NoDestructor, NativeAccessSpecifierPublic) - } UGameplayStatics_LoadStreamLevel_Params{WorldContextObject, LevelName, bMakeVisibleAfterLoad, bShouldBlockOnLoad, LatentInfo}; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(LoadStreamLevelFn, &UGameplayStatics_LoadStreamLevel_Params); -} - -void UGameplayStatics::UnloadStreamLevel(UObject* WorldContextObject, FName LevelName, const FLatentActionInfo& LatentInfo, bool bShouldBlockOnUnload) -{ - static auto UnloadStreamLevelFn = FindObject(L"/Script/Engine.GameplayStatics.UnloadStreamLevel"); - struct - { - UObject* WorldContextObject; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName LevelName; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FLatentActionInfo LatentInfo; // (Parm, NoDestructor, NativeAccessSpecifierPublic) - bool bShouldBlockOnUnload; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UGameplayStatics_UnloadStreamLevel_Params{WorldContextObject, LevelName, LatentInfo, bShouldBlockOnUnload}; - - static auto defaultObj = StaticClass(); - defaultObj->ProcessEvent(UnloadStreamLevelFn, &UGameplayStatics_UnloadStreamLevel_Params); -} - -UClass* UGameplayStatics::StaticClass() -{ - static auto Class = FindObject(L"/Script/Engine.GameplayStatics"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameplayStatics.h b/dependencies/reboot/Project Reboot 3.0/GameplayStatics.h deleted file mode 100644 index f335c7a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameplayStatics.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "Object.h" -#include "Array.h" -#include "Actor.h" -#include "LatentActionManager.h" -#include "EngineTypes.h" - -class UGameplayStatics : public UObject -{ -public: - static TArray GetAllActorsOfClass(const UObject* WorldContextObject, UClass* ActorClass); - static float GetTimeSeconds(UObject* WorldContextObject); - - static UObject* SpawnObject(UClass* ObjectClass, UObject* Outer); - - template - static ObjectType* SpawnObject(UClass* ObjectClass, UObject* Outer, bool bCheckType) - { - auto Object = SpawnObject(ObjectClass, Outer); - return bCheckType ? Cast(Object) : (ObjectType*)Object; - } - - // static void OpenLevel(UObject* WorldContextObject, FName LevelName, bool bAbsolute, const FString& Options); - static void RemovePlayer(class APlayerController* Player, bool bDestroyPawn); - static AActor* FinishSpawningActor(AActor* Actor, const FTransform& SpawnTransform); - static AActor* BeginDeferredActorSpawnFromClass(const UObject* WorldContextObject, UClass* ActorClass, const FTransform& SpawnTransform, ESpawnActorCollisionHandlingMethod CollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::Undefined, AActor* Owner = nullptr); - static void LoadStreamLevel(UObject* WorldContextObject, FName LevelName, bool bMakeVisibleAfterLoad, bool bShouldBlockOnLoad, const FLatentActionInfo& LatentInfo); - static void UnloadStreamLevel(UObject* WorldContextObject, FName LevelName, const FLatentActionInfo& LatentInfo, bool bShouldBlockOnUnload); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GameplayTagContainer.h b/dependencies/reboot/Project Reboot 3.0/GameplayTagContainer.h deleted file mode 100644 index f5e4475..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GameplayTagContainer.h +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once - -#include "NameTypes.h" -#include "Array.h" - -struct FGameplayTag -{ - static const int npos = -1; // lol? - - FName TagName; -}; - -struct FGameplayTagContainer -{ - TArray GameplayTags; - TArray ParentTags; - - std::string ToStringSimple(bool bQuoted) - { - std::string RetString; - for (int i = 0; i < GameplayTags.Num(); ++i) - { - if (bQuoted) - { - RetString += ("\""); - } - RetString += GameplayTags.at(i).TagName.ToString(); - if (bQuoted) - { - RetString += ("\""); - } - - if (i < GameplayTags.Num() - 1) - { - RetString += (", "); - } - } - return RetString; - } - - int Find(const std::string& Str) - { - for (int i = 0; i < GameplayTags.Num(); ++i) - { - if (GameplayTags.at(i).TagName.ToString() == Str) - return i; - } - - return FGameplayTag::npos; - } - - int Find(FGameplayTag& Tag) - { - return Find(Tag.TagName.ToString()); - } - - bool Contains(const std::string& Str) - { - return Find(Str) != FGameplayTag::npos; - } - - void Reset() - { - GameplayTags.Free(); - ParentTags.Free(); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GenericPlatformMath.cpp b/dependencies/reboot/Project Reboot 3.0/GenericPlatformMath.cpp deleted file mode 100644 index 1ac4280..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GenericPlatformMath.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "GenericPlatformMath.h" - -#include "UnrealMathUtility.h" - -#define PI (3.1415926535897932f) - -/*FORCENOINLINE*/ float FGenericPlatformMath::Fmod(float X, float Y) -{ - if (fabsf(Y) <= 1.e-8f) - { - // FmodReportError(X, Y); - return 0.f; - } - const float Div = (X / Y); - // All floats where abs(f) >= 2^23 (8388608) are whole numbers so do not need truncation, and avoid overflow in TruncToFloat as they get even larger. - const float Quotient = fabsf(Div) < 8388608.f ? TruncToFloat(Div) : Div; - float IntPortion = Y * Quotient; - - // Rounding and imprecision could cause IntPortion to exceed X and cause the result to be outside the expected range. - // For example Fmod(55.8, 9.3) would result in a very small negative value! - if (fabsf(IntPortion) > fabsf(X)) - { - IntPortion = X; - } - - const float Result = X - IntPortion; - return Result; -} - -float FGenericPlatformMath::Atan2(float Y, float X) -{ - //return atan2f(Y,X); - // atan2f occasionally returns NaN with perfectly valid input (possibly due to a compiler or library bug). - // We are replacing it with a minimax approximation with a max relative error of 7.15255737e-007 compared to the C library function. - // On PC this has been measured to be 2x faster than the std C version. - - const float absX = FMath::Abs(X); - const float absY = FMath::Abs(Y); - const bool yAbsBigger = (absY > absX); - float t0 = yAbsBigger ? absY : absX; // Max(absY, absX) - float t1 = yAbsBigger ? absX : absY; // Min(absX, absY) - - if (t0 == 0.f) - return 0.f; - - float t3 = t1 / t0; - float t4 = t3 * t3; - - static const float c[7] = { - +7.2128853633444123e-03f, - -3.5059680836411644e-02f, - +8.1675882859940430e-02f, - -1.3374657325451267e-01f, - +1.9856563505717162e-01f, - -3.3324998579202170e-01f, - +1.0f - }; - - t0 = c[0]; - t0 = t0 * t4 + c[1]; - t0 = t0 * t4 + c[2]; - t0 = t0 * t4 + c[3]; - t0 = t0 * t4 + c[4]; - t0 = t0 * t4 + c[5]; - t0 = t0 * t4 + c[6]; - t3 = t0 * t3; - - t3 = yAbsBigger ? (0.5f * PI) - t3 : t3; - t3 = (X < 0.0f) ? PI - t3 : t3; - t3 = (Y < 0.0f) ? -t3 : t3; - - return t3; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GenericPlatformMath.h b/dependencies/reboot/Project Reboot 3.0/GenericPlatformMath.h deleted file mode 100644 index a4f9bc6..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GenericPlatformMath.h +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once - -#include "inc.h" - -class FGenericPlatformMath -{ -public: - static constexpr FORCEINLINE int32 TruncToInt(float F) - { - return (int32)F; - } - - static constexpr FORCEINLINE float TruncToFloat(float F) - { - return (float)TruncToInt(F); - } - - template< class T > - static constexpr FORCEINLINE T Min(const T A, const T B) - { - return (A <= B) ? A : B; - } - - static FORCEINLINE float InvSqrt(float F) - { - return 1.0f / sqrtf(F); - } - - static FORCENOINLINE float Fmod(float X, float Y); - - static FORCEINLINE int32 FloorToInt(float F) - { - return TruncToInt(floorf(F)); - } - - template< class T, class U > - static FORCEINLINE T Lerp(const T& A, const T& B, const U& Alpha) - { - return (T)(A + Alpha * (B - A)); - } - - static FORCEINLINE float Loge(float Value) { return logf(Value); } - - template< class T > - static constexpr FORCEINLINE T Max(const T A, const T B) - { - return (A >= B) ? A : B; - } - - static FORCEINLINE float Sin(float Value) { return sinf(Value); } - static FORCEINLINE float Asin(float Value) { return asinf((Value < -1.f) ? -1.f : ((Value < 1.f) ? Value : 1.f)); } - static FORCEINLINE float Sinh(float Value) { return sinhf(Value); } - static FORCEINLINE float Cos(float Value) { return cosf(Value); } - static FORCEINLINE float Acos(float Value) { return acosf((Value < -1.f) ? -1.f : ((Value < 1.f) ? Value : 1.f)); } - static FORCEINLINE float Tan(float Value) { return tanf(Value); } - static FORCEINLINE float Atan(float Value) { return atanf(Value); } - static float Atan2(float Y, float X); - static FORCEINLINE float Sqrt(float Value) { return sqrtf(Value); } - static FORCEINLINE float Pow(float A, float B) { return powf(A, B); } - - template< class T > - static constexpr FORCEINLINE T Abs(const T A) - { - return (A >= (T)0) ? A : -A; - } - - static FORCEINLINE float FloorToFloat(float F) - { - return floorf(F); - } - - static FORCEINLINE double FloorToDouble(double F) - { - return floor(F); - } - - static FORCEINLINE int32 RoundToInt(float F) - { - return FloorToInt(F + 0.5f); - } - - static FORCEINLINE float Fractional(float Value) - { - return Value - TruncToFloat(Value); - } - - static FORCEINLINE double TruncToDouble(double F) - { - return trunc(F); - } - - static FORCEINLINE double Fractional(double Value) - { - return Value - TruncToDouble(Value); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/GenericPlatformMisc.h b/dependencies/reboot/Project Reboot 3.0/GenericPlatformMisc.h deleted file mode 100644 index 3f59c93..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GenericPlatformMisc.h +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once - diff --git a/dependencies/reboot/Project Reboot 3.0/GenericPlatformTime.h b/dependencies/reboot/Project Reboot 3.0/GenericPlatformTime.h deleted file mode 100644 index d412385..0000000 --- a/dependencies/reboot/Project Reboot 3.0/GenericPlatformTime.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "inc.h" - -struct FGenericPlatformTime -{ - static FORCEINLINE uint32 Cycles() - { - struct timeval tv{}; - FILETIME ft; - ULARGE_INTEGER uli{}; - - GetSystemTimeAsFileTime(&ft); // Get current time - uli.LowPart = ft.dwLowDateTime; - uli.HighPart = ft.dwHighDateTime; - - // Convert to microseconds - uli.QuadPart /= 10; - uli.QuadPart -= 11644473600000000ULL; - - tv.tv_sec = (long)(uli.QuadPart / 1000000); - tv.tv_usec = (long)(uli.QuadPart % 1000000); - return (uint32)((((uint64)tv.tv_sec) * 1000000ULL) + (((uint64)tv.tv_usec))); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/IdentityFunctor.h b/dependencies/reboot/Project Reboot 3.0/IdentityFunctor.h deleted file mode 100644 index ce15642..0000000 --- a/dependencies/reboot/Project Reboot 3.0/IdentityFunctor.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "inc.h" - -/** - * A functor which returns whatever is passed to it. Mainly used for generic composition. - */ -struct FIdentityFunctor -{ - template - FORCEINLINE T&& operator()(T&& Val) const - { - return (T&&)Val; - } -}; diff --git a/dependencies/reboot/Project Reboot 3.0/Interface.h b/dependencies/reboot/Project Reboot 3.0/Interface.h deleted file mode 100644 index 025d387..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Interface.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "Object.h" - -/** - * Base class for all interfaces - * - */ - -class UInterface : public UObject -{ - // DECLARE_CLASS_INTRINSIC(UInterface, UObject, CLASS_Interface | CLASS_Abstract, TEXT("/Script/CoreUObject")) -}; - -class IInterface -{ -protected: - - virtual ~IInterface() {} - -public: - - typedef UInterface UClassType; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/IntroSort.h b/dependencies/reboot/Project Reboot 3.0/IntroSort.h deleted file mode 100644 index e1abf2d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/IntroSort.h +++ /dev/null @@ -1,132 +0,0 @@ -#pragma once - -#include "GenericPlatformMath.h" -#include "IdentityFunctor.h" -#include "UnrealTemplate.h" -#include "Invoke.h" -#include "BinaryHeap.h" - -namespace AlgoImpl -{ - /** - * Implementation of an introspective sort. Starts with quick sort and switches to heap sort when the iteration depth is too big. - * The sort is unstable, meaning that the ordering of equal items is not necessarily preserved. - * This is the internal sorting function used by IntroSort overrides. - * - * @param First pointer to the first element to sort - * @param Num the number of items to sort - * @param Projection The projection to sort by when applied to the element. - * @param Predicate predicate class - */ - template - void IntroSortInternal(T* First, SIZE_T Num, ProjectionType Projection, PredicateType Predicate) - { - struct FStack - { - T* Min; - T* Max; - uint32 MaxDepth; - }; - - if (Num < 2) - { - return; - } - - FStack RecursionStack[32] = { {First, First + Num - 1, (uint32)(FMath::Loge(Num) * 2.f)} }, Current, Inner; - for (FStack* StackTop = RecursionStack; StackTop >= RecursionStack; --StackTop) //-V625 - { - Current = *StackTop; - - Loop: - int64 Count = Current.Max - Current.Min + 1; - - if (Current.MaxDepth == 0) - { - // We're too deep into quick sort, switch to heap sort - HeapSortInternal(Current.Min, Count, Projection, Predicate); - continue; - } - - if (Count <= 8) - { - // Use simple bubble-sort. - while (Current.Max > Current.Min) - { - T* Max, * Item; - for (Max = Current.Min, Item = Current.Min + 1; Item <= Current.Max; Item++) - { - if (Predicate(Invoke(Projection, *Max), Invoke(Projection, *Item))) - { - Max = Item; - } - } - Swap(*Max, *Current.Max--); - } - } - else - { - // Grab middle element so sort doesn't exhibit worst-cast behavior with presorted lists. - Swap(Current.Min[Count / 2], Current.Min[0]); - - // Divide list into two halves, one with items <=Current.Min, the other with items >Current.Max. - Inner.Min = Current.Min; - Inner.Max = Current.Max + 1; - for (; ; ) - { - while (++Inner.Min <= Current.Max && !Predicate(Invoke(Projection, *Current.Min), Invoke(Projection, *Inner.Min))); - while (--Inner.Max > Current.Min && !Predicate(Invoke(Projection, *Inner.Max), Invoke(Projection, *Current.Min))); - if (Inner.Min > Inner.Max) - { - break; - } - Swap(*Inner.Min, *Inner.Max); - } - Swap(*Current.Min, *Inner.Max); - - --Current.MaxDepth; - - // Save big half and recurse with small half. - if (Inner.Max - 1 - Current.Min >= Current.Max - Inner.Min) - { - if (Current.Min + 1 < Inner.Max) - { - StackTop->Min = Current.Min; - StackTop->Max = Inner.Max - 1; - StackTop->MaxDepth = Current.MaxDepth; - StackTop++; - } - if (Current.Max > Inner.Min) - { - Current.Min = Inner.Min; - goto Loop; - } - } - else - { - if (Current.Max > Inner.Min) - { - StackTop->Min = Inner.Min; - StackTop->Max = Current.Max; - StackTop->MaxDepth = Current.MaxDepth; - StackTop++; - } - if (Current.Min + 1 < Inner.Max) - { - Current.Max = Inner.Max - 1; - goto Loop; - } - } - } - } - } -} - -namespace Algo -{ - template - FORCEINLINE void IntroSort(RangeType& Range, PredicateType Predicate) - { - AlgoImpl::IntroSortInternal(GetData(Range), GetNum(Range), FIdentityFunctor(), MoveTemp(Predicate)); - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/InventoryManagementLibrary.cpp b/dependencies/reboot/Project Reboot 3.0/InventoryManagementLibrary.cpp deleted file mode 100644 index 9dda18c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/InventoryManagementLibrary.cpp +++ /dev/null @@ -1,254 +0,0 @@ -#include "InventoryManagementLibrary.h" -#include "FortItemDefinition.h" -#include "FortKismetLibrary.h" -#include "ScriptInterface.h" - -void UInventoryManagementLibrary::SwapItemsHook(UObject* Context, FFrame& Stack, void* Ret) -{ - TScriptInterface SourceOwner; - TScriptInterface TargetOwner; - TArray ItemGuids; - - Stack.StepCompiledIn(&SourceOwner); - Stack.StepCompiledIn(&TargetOwner); - Stack.StepCompiledIn(&ItemGuids); - - auto SourceObjectPointer = SourceOwner.ObjectPointer; - auto SourcePlayerController = Cast(SourceObjectPointer); - - LOG_INFO(LogDev, "Swapping."); - - if (!SourcePlayerController) - return SwapItemOriginal(Context, Stack, Ret); - - auto SourceWorldInventory = SourcePlayerController->GetWorldInventory(); - - if (!SourceWorldInventory) - return SwapItemsOriginal(Context, Stack, Ret); - - auto TargetObjectPointer = TargetOwner.ObjectPointer; - auto TargetPlayerController = Cast(TargetObjectPointer); - - if (!TargetPlayerController) - return SwapItemsOriginal(Context, Stack, Ret); - - auto TargetWorldInventory = TargetPlayerController->GetWorldInventory(); - - if (!TargetWorldInventory) - return SwapItemsOriginal(Context, Stack, Ret); - - for (int i = 0; i < ItemGuids.size(); i++) - { - auto& CurrentItemGuid = ItemGuids.at(i); - - auto ItemToSwapInstance = SourceWorldInventory->FindItemInstance(CurrentItemGuid.ItemGuid); - - if (!ItemToSwapInstance) - continue; - - TargetWorldInventory->AddItem(ItemToSwapInstance->GetItemEntry()->GetItemDefinition(), nullptr, CurrentItemGuid.Count, ItemToSwapInstance->GetItemEntry()->GetLoadedAmmo()); - SourceWorldInventory->RemoveItem(CurrentItemGuid.ItemGuid, nullptr, CurrentItemGuid.Count); // should we check return value? - } - - TargetWorldInventory->Update(); - SourceWorldInventory->Update(); - - return SwapItemsOriginal(Context, Stack, Ret); -} - -void UInventoryManagementLibrary::SwapItemHook(UObject* Context, FFrame& Stack, void* Ret) -{ - TScriptInterface SourceOwner; - TScriptInterface TargetOwner; - FGuid ItemGuid; - int32 Count; - - Stack.StepCompiledIn(&SourceOwner); - Stack.StepCompiledIn(&TargetOwner); - Stack.StepCompiledIn(&ItemGuid); - Stack.StepCompiledIn(&Count); - - auto SourceObjectPointer = SourceOwner.ObjectPointer; - auto SourcePlayerController = Cast(SourceObjectPointer); - - LOG_INFO(LogDev, "Swapping."); - - if (!SourcePlayerController) - return SwapItemOriginal(Context, Stack, Ret); - - auto SourceWorldInventory = SourcePlayerController->GetWorldInventory(); - - if (!SourceWorldInventory) - return SwapItemOriginal(Context, Stack, Ret); - - auto TargetObjectPointer = TargetOwner.ObjectPointer; - auto TargetPlayerController = Cast(TargetObjectPointer); - - if (!TargetPlayerController) - return SwapItemOriginal(Context, Stack, Ret); - - auto TargetWorldInventory = TargetPlayerController->GetWorldInventory(); - - if (!TargetWorldInventory) - return SwapItemOriginal(Context, Stack, Ret); - - auto ItemToSwapInstance = SourceWorldInventory->FindItemInstance(ItemGuid); - - if (!ItemToSwapInstance) - return SwapItemOriginal(Context, Stack, Ret); - - bool bShouldUpdateTarget = false; - TargetWorldInventory->AddItem(ItemToSwapInstance->GetItemEntry()->GetItemDefinition(), &bShouldUpdateTarget, Count, ItemToSwapInstance->GetItemEntry()->GetLoadedAmmo()); - - if (bShouldUpdateTarget) - TargetWorldInventory->Update(); - - bool bShouldUpdateSource = false; - SourceWorldInventory->RemoveItem(ItemGuid, &bShouldUpdateSource, Count); // should we check return value? - - if (bShouldUpdateSource) - SourceWorldInventory->Update(); - - return SwapItemOriginal(Context, Stack, Ret); -} - -void UInventoryManagementLibrary::RemoveItemsHook(UObject* Context, FFrame& Stack, void* Ret) -{ - TScriptInterface InventoryOwner; - TArray Items; - - Stack.StepCompiledIn(&InventoryOwner); - Stack.StepCompiledIn(&Items); - - auto ObjectPointer = InventoryOwner.ObjectPointer; - auto PlayerController = Cast(ObjectPointer); - - LOG_INFO(LogDev, "Taking list {} items from {}.", Items.Num(), __int64(PlayerController)); - - if (!PlayerController) - return RemoveItemOriginal(Context, Stack, Ret); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return RemoveItemOriginal(Context, Stack, Ret); - - for (int i = 0; i < Items.Num(); i++) - { - WorldInventory->RemoveItem(Items.at(i).ItemGuid, nullptr, Items.at(i).Count); - } - - WorldInventory->Update(); - - return RemoveItemOriginal(Context, Stack, Ret); -} - -void UInventoryManagementLibrary::RemoveItemHook(UObject* Context, FFrame& Stack, void* Ret) -{ - TScriptInterface InventoryOwner; // 0x0(0x10)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, NativeAccessSpecifierPublic) - FGuid ItemGuid; // 0x10(0x10)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int32 Count; - - Stack.StepCompiledIn(&InventoryOwner); - Stack.StepCompiledIn(&ItemGuid); - Stack.StepCompiledIn(&Count); - - auto ObjectPointer = InventoryOwner.ObjectPointer; - auto PlayerController = Cast(ObjectPointer); - - LOG_INFO(LogDev, "Taking {} items from {}.", Count, __int64(PlayerController)); - - if (!PlayerController) - return RemoveItemOriginal(Context, Stack, Ret); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return RemoveItemOriginal(Context, Stack, Ret); - - bool bShouldUpdate = false; - WorldInventory->RemoveItem(ItemGuid, &bShouldUpdate, Count); - - if (bShouldUpdate) - WorldInventory->Update(); - - return RemoveItemOriginal(Context, Stack, Ret); -} - -void UInventoryManagementLibrary::GiveItemEntryToInventoryOwnerHook(UObject* Context, FFrame& Stack, void* Ret) -{ - // Idk how to do the step with a itementry, allocate the size and then pass that pointer? idk. - - // TScriptInterface InventoryOwner; // 0x0(0x10)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, NativeAccessSpecifierPublic) - // __int64 ItemEntry; - - return GiveItemEntryToInventoryOwnerOriginal(Context, Stack, Ret); -} - -void UInventoryManagementLibrary::AddItemsHook(UObject* Context, FFrame& Stack, void* Ret) -{ - TScriptInterface InventoryOwner; // 0x0(0x10)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, NativeAccessSpecifierPublic) - TArray Items; - - Stack.StepCompiledIn(&InventoryOwner); - Stack.StepCompiledIn(&Items); - - auto ObjectPointer = InventoryOwner.ObjectPointer; - - auto PlayerController = Cast(ObjectPointer); - - LOG_INFO(LogDev, "Giving {} items to {}.", Items.Num(), __int64(PlayerController)); - - if (!PlayerController) - return AddItemsOriginal(Context, Stack, Ret); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - for (int i = 0; i < Items.Num(); ++i) - { - WorldInventory->AddItem(Items.at(i).GetItem(), nullptr, Items.at(i).GetCount()); - } - - WorldInventory->Update(); - - return AddItemsOriginal(Context, Stack, Ret); -} - -void UInventoryManagementLibrary::AddItemHook(UObject* Context, FFrame& Stack, void* Ret) -{ - TScriptInterface InventoryOwner; // 0x0(0x10)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, NativeAccessSpecifierPublic) - UFortItemDefinition* ItemDefinition; - int32 Count; // 0x18(0x4)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - - Stack.StepCompiledIn(&InventoryOwner); - Stack.StepCompiledIn(&ItemDefinition); - Stack.StepCompiledIn(&Count); - - LOG_INFO(LogDev, "[{}] ItemDefinition: {}", __FUNCTION__, __int64(ItemDefinition)); - - if (!ItemDefinition) - return AddItemOriginal(Context, Stack, Ret); - - auto ObjectPointer = InventoryOwner.ObjectPointer; - - auto PlayerController = Cast(ObjectPointer); - - if (!PlayerController) - return AddItemOriginal(Context, Stack, Ret); - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory) - return; - - bool bShouldUpdate = false; - WorldInventory->AddItem(ItemDefinition, &bShouldUpdate, bShouldUpdate, Count); - - if (bShouldUpdate) - WorldInventory->Update(); - - return AddItemOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/InventoryManagementLibrary.h b/dependencies/reboot/Project Reboot 3.0/InventoryManagementLibrary.h deleted file mode 100644 index 3385768..0000000 --- a/dependencies/reboot/Project Reboot 3.0/InventoryManagementLibrary.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "Object.h" -#include "Stack.h" - -class UInventoryManagementLibrary : public UObject // UBlueprintFunctionLibrary -{ -public: - static inline void (*AddItemOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*AddItemsOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*GiveItemEntryToInventoryOwnerOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*RemoveItemOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*RemoveItemsOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*SwapItemOriginal)(UObject* Context, FFrame& Stack, void* Ret); - static inline void (*SwapItemsOriginal)(UObject* Context, FFrame& Stack, void* Ret); - - static void SwapItemsHook(UObject* Context, FFrame& Stack, void* Ret); - static void SwapItemHook(UObject* Context, FFrame& Stack, void* Ret); - static void RemoveItemsHook(UObject* Context, FFrame& Stack, void* Ret); - static void RemoveItemHook(UObject* Context, FFrame& Stack, void* Ret); - static void GiveItemEntryToInventoryOwnerHook(UObject* Context, FFrame& Stack, void* Ret); - static void AddItemsHook(UObject* Context, FFrame& Stack, void* Ret); // Return value changes - static void AddItemHook(UObject* Context, FFrame& Stack, void* Ret); // Return value changes -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Invoke.h b/dependencies/reboot/Project Reboot 3.0/Invoke.h deleted file mode 100644 index f31a68d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Invoke.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#include "inc.h" - -#include "Decay.h" -#include "PointerIsConvertibleFromTo.h" -#include "EnableIf.h" - -namespace UE4Invoke_Private -{ - template - FORCEINLINE auto DereferenceIfNecessary(CallableType&& Callable) - -> typename TEnableIf::Type, typename TDecay::Type>::Value, decltype((CallableType&&)Callable)>::Type - { - return (CallableType&&)Callable; - } - - template - FORCEINLINE auto DereferenceIfNecessary(CallableType&& Callable) - -> typename TEnableIf::Type, typename TDecay::Type>::Value, decltype(*(CallableType&&)Callable)>::Type - { - return *(CallableType&&)Callable; - } -} - -template -FORCEINLINE auto Invoke(FuncType&& Func, ArgTypes&&... Args) --> decltype(Forward(Func)(Forward(Args)...)) -{ - return Forward(Func)(Forward(Args)...); -} - -template -FORCEINLINE auto Invoke(ReturnType ObjType::* pdm, CallableType&& Callable) --> decltype(UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*pdm) -{ - return UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*pdm; -} - -template -FORCEINLINE auto Invoke(ReturnType(ObjType::* PtrMemFun)(PMFArgTypes...), CallableType&& Callable, ArgTypes&&... Args) --> decltype((UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*PtrMemFun)(Forward(Args)...)) -{ - return (UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*PtrMemFun)(Forward(Args)...); -} - -template -FORCEINLINE auto Invoke(ReturnType(ObjType::* PtrMemFun)(PMFArgTypes...) const, CallableType&& Callable, ArgTypes&&... Args) --> decltype((UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*PtrMemFun)(Forward(Args)...)) -{ - return (UE4Invoke_Private::DereferenceIfNecessary(Forward(Callable)).*PtrMemFun)(Forward(Args)...); -} diff --git a/dependencies/reboot/Project Reboot 3.0/IsArithmetic.h b/dependencies/reboot/Project Reboot 3.0/IsArithmetic.h deleted file mode 100644 index 87818bc..0000000 --- a/dependencies/reboot/Project Reboot 3.0/IsArithmetic.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "inc.h" - -template -struct TIsArithmetic -{ - enum { Value = false }; -}; - -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; -template <> struct TIsArithmetic { enum { Value = true }; }; - -template struct TIsArithmetic { enum { Value = TIsArithmetic::Value }; }; -template struct TIsArithmetic< volatile T> { enum { Value = TIsArithmetic::Value }; }; -template struct TIsArithmetic { enum { Value = TIsArithmetic::Value }; }; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/IsEnum.h b/dependencies/reboot/Project Reboot 3.0/IsEnum.h deleted file mode 100644 index c1259f3..0000000 --- a/dependencies/reboot/Project Reboot 3.0/IsEnum.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -template -struct TIsEnum -{ - enum { Value = __is_enum(T) }; -}; diff --git a/dependencies/reboot/Project Reboot 3.0/IsPODType.h b/dependencies/reboot/Project Reboot 3.0/IsPODType.h deleted file mode 100644 index 5621379..0000000 --- a/dependencies/reboot/Project Reboot 3.0/IsPODType.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "inc.h" - -#include "IsPointer.h" -#include "AndOrNot.h" -#include "IsArithmetic.h" - -/** - * Traits class which tests if a type is POD. - */ - -#if defined(_MSC_VER) && _MSC_VER >= 1900 - // __is_pod changed in VS2015, however the results are still correct for all usages I've been able to locate. -#pragma warning(push) -#pragma warning(disable:4647) -#endif // _MSC_VER == 1900 - -template -struct TIsPODType -{ - enum { Value = TOrValue<__is_pod(T) || __is_enum(T), TIsArithmetic, TIsPointer>::Value }; -}; - -#if defined(_MSC_VER) && _MSC_VER >= 1900 -#pragma warning(pop) -#endif // _MSC_VER >= 1900 diff --git a/dependencies/reboot/Project Reboot 3.0/IsPointer.h b/dependencies/reboot/Project Reboot 3.0/IsPointer.h deleted file mode 100644 index 207373c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/IsPointer.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -template -struct TIsPointer -{ - enum { Value = false }; -}; - -template struct TIsPointer { enum { Value = true }; }; - -template struct TIsPointer { enum { Value = TIsPointer::Value }; }; -template struct TIsPointer< volatile T> { enum { Value = TIsPointer::Value }; }; -template struct TIsPointer { enum { Value = TIsPointer::Value }; }; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/IsTriviallyCopyConstructible.h b/dependencies/reboot/Project Reboot 3.0/IsTriviallyCopyConstructible.h deleted file mode 100644 index c1322d2..0000000 --- a/dependencies/reboot/Project Reboot 3.0/IsTriviallyCopyConstructible.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "inc.h" - -template -struct TIsTriviallyCopyConstructible -{ - enum { Value = __has_trivial_copy(T) }; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/KismetMathLibrary.cpp b/dependencies/reboot/Project Reboot 3.0/KismetMathLibrary.cpp deleted file mode 100644 index 029c977..0000000 --- a/dependencies/reboot/Project Reboot 3.0/KismetMathLibrary.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "KismetMathLibrary.h" - -#include "reboot.h" - -float UKismetMathLibrary::RandomFloatInRange(float min, float max) -{ - static auto fn = FindObject("/Script/Engine.KismetMathLibrary.RandomFloatInRange"); - - struct { float min; float max; float ret; } params{min, max}; - - static auto DefaultObject = StaticClass(); - DefaultObject->ProcessEvent(fn, ¶ms); - - return params.ret; -} - -UClass* UKismetMathLibrary::StaticClass() -{ - static auto Class = FindObject("/Script/Engine.KismetMathLibrary"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/KismetMathLibrary.h b/dependencies/reboot/Project Reboot 3.0/KismetMathLibrary.h deleted file mode 100644 index 0b99c3a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/KismetMathLibrary.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "Object.h" - -class UKismetMathLibrary : public UObject -{ -public: - static float RandomFloatInRange(float min, float max); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/KismetStringLibrary.cpp b/dependencies/reboot/Project Reboot 3.0/KismetStringLibrary.cpp deleted file mode 100644 index 9f1aaee..0000000 --- a/dependencies/reboot/Project Reboot 3.0/KismetStringLibrary.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "KismetStringLibrary.h" - -#include "reboot.h" - -FName UKismetStringLibrary::Conv_StringToName(const FString& InString) -{ - static auto Conv_StringToName = FindObject(L"/Script/Engine.KismetStringLibrary.Conv_StringToName"); - static auto Default__KismetStringLibrary = FindObject(L"/Script/Engine.Default__KismetStringLibrary"); - - struct { FString InString; FName ReturnValue; } Conv_StringToName_Params{ InString }; - - Default__KismetStringLibrary->ProcessEvent(Conv_StringToName, &Conv_StringToName_Params); - - return Conv_StringToName_Params.ReturnValue; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/KismetStringLibrary.h b/dependencies/reboot/Project Reboot 3.0/KismetStringLibrary.h deleted file mode 100644 index 2db22fc..0000000 --- a/dependencies/reboot/Project Reboot 3.0/KismetStringLibrary.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "Object.h" -#include "UnrealString.h" - -class UKismetStringLibrary : public UObject -{ -public: - static FName Conv_StringToName(const FString& InString); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/KismetSystemLibrary.cpp b/dependencies/reboot/Project Reboot 3.0/KismetSystemLibrary.cpp deleted file mode 100644 index c1a2fca..0000000 --- a/dependencies/reboot/Project Reboot 3.0/KismetSystemLibrary.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "KismetSystemLibrary.h" - -#include "gui.h" - -void UKismetSystemLibrary::PrintStringHook(UObject* Context, FFrame* Stack, void* Ret) -{ - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FString inString; // (Parm, ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bPrintToScreen; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bPrintToLog; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FLinearColor TextColor; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float Duration; - - Stack->StepCompiledIn(&WorldContextObject); - Stack->StepCompiledIn(&inString); - Stack->StepCompiledIn(&bPrintToScreen); - Stack->StepCompiledIn(&bPrintToLog); - Stack->StepCompiledIn(&TextColor); - Stack->StepCompiledIn(&Duration); - - if (bEngineDebugLogs) - LOG_INFO(LogDev, "GameLog: {}", inString.ToString()); - - return PrintStringOriginal(Context, Stack, Ret); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/KismetSystemLibrary.h b/dependencies/reboot/Project Reboot 3.0/KismetSystemLibrary.h deleted file mode 100644 index 7c31348..0000000 --- a/dependencies/reboot/Project Reboot 3.0/KismetSystemLibrary.h +++ /dev/null @@ -1,217 +0,0 @@ -#pragma once - -#include "Object.h" -#include "UnrealString.h" - -#include "reboot.h" -#include "Stack.h" - -enum class EDrawDebugTrace : uint8_t -{ - None = 0, - ForOneFrame = 1, - ForDuration = 2, - Persistent = 3, - EDrawDebugTrace_MAX = 4 -}; - -enum class ETraceTypeQuery : uint8_t -{ - TraceTypeQuery1 = 0, - TraceTypeQuery2 = 1, - TraceTypeQuery3 = 2, - TraceTypeQuery4 = 3, - TraceTypeQuery5 = 4, - TraceTypeQuery6 = 5, - TraceTypeQuery7 = 6, - TraceTypeQuery8 = 7, - TraceTypeQuery9 = 8, - TraceTypeQuery10 = 9, - TraceTypeQuery11 = 10, - TraceTypeQuery12 = 11, - TraceTypeQuery13 = 12, - TraceTypeQuery14 = 13, - TraceTypeQuery15 = 14, - TraceTypeQuery16 = 15, - TraceTypeQuery17 = 16, - TraceTypeQuery18 = 17, - TraceTypeQuery19 = 18, - TraceTypeQuery20 = 19, - TraceTypeQuery21 = 20, - TraceTypeQuery22 = 21, - TraceTypeQuery23 = 22, - TraceTypeQuery24 = 23, - TraceTypeQuery25 = 24, - TraceTypeQuery26 = 25, - TraceTypeQuery27 = 26, - TraceTypeQuery28 = 27, - TraceTypeQuery29 = 28, - TraceTypeQuery30 = 29, - TraceTypeQuery31 = 30, - TraceTypeQuery32 = 31, - TraceTypeQuery_MAX = 32, - ETraceTypeQuery_MAX = 33 -}; - -struct FLinearColor -{ - float R; // 0x0000(0x0004) (Edit, BlueprintVisible, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float G; // 0x0004(0x0004) (Edit, BlueprintVisible, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float B; // 0x0008(0x0004) (Edit, BlueprintVisible, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float A; // 0x000C(0x0004) (Edit, BlueprintVisible, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - - inline FLinearColor() - : R(0), G(0), B(0), A(0) - { } - - inline FLinearColor(float r, float g, float b, float a) - : R(r), - G(g), - B(b), - A(a) - { } - -}; - -class UKismetSystemLibrary : public UObject -{ -public: - static inline void (*PrintStringOriginal)(UObject* Context, FFrame* Stack, void* Ret); - - static FString GetPathName(UObject* Object) - { - static auto GetPathNameFunction = FindObject("/Script/Engine.KismetSystemLibrary.GetPathName"); - static auto KismetSystemLibrary = FindObject("/Script/Engine.Default__KismetSystemLibrary"); - - struct { UObject* Object; FString ReturnValue; } GetPathName_Params{ Object }; - - KismetSystemLibrary->ProcessEvent(GetPathNameFunction, &GetPathName_Params); - - auto Ret = GetPathName_Params.ReturnValue; - - return Ret; - } - - static void ExecuteConsoleCommand(UObject* WorldContextObject, const FString& Command, class APlayerController* SpecificPlayer) - { - static auto KismetSystemLibrary = FindObject("/Script/Engine.Default__KismetSystemLibrary"); - static auto fn = FindObject("/Script/Engine.KismetSystemLibrary.ExecuteConsoleCommand"); - - struct { - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FString Command; // (Parm, ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - class APlayerController* SpecificPlayer; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UKismetSystemLibrary_ExecuteConsoleCommand_Params{WorldContextObject, Command, SpecificPlayer}; - - KismetSystemLibrary->ProcessEvent(fn, &UKismetSystemLibrary_ExecuteConsoleCommand_Params); - } - - static bool LineTraceSingle(UObject* WorldContextObject, FVector Start, FVector End, ETraceTypeQuery TraceChannel, bool bTraceComplex, - TArray ActorsToIgnore, EDrawDebugTrace DrawDebugType, bool bIgnoreSelf, FLinearColor TraceColor, FLinearColor TraceHitColor, - float DrawTime, FHitResult** OutHit) - { - static auto LineTraceSingleFn = FindObject("/Script/Engine.KismetSystemLibrary.LineTraceSingle"); - - if (!LineTraceSingleFn) - return false; - - struct UKismetSystemLibrary_LineTraceSingle_Params - { - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Start; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector End; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - ETraceTypeQuery TraceChannel; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bTraceComplex; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - TArray ActorsToIgnore; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, NativeAccessSpecifierPublic) - EDrawDebugTrace DrawDebugType; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FHitResult OutHit; // (Parm, OutParm, IsPlainOldData, NoDestructor, ContainsInstancedReference, NativeAccessSpecifierPublic) - bool bIgnoreSelf; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FLinearColor TraceColor; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FLinearColor TraceHitColor; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float DrawTime; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - }; - - static auto ReturnValueOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingle", "ReturnValue"); - static auto OutHitOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingle", "OutHit"); - static auto bIgnoreSelfOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingle", "bIgnoreSelf"); - - static auto ParamsSize = LineTraceSingleFn->GetPropertiesSize(); - auto Params = Alloc(ParamsSize); - - ((UKismetSystemLibrary_LineTraceSingle_Params*)Params)->WorldContextObject = WorldContextObject; - ((UKismetSystemLibrary_LineTraceSingle_Params*)Params)->Start = Start; - ((UKismetSystemLibrary_LineTraceSingle_Params*)Params)->End = End; - ((UKismetSystemLibrary_LineTraceSingle_Params*)Params)->TraceChannel = TraceChannel; - ((UKismetSystemLibrary_LineTraceSingle_Params*)Params)->bTraceComplex = bTraceComplex; - *(bool*)(__int64(Params) + bIgnoreSelfOffset) = bIgnoreSelf; - - static auto KismetSystemLibrary = FindObject(L"/Script/Engine.Default__KismetSystemLibrary"); - KismetSystemLibrary->ProcessEvent(LineTraceSingleFn, Params); - - if (OutHit) - *OutHit = (FHitResult*)(__int64(Params) + OutHitOffset); - - bool ReturnValue = *(bool*)(__int64(Params) + ReturnValueOffset); - - // VirtualFree(Params, 0, MEM_RELEASE); - - return ReturnValue; - } - - static bool LineTraceSingleByProfile(UObject* WorldContextObject, const FVector& Start, const FVector& End, FName ProfileName, bool bTraceComplex, - const TArray& ActorsToIgnore, EDrawDebugTrace DrawDebugType, FHitResult** OutHit, bool bIgnoreSelf, const FLinearColor& TraceColor, - const FLinearColor& TraceHitColor, float DrawTime) - { - auto LineTraceSingleByProfileFn = FindObject(L"/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile"); - - if (!LineTraceSingleByProfileFn) - return false; - - struct UKismetSystemLibrary_LineTraceSingleByProfile_Params - { - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Start; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector End; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName ProfileName; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bTraceComplex; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - TArray ActorsToIgnore; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, NativeAccessSpecifierPublic) - EDrawDebugTrace DrawDebugType; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FHitResult OutHit; // (Parm, OutParm, IsPlainOldData, NoDestructor, ContainsInstancedReference, NativeAccessSpecifierPublic) - bool bIgnoreSelf; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FLinearColor TraceColor; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FLinearColor TraceHitColor; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float DrawTime; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, AdvancedDisplay, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - }; - - static auto ParamSize = LineTraceSingleByProfileFn->GetPropertiesSize(); - auto Params = Alloc(ParamSize); - - static auto WorldContextObjectOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile", "WorldContextObject"); - static auto StartOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile", "Start"); - static auto EndOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile", "End"); - static auto ProfileNameOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile", "ProfileName"); - static auto bTraceComplexOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile", "bTraceComplex"); - static auto ReturnValueOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile", "ReturnValue"); - static auto OutHitOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile", "OutHit"); - static auto bIgnoreSelfOffset = FindOffsetStruct("/Script/Engine.KismetSystemLibrary.LineTraceSingleByProfile", "bIgnoreSelf"); - - *(UObject**)(__int64(Params) + WorldContextObjectOffset) = WorldContextObject; - *(FVector*)(__int64(Params) + StartOffset) = Start; - *(FVector*)(__int64(Params) + EndOffset) = End; - *(FName*)(__int64(Params) + ProfileNameOffset) = ProfileName; - *(bool*)(__int64(Params) + bTraceComplexOffset) = bTraceComplex; - *(bool*)(__int64(Params) + bIgnoreSelfOffset) = bIgnoreSelf; - - static auto KismetSystemLibrary = FindObject("/Script/Engine.Default__KismetSystemLibrary"); - KismetSystemLibrary->ProcessEvent(LineTraceSingleByProfileFn, Params); - - if (OutHit) - *OutHit = (FHitResult*)(__int64(Params) + OutHitOffset); - - return *(bool*)(__int64(Params) + ReturnValueOffset); - } - - static void PrintStringHook(UObject* Context, FFrame* Stack, void* Ret); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/KismetTextLibrary.cpp b/dependencies/reboot/Project Reboot 3.0/KismetTextLibrary.cpp deleted file mode 100644 index 72060b7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/KismetTextLibrary.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "KismetTextLibrary.h" - -#include "reboot.h" - -FText UKismetTextLibrary::Conv_StringToText(const FString& inString) -{ - static auto Conv_StringToTextFn = FindObject("/Script/Engine.KismetTextLibrary.Conv_StringToText"); - - struct - { - FString inString; // (Parm, ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FText ReturnValue; // (Parm, OutParm, ReturnParm, NativeAccessSpecifierPublic) - }UKismetTextLibrary_Conv_StringToText_Params{inString}; - - static auto Default__KismetTextLibrary = FindObject("/Script/Engine.Default__KismetTextLibrary"); - Default__KismetTextLibrary->ProcessEvent(Conv_StringToTextFn, &UKismetTextLibrary_Conv_StringToText_Params); - - return UKismetTextLibrary_Conv_StringToText_Params.ReturnValue; -} - -FString UKismetTextLibrary::Conv_TextToString(FText InText) -{ - static auto Conv_TextToStringFn = FindObject("/Script/Engine.KismetTextLibrary.Conv_TextToString"); - - struct - { - FText InText; // (ConstParm, Parm, OutParm, ReferenceParm, NativeAccessSpecifierPublic) - FString ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } UKismetTextLibrary_Conv_TextToString_Params{InText}; - - static auto Default__KismetTextLibrary = FindObject("/Script/Engine.Default__KismetTextLibrary"); - Default__KismetTextLibrary->ProcessEvent(Conv_TextToStringFn, &UKismetTextLibrary_Conv_TextToString_Params); - - return UKismetTextLibrary_Conv_TextToString_Params.ReturnValue; -} - -UClass* UKismetTextLibrary::StaticClass() -{ - static auto Class = FindObject("/Script/Engine.KismetTextLibrary"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/KismetTextLibrary.h b/dependencies/reboot/Project Reboot 3.0/KismetTextLibrary.h deleted file mode 100644 index ced1532..0000000 --- a/dependencies/reboot/Project Reboot 3.0/KismetTextLibrary.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "Object.h" -#include "UnrealString.h" -#include "Text.h" - -class UKismetTextLibrary : public UObject -{ -public: - static FText Conv_StringToText(const FString& inString); - static FString Conv_TextToString(FText InText); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/LatentActionManager.h b/dependencies/reboot/Project Reboot 3.0/LatentActionManager.h deleted file mode 100644 index 7d18bee..0000000 --- a/dependencies/reboot/Project Reboot 3.0/LatentActionManager.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "Object.h" - -struct FLatentActionInfo -{ - int Linkage = 0; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - int UUID = 0; // 0x0004(0x0004) (ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName ExecutionFunction; // 0x0008(0x0008) (ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - UObject* CallbackTarget = nullptr; // 0x0010(0x0008) (ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic) -}; - diff --git a/dependencies/reboot/Project Reboot 3.0/Level.cpp b/dependencies/reboot/Project Reboot 3.0/Level.cpp deleted file mode 100644 index a206634..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Level.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "Level.h" - -UWorld*& ULevel::GetOwningWorld() -{ - static auto OwningWorldOffset = GetOffset("OwningWorld"); - return Get(OwningWorldOffset); -} - -bool ULevel::HasVisibilityChangeRequestPending() -{ - // I believe implementation on this changes depending on the version - - auto OwningWorld = GetOwningWorld(); - - if (!OwningWorld) - return false; - - static auto CurrentLevelPendingVisibilityOffset = OwningWorld->GetOffset("CurrentLevelPendingVisibility"); - auto CurrentLevelPendingVisibility = OwningWorld->Get(CurrentLevelPendingVisibilityOffset); - - static auto CurrentLevelPendingInvisibilityOffset= OwningWorld->GetOffset("CurrentLevelPendingInvisibility"); - auto CurrentLevelPendingInvisibility = OwningWorld->Get(CurrentLevelPendingInvisibilityOffset); - - return this == CurrentLevelPendingVisibility || this == CurrentLevelPendingInvisibility; -} - -AWorldSettings* ULevel::GetWorldSettings(bool bChecked) const -{ - if (bChecked) - { - // checkf(WorldSettings != nullptr, TEXT("%s"), *GetPathName()); - } - - static auto WorldSettingsOffset = GetOffset("WorldSettings"); - return Get(WorldSettingsOffset); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Level.h b/dependencies/reboot/Project Reboot 3.0/Level.h deleted file mode 100644 index 7cafb9c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Level.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "World.h" - -class ULevel : public UObject -{ -public: - UWorld*& GetOwningWorld(); - bool HasVisibilityChangeRequestPending(); - AWorldSettings* GetWorldSettings(bool bChecked = true) const; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/LevelActor.cpp b/dependencies/reboot/Project Reboot 3.0/LevelActor.cpp deleted file mode 100644 index a6413f1..0000000 --- a/dependencies/reboot/Project Reboot 3.0/LevelActor.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "World.h" diff --git a/dependencies/reboot/Project Reboot 3.0/LevelStreaming.h b/dependencies/reboot/Project Reboot 3.0/LevelStreaming.h deleted file mode 100644 index 8737dc9..0000000 --- a/dependencies/reboot/Project Reboot 3.0/LevelStreaming.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "Object.h" - -class ULevelStreaming : public UObject -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/LevelStreamingDynamic.h b/dependencies/reboot/Project Reboot 3.0/LevelStreamingDynamic.h deleted file mode 100644 index 844f634..0000000 --- a/dependencies/reboot/Project Reboot 3.0/LevelStreamingDynamic.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "LevelStreaming.h" - -#include "UnrealString.h" -#include "Rotator.h" -#include "Vector.h" - -#include "reboot.h" // too lazy to make cpp file for this - -class ULevelStreamingDynamic : public ULevelStreaming -{ -public: - static ULevelStreamingDynamic* LoadLevelInstance(UObject* WorldContextObject, FString LevelName, FVector Location, FRotator Rotation, bool* bOutSuccess = nullptr) - { - static auto LoadLevelInstanceFn = FindObject(L"/Script/Engine.LevelStreamingDynamic.LoadLevelInstance"); - - struct - { - UObject* WorldContextObject; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FString LevelName; // (Parm, ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FVector Location; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FRotator Rotation; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - bool bOutSuccess; // (Parm, OutParm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - ULevelStreamingDynamic* ReturnValue; // (Parm, OutParm, ZeroConstructor, ReturnParm, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - }ULevelStreamingDynamic_LoadLevelInstance_Params{ WorldContextObject, LevelName, Location, Rotation }; - - auto defaultObj = FindObject(L"/Script/Engine.Default__LevelStreamingDynamic"); - defaultObj->ProcessEvent(LoadLevelInstanceFn, &ULevelStreamingDynamic_LoadLevelInstance_Params); - - if (bOutSuccess) - *bOutSuccess = ULevelStreamingDynamic_LoadLevelInstance_Params.bOutSuccess; - - return ULevelStreamingDynamic_LoadLevelInstance_Params.ReturnValue; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Map.h b/dependencies/reboot/Project Reboot 3.0/Map.h deleted file mode 100644 index 2209080..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Map.h +++ /dev/null @@ -1,159 +0,0 @@ -#pragma once - -#include "Set.h" - -// template -// using TPair = TTuple; - -template -class TPair -{ -public: - KeyType First; - ValueType Second; - - FORCEINLINE KeyType& Key() - { - return First; - } - FORCEINLINE const KeyType& Key() const - { - return First; - } - FORCEINLINE ValueType& Value() - { - return Second; - } - FORCEINLINE const ValueType& Value() const - { - return Second; - } -}; - -template -class TMap -{ -public: - typedef TPair ElementType; - -public: - TSet Pairs; - -public: - class FBaseIterator - { - private: - TMap& IteratedMap; - TSet::FBaseIterator SetIt; - - public: - FBaseIterator(TMap& InMap, TSet::FBaseIterator InSet) - : IteratedMap(InMap) - , SetIt(InSet) - { - } - FORCEINLINE TMap::FBaseIterator operator++() - { - ++SetIt; - return *this; - } - FORCEINLINE TMap::ElementType& operator*() - { - return *SetIt; - } - FORCEINLINE const TMap::ElementType& operator*() const - { - return *SetIt; - } - FORCEINLINE bool operator==(const TMap::FBaseIterator& Other) const - { - return SetIt == Other.SetIt; - } - FORCEINLINE bool operator!=(const TMap::FBaseIterator& Other) const - { - return SetIt != Other.SetIt; - } - FORCEINLINE bool IsElementValid() const - { - return SetIt.IsElementValid(); - } - }; - - FORCEINLINE TMap::FBaseIterator begin() - { - return TMap::FBaseIterator(*this, Pairs.begin()); - } - FORCEINLINE const TMap::FBaseIterator begin() const - { - return TMap::FBaseIterator(*this, Pairs.begin()); - } - FORCEINLINE TMap::FBaseIterator end() - { - return TMap::FBaseIterator(*this, Pairs.end()); - } - FORCEINLINE const TMap::FBaseIterator end() const - { - return TMap::FBaseIterator(*this, Pairs.end()); - } - FORCEINLINE ValueType& operator[](const KeyType& Key) - { - return this->GetByKey(Key); - } - FORCEINLINE const ValueType& operator[](const KeyType& Key) const - { - return this->GetByKey(Key); - } - FORCEINLINE int32 Num() const - { - return Pairs.Num(); - } - FORCEINLINE bool IsValid() const - { - return Pairs.IsValid(); - } - FORCEINLINE bool IsIndexValid(int32 IndexToCheck) const - { - return Pairs.IsIndexValid(IndexToCheck); - } - FORCEINLINE bool Contains(const KeyType& ElementToLookFor) const - { - for (auto& Element : *this) - { - if (Element.Key() == ElementToLookFor) - return true; - } - return false; - } - FORCEINLINE ValueType& GetByKey(const KeyType& Key, bool* wasSuccessful = nullptr) - { - for (auto& Pair : *this) - { - if (Pair.Key() == Key) - { - if (wasSuccessful) - *wasSuccessful = true; - - return Pair.Value(); - } - } - - // LOG_INFO(LogDev, "Failed to find Key!!!"); - - if (wasSuccessful) - *wasSuccessful = false; - } - FORCEINLINE ValueType& Find(const KeyType& Key, bool* wasSuccessful = nullptr) - { - return GetByKey(Key, wasSuccessful); - } - FORCEINLINE ValueType GetByKeyNoRef(const KeyType& Key) - { - for (auto& Pair : *this) - { - if (Pair.Key() == Key) - { - return Pair.Value(); - } - } - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/MegaStormManager.h b/dependencies/reboot/Project Reboot 3.0/MegaStormManager.h deleted file mode 100644 index 8f0b640..0000000 --- a/dependencies/reboot/Project Reboot 3.0/MegaStormManager.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "Actor.h" - -#include "reboot.h" - -struct FMegaStormCircle -{ - int GetStructSize() - { - static auto MegaStormCircleStruct = FindObject("/Script/FortniteGame.MegaStormCircle"); - return MegaStormCircleStruct->GetPropertiesSize(); - } -}; - -class AMegaStormManager : public AActor -{ -public: - TArray<__int64>& GetMegaStormCircles() - { - static auto MegaStormCirclesOffset = GetOffset("MegaStormCircles"); - return Get>(MegaStormCirclesOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/MemoryOps.h b/dependencies/reboot/Project Reboot 3.0/MemoryOps.h deleted file mode 100644 index 737dabf..0000000 --- a/dependencies/reboot/Project Reboot 3.0/MemoryOps.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "inc.h" - -#include "EnableIf.h" -#include "UnrealTypeTraits.h" - -template -FORCEINLINE typename TEnableIf::Value>::Type ConstructItems(void* Dest, const SourceElementType* Source, SizeType Count, int ElementSize = sizeof(SourceElementType)) -{ - while (Count) - { - new (Dest) DestinationElementType(*Source); - ++(DestinationElementType*&)Dest; - ++Source; - --Count; - } -} - -template -FORCEINLINE typename TEnableIf::Value>::Type ConstructItems(void* Dest, const SourceElementType* Source, SizeType Count, int ElementSize = sizeof(SourceElementType)) -{ - // FMemory::Memcpy(Dest, Source, ElementSize * Count); - memcpy(Dest, Source, ElementSize); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/NameTypes.cpp b/dependencies/reboot/Project Reboot 3.0/NameTypes.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/dependencies/reboot/Project Reboot 3.0/NameTypes.h b/dependencies/reboot/Project Reboot 3.0/NameTypes.h deleted file mode 100644 index 68bde9d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NameTypes.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include "inc.h" -#include "log.h" - -struct FNameEntryId -{ - uint32 Value; // well depends on version if its int32 or uint32 i think - - FNameEntryId() : Value(0) {} - - FNameEntryId(uint32 value) : Value(value) {} - - bool operator<(FNameEntryId Rhs) const { return Value < Rhs.Value; } - bool operator>(FNameEntryId Rhs) const { return Rhs.Value < Value; } - bool operator==(FNameEntryId Rhs) const { return Value == Rhs.Value; } - bool operator!=(FNameEntryId Rhs) const { return Value != Rhs.Value; } -}; - -#define WITH_CASE_PRESERVING_NAME 1 // ?? - -struct FName -{ - FNameEntryId ComparisonIndex; - uint32 Number; - - FORCEINLINE int32 GetNumber() const - { - return Number; - } - - FORCEINLINE FNameEntryId GetComparisonIndexFast() const - { - return ComparisonIndex; - } - - std::string ToString() const; - std::string ToString(); - - FName() : ComparisonIndex(0), Number(0) {} - - FName(uint32 Value) : ComparisonIndex(Value), Number(0) {} - - bool IsValid() { return ComparisonIndex.Value > 0; } // for real - - FORCEINLINE bool operator==(const FName& Other) const // HMM?? - { -#if WITH_CASE_PRESERVING_NAME - return GetComparisonIndexFast() == Other.GetComparisonIndexFast() && GetNumber() == Other.GetNumber(); -#else - // static_assert(sizeof(CompositeComparisonValue) == sizeof(*this), "ComparisonValue does not cover the entire FName state"); - // return CompositeComparisonValue == Other.CompositeComparisonValue; -#endif - } - - int32 Compare(const FName& Other) const; - - /* FORCEINLINE bool operator<(const FName& Other) const - { - return Compare(Other) < 0; - } */ - - FORCEINLINE bool operator<(const FName& Rhs) const - { - auto res = this->ComparisonIndex == Rhs.ComparisonIndex ? /* (Number - Rhs.Number) < 0 */ Number < Rhs.Number : this->ComparisonIndex < Rhs.ComparisonIndex; - // LOG_INFO(LogDev, "LHS ({} {}) RHS ({} {}) RESULT {}", this->ComparisonIndex.Value, this->Number, Rhs.ComparisonIndex.Value, Rhs.Number, res); - return res; - // return GetComparisonIndexFast() < Rhs.GetComparisonIndexFast() || (GetComparisonIndexFast() == Rhs.GetComparisonIndexFast() && GetNumber() < Rhs.GetNumber()); - - // (Milxnor) BRO IDK - - if (GetComparisonIndexFast() == Rhs.GetComparisonIndexFast()) - { - return (GetNumber() - Rhs.GetNumber()) < 0; - } - - return GetComparisonIndexFast() < Rhs.GetComparisonIndexFast(); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/NetConnection.cpp b/dependencies/reboot/Project Reboot 3.0/NetConnection.cpp deleted file mode 100644 index 5e75be6..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NetConnection.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "NetConnection.h" - -bool UNetConnection::ClientHasInitializedLevelFor(const AActor* TestActor) const -{ - static auto ClientHasInitializedLevelForAddr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 8B 5A 20 48 8B F1 4C 8B C3", false).Get(); - - if (!ClientHasInitializedLevelForAddr) - { - ClientHasInitializedLevelForAddr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 8B 5A 20 48 8B F1 4C 8B C3 48 8D", false).Get(); // 1.8 - - if (!ClientHasInitializedLevelForAddr) - { - ClientHasInitializedLevelForAddr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 8B F9 48 85 D2 74 35 48").Get(); // 1.7.2 - } - } - - if (!ClientHasInitializedLevelForAddr) - return true; - - static bool (*ClientHasInitializedLevelForOriginal)(const UNetConnection * Connection, const AActor * TestActor) - = decltype(ClientHasInitializedLevelForOriginal)(ClientHasInitializedLevelForAddr); - // ^ This is virtual but it doesn't really matter - - return ClientHasInitializedLevelForOriginal(this, TestActor); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/NetConnection.h b/dependencies/reboot/Project Reboot 3.0/NetConnection.h deleted file mode 100644 index 774b7ec..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NetConnection.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include "Player.h" -#include "Array.h" -#include "Map.h" -#include "WeakObjectPtrTemplates.h" -#include "ActorChannel.h" -#include - -class UNetConnection : public UPlayer -{ -public: - AActor*& GetOwningActor() - { - static auto OwningActorOffset = GetOffset("OwningActor"); - return Get(OwningActorOffset); - } - - FName& GetClientWorldPackageName() const - { - static auto ClientWorldPackageNameOffset = Offsets::ClientWorldPackageName; - return *(FName*)(__int64(this) + ClientWorldPackageNameOffset); - } - - AActor*& GetViewTarget() - { - static auto ViewTargetOffset = GetOffset("ViewTarget"); - return Get(ViewTargetOffset); - } - - int32 IsNetReady(bool Saturate) - { - static auto IsNetReadyOffset = 0x298; // 1.11 - int32 (*IsNetReadyOriginal)(UNetConnection* Connection, bool Saturate) = decltype(IsNetReadyOriginal)(this->VFTable[IsNetReadyOffset / 8]); - return IsNetReadyOriginal(this, Saturate); - } - - double& GetLastReceiveTime() - { - static auto LastReceiveTimeOffset = GetOffset("LastReceiveTime"); - return Get(LastReceiveTimeOffset); - } - - /* TSet& GetClientVisibleLevelNames() - { - static auto ClientVisibleLevelNamesOffset = 0x336C8; - return *(TSet*)(__int64(this) + ClientVisibleLevelNamesOffset); - } */ - - class UNetDriver*& GetDriver() - { - static auto DriverOffset = GetOffset("Driver"); - return Get(DriverOffset); - } - - int32& GetTickCount() - { - static auto TickCountOffset = GetOffset("LastReceiveTime") + 8 + 8 + 8 + 8 + 8 + 4; - return Get(TickCountOffset); - } - - TMap, UActorChannel*>& GetActorChannels() - { - static auto ActorChannelsOffset = 0x33588; - return *(TMap, UActorChannel*>*)(__int64(this) + ActorChannelsOffset); - } - - TArray& GetSentTemporaries() - { - static auto SentTemporariesOffset = GetOffset("SentTemporaries"); - return Get>(SentTemporariesOffset); - } - - bool ClientHasInitializedLevelFor(const AActor* TestActor) const; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/NetDriver.cpp b/dependencies/reboot/Project Reboot 3.0/NetDriver.cpp deleted file mode 100644 index 57a4710..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NetDriver.cpp +++ /dev/null @@ -1,658 +0,0 @@ -#include "NetDriver.h" - -#include "reboot.h" -#include "Actor.h" -#include "NetConnection.h" -#include "FortPlayerControllerAthena.h" -#include "GameplayStatics.h" -#include "KismetMathLibrary.h" -#include -#include "Package.h"S -#include "AssertionMacros.h" -#include "bots.h" -#include "gui.h" - -FNetworkObjectList& UNetDriver::GetNetworkObjectList() -{ - return *(*(TSharedPtr*)(__int64(this) + Offsets::NetworkObjectList)); -} - -bool ShouldUseNetworkObjectList() -{ - return Fortnite_Version < 20; -} - -void UNetDriver::RemoveNetworkActor(AActor* Actor) -{ - GetNetworkObjectList().Remove(Actor); - - // RenamedStartupActors.Remove(Actor->GetFName()); -} - -void UNetDriver::TickFlushHook(UNetDriver* NetDriver) -{ - /* if (bEnableBotTick) - { - Bots::Tick(); - } */ - - if (Globals::bStartedListening) - { - static auto ReplicationDriverOffset = NetDriver->GetOffset("ReplicationDriver", false); - - // if (ReplicationDriverOffset == -1) - if (ReplicationDriverOffset == -1 || Fortnite_Version >= 20) - { - NetDriver->ServerReplicateActors(); - } - else - { - if (auto ReplicationDriver = NetDriver->Get(ReplicationDriverOffset)) - reinterpret_cast(ReplicationDriver->VFTable[Offsets::ServerReplicateActors])(ReplicationDriver); - } - } - - return TickFlushOriginal(NetDriver); -} - -int32 ServerReplicateActors_PrepConnections(UNetDriver* NetDriver) -{ - auto& ClientConnections = NetDriver->GetClientConnections(); - - int32 NumClientsToTick = ClientConnections.Num(); - - bool bFoundReadyConnection = false; - - for (int32 ConnIdx = 0; ConnIdx < ClientConnections.Num(); ConnIdx++) - { - UNetConnection* Connection = ClientConnections.at(ConnIdx); - if (!Connection) continue; - // check(Connection->State == USOCK_Pending || Connection->State == USOCK_Open || Connection->State == USOCK_Closed); - // checkSlow(Connection->GetUChildConnection() == NULL); - - AActor* OwningActor = Connection->GetOwningActor(); - - if (OwningActor != NULL) // && /* Connection->State == USOCK_Open && */ (Connection->Driver->Time - Connection->LastReceiveTime < 1.5f)) - { - bFoundReadyConnection = true; - - AActor* DesiredViewTarget = OwningActor; - - if (Connection->GetPlayerController()) - { - if (AActor* ViewTarget = Connection->GetPlayerController()->GetViewTarget()) - { - DesiredViewTarget = ViewTarget; - } - } - - Connection->GetViewTarget() = DesiredViewTarget; - } - else - { - Connection->GetViewTarget() = NULL; - } - } - - return bFoundReadyConnection ? NumClientsToTick : 0; -} - -enum class ENetRole : uint8_t -{ - ROLE_None = 0, - ROLE_SimulatedProxy = 1, - ROLE_AutonomousProxy = 2, - ROLE_Authority = 3, - ROLE_MAX = 4 -}; - -FORCEINLINE float FRand() -{ - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_real_distribution<> dis(0, 1); - float random_number = dis(gen); - - return random_number; -} - -static FORCEINLINE bool ShouldActorGoDormant(AActor* Actor, const std::vector& ConnectionViewers, UActorChannel* Channel, const float Time, const bool bLowNetBandwidth) -{ - using enum ENetDormancy; - - static auto bPendingDormancyOffset = 0x30; - static auto bPendingDormancyFieldMask = 0x0; - static auto DormantOffset = 0x30; - static auto DormantFieldMask = 0x0; - - if (Actor->GetNetDormancy() <= DORM_Awake || !Channel - // || ReadBitfield((PlaceholderBitfield*)(__int64(Channel) + bPendingDormancyOffset), bPendingDormancyFieldMask) - // || ReadBitfield((PlaceholderBitfield*)(__int64(Channel) + DormantOffset), DormantFieldMask) - || Channel->IsPendingDormancy() - || Channel->IsDormant() - ) - { - // Either shouldn't go dormant, or is already dormant - return false; - } - - if (Actor->GetNetDormancy() == DORM_DormantPartial) - { - for (int32 viewerIdx = 0; viewerIdx < ConnectionViewers.size(); viewerIdx++) - { - // if (!Actor->GetNetDormancy(ConnectionViewers[viewerIdx].ViewLocation, ConnectionViewers[viewerIdx].ViewDir, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, Channel, Time, bLowNetBandwidth)) - if (!false) // ^ this just returns false soo (atleast AActor implementation) - { - return false; - } - } - } - - return true; -} - -void UNetDriver::ServerReplicateActors_BuildConsiderList(std::vector& OutConsiderList, float ServerTickTime) -{ - std::vector ActorsToRemove; - - if (ShouldUseNetworkObjectList()) - { - auto& ActiveObjects = GetNetworkObjectList().ActiveNetworkObjects; - - auto World = GetWorld(); - - for (const TSharedPtr& ActorInfo : ActiveObjects) - { - if (!ActorInfo->bPendingNetUpdate && UGameplayStatics::GetTimeSeconds(GetWorld()) <= ActorInfo->NextUpdateTime) - { - continue; - } - - auto Actor = ActorInfo->Actor; - - if (!Actor) - continue; - - if (Actor->IsPendingKillPending()) - // if (Actor->IsPendingKill()) - { - ActorsToRemove.push_back(Actor); - continue; - } - - static auto RemoteRoleOffset = Actor->GetOffset("RemoteRole"); - - if (Actor->Get(RemoteRoleOffset) == ENetRole::ROLE_None) - { - ActorsToRemove.push_back(Actor); - continue; - } - - // We should add a NetDriverName check but I don't believe it is needed. - - // We should check if the actor is initialized here. - - // We should check the level stuff here. - - static auto NetDormancyOffset = Actor->GetOffset("NetDormancy"); - - if (Actor->Get(NetDormancyOffset) == ENetDormancy::DORM_Initial && Actor->IsNetStartupActor()) // IsDormInitialStartupActor - { - continue; - } - - // We should check NeedsLoadForClient here. - // We should make sure the actor is in the same world here but I don't believe it is needed. - - if (ActorInfo->LastNetReplicateTime == 0) - { - ActorInfo->LastNetReplicateTime = UGameplayStatics::GetTimeSeconds(World); - ActorInfo->OptimalNetUpdateDelta = 1.0f / Actor->GetNetUpdateFrequency(); - } - - const float ScaleDownStartTime = 2.0f; - const float ScaleDownTimeRange = 5.0f; - - const float LastReplicateDelta = UGameplayStatics::GetTimeSeconds(World) - ActorInfo->LastNetReplicateTime; - - if (LastReplicateDelta > ScaleDownStartTime) - { - static auto MinNetUpdateFrequencyOffset = Actor->GetOffset("MinNetUpdateFrequency"); - - if (Actor->Get(MinNetUpdateFrequencyOffset) == 0.0f) - { - Actor->Get(MinNetUpdateFrequencyOffset) = 2.0f; - } - - const float MinOptimalDelta = 1.0f / Actor->GetNetUpdateFrequency(); // Don't go faster than NetUpdateFrequency - const float MaxOptimalDelta = max(1.0f / Actor->GetMinNetUpdateFrequency(), MinOptimalDelta); // Don't go slower than MinNetUpdateFrequency (or NetUpdateFrequency if it's slower) - - const float Alpha = std::clamp((LastReplicateDelta - ScaleDownStartTime) / ScaleDownTimeRange, 0.0f, 1.0f); // should we use fmath? - ActorInfo->OptimalNetUpdateDelta = std::lerp(MinOptimalDelta, MaxOptimalDelta, Alpha); // should we use fmath? - } - - if (!ActorInfo->bPendingNetUpdate) - { - constexpr bool bUseAdapativeNetFrequency = false; - const float NextUpdateDelta = bUseAdapativeNetFrequency ? ActorInfo->OptimalNetUpdateDelta : 1.0f / Actor->GetNetUpdateFrequency(); - - // then set the next update time - float ServerTickTime = 1.f / 30; - ActorInfo->NextUpdateTime = UGameplayStatics::GetTimeSeconds(World) + FRand() * ServerTickTime + NextUpdateDelta; - static auto TimeOffset = GetOffset("Time"); - ActorInfo->LastNetUpdateTime = Get(TimeOffset); - } - - ActorInfo->bPendingNetUpdate = false; - - OutConsiderList.push_back(ActorInfo.Get()); - - static void (*CallPreReplication)(AActor*, UNetDriver*) = decltype(CallPreReplication)(Addresses::CallPreReplication); - CallPreReplication(Actor, this); - } - } - else - { - auto Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActor::StaticClass()); - - for (int i = 0; i < Actors.Num(); ++i) - { - auto Actor = Actors.at(i); - - if (Actor->IsPendingKillPending()) - // if (Actor->IsPendingKill()) - { - ActorsToRemove.push_back(Actor); - continue; - } - - static auto RemoteRoleOffset = Actor->GetOffset("RemoteRole"); - - if (Actor->Get(RemoteRoleOffset) == ENetRole::ROLE_None) - { - ActorsToRemove.push_back(Actor); - continue; - } - - // We should add a NetDriverName check but I don't believe it is needed. - - // We should check if the actor is initialized here. - - // We should check the level stuff here. - - static auto NetDormancyOffset = Actor->GetOffset("NetDormancy"); - - if (Actor->Get(NetDormancyOffset) == ENetDormancy::DORM_Initial && Actor->IsNetStartupActor()) // IsDormInitialStartupActor - { - continue; - } - - auto ActorInfo = new FNetworkObjectInfo; - ActorInfo->Actor = Actor; - - OutConsiderList.push_back(ActorInfo); - - static void (*CallPreReplication)(AActor*, UNetDriver*) = decltype(CallPreReplication)(Addresses::CallPreReplication); - CallPreReplication(Actor, this); - } - - Actors.Free(); - } - - for (auto Actor : ActorsToRemove) - { - if (!Actor) - continue; - - /* LOG_INFO(LogDev, "Removing actor: {}", Actor ? Actor->GetFullName() : "InvalidObject"); - RemoveNetworkActor(Actor); - LOG_INFO(LogDev, "Finished removing actor."); */ - } -} - -static UActorChannel* FindChannel(AActor * Actor, UNetConnection * Connection) -{ - static auto OpenChannelsOffset = Connection->GetOffset("OpenChannels"); - auto& OpenChannels = Connection->Get>(OpenChannelsOffset); - - static auto ActorChannelClass = FindObject(L"/Script/Engine.ActorChannel"); - - // LOG_INFO(LogReplication, "OpenChannels.Num(): {}", OpenChannels.Num()); - - for (int i = 0; i < OpenChannels.Num(); ++i) - { - auto Channel = OpenChannels.at(i); - - if (!Channel) - continue; - - // LOG_INFO(LogReplication, "[{}] Class {}", i, Channel->ClassPrivate ? Channel->ClassPrivate->GetFullName() : "InvalidObject"); - - if (!Channel->IsA(ActorChannelClass)) // (Channel->ClassPrivate == ActorChannelClass) - continue; - - static auto ActorOffset = Channel->GetOffset("Actor"); - auto ChannelActor = Channel->Get(ActorOffset); - - // LOG_INFO(LogReplication, "[{}] {}", i, ChannelActor->GetFullName()); - - if (ChannelActor != Actor) - continue; - - return (UActorChannel*)Channel; - } - - // LOG_INFO(LogDev, "Failed to find channel for {}!", Actor->GetName()); - - return nullptr; -} - -static bool IsActorRelevantToConnection(AActor * Actor, std::vector&ConnectionViewers) -{ - for (int32 viewerIdx = 0; viewerIdx < ConnectionViewers.size(); viewerIdx++) - { - if (!ConnectionViewers[viewerIdx].ViewTarget) - continue; - - // static bool (*IsNetRelevantFor)(AActor*, AActor*, AActor*, FVector&) = decltype(IsNetRelevantFor)(__int64(GetModuleHandleW(0)) + 0x1ECC700); - - static auto index = Offsets::IsNetRelevantFor; - - // if (Actor->IsNetRelevantFor(ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation)) - // if (IsNetRelevantFor(Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation)) - if (reinterpret_cast(Actor->VFTable[index])( - Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation)) - { - return true; - } - } - - return false; -} - -static FNetViewer ConstructNetViewer(UNetConnection* NetConnection) -{ - FNetViewer newViewer{}; - newViewer.Connection = NetConnection; - newViewer.InViewer = NetConnection->GetPlayerController() ? NetConnection->GetPlayerController() : NetConnection->GetOwningActor(); - newViewer.ViewTarget = NetConnection->GetViewTarget(); - - if (!NetConnection->GetOwningActor() || !(!NetConnection->GetPlayerController() || (NetConnection->GetPlayerController() == NetConnection->GetOwningActor()))) - return newViewer; - - APlayerController* ViewingController = NetConnection->GetPlayerController(); - - newViewer.ViewLocation = newViewer.ViewTarget->GetActorLocation(); - - if (ViewingController) - { - static auto ControlRotationOffset = ViewingController->GetOffset("ControlRotation"); - FRotator ViewRotation = ViewingController->Get(ControlRotationOffset); // hmmmm // ViewingController->GetControlRotation(); - // AFortPlayerControllerAthena::GetPlayerViewPointHook(Cast(ViewingController, false), newViewer.ViewLocation, ViewRotation); - ViewingController->GetActorEyesViewPoint(&newViewer.ViewLocation, &ViewRotation); // HMMM - - // static auto GetActorEyesViewPointOffset = 0x5B0; - // void (*GetActorEyesViewPointOriginal)(AController*, FVector * a2, FRotator * a3) = decltype(GetActorEyesViewPointOriginal)(ViewingController->VFTable[GetActorEyesViewPointOffset / 8]); - // GetActorEyesViewPointOriginal(ViewingController, &newViewer.ViewLocation, &ViewRotation); - // AFortPlayerControllerAthena::GetPlayerViewPointHook((AFortPlayerControllerAthena*)ViewingController, newViewer.ViewLocation, ViewRotation); - newViewer.ViewDir = ViewRotation.Vector(); - } - - return newViewer; -} - -static FORCEINLINE bool IsActorDormant(FNetworkObjectInfo* ActorInfo, const TWeakObjectPtr& Connection) -{ - // If actor is already dormant on this channel, then skip replication entirely - return ActorInfo->DormantConnections.Contains(Connection); -} - -bool UNetDriver::IsLevelInitializedForActor(const AActor* InActor, const UNetConnection* InConnection) const -{ - if (Fortnite_Version >= 2.42) // idk - { - return true; - } - -/* #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) // (Milxnor) This is on some ue versions and others not. - if (!InActor || !InConnection) - return false; - - // check(World == InActor->GetWorld()); -#endif */ - - bool bFirstWorldCheck = Engine_Version == 416 - ? (InConnection->GetClientWorldPackageName() == GetWorld()->GetOutermost()->GetFName()) - : (InConnection->GetClientWorldPackageName() == GetWorldPackage()->NamePrivate); - - const bool bCorrectWorld = (bFirstWorldCheck && InConnection->ClientHasInitializedLevelFor(InActor)); - const bool bIsConnectionPC = (InActor == InConnection->GetPlayerController()); - return bCorrectWorld || bIsConnectionPC; -} - -int32 UNetDriver::ServerReplicateActors() -{ - int32 Updated = 0; - - ++(*(int*)(__int64(this) + Offsets::ReplicationFrame)); - - const int32 NumClientsToTick = ServerReplicateActors_PrepConnections(this); - - if (NumClientsToTick == 0) - { - // No connections are ready this frame - return 0; - } - - // AFortWorldSettings* WorldSettings = GetFortWorldSettings(NetDriver->World); - - // bool bCPUSaturated = false; - float ServerTickTime = GetMaxTickRateHook(); - /* if (ServerTickTime == 0.f) - { - ServerTickTime = DeltaSeconds; - } - else */ - { - ServerTickTime = 1.f / ServerTickTime; - // bCPUSaturated = DeltaSeconds > 1.2f * ServerTickTime; - } - - std::vector ConsiderList; - - if (ShouldUseNetworkObjectList()) - ConsiderList.reserve(GetNetworkObjectList().ActiveNetworkObjects.Num()); - - auto World = GetWorld(); - - ServerReplicateActors_BuildConsiderList(ConsiderList, ServerTickTime); - - // LOG_INFO(LogReplication, "Considering {} actors.", ConsiderList.size()); - - for (int32 i = 0; i < this->GetClientConnections().Num(); i++) - { - UNetConnection* Connection = this->GetClientConnections().at(i); - - if (!Connection) - continue; - - if (i >= NumClientsToTick) - continue; - - if (!Connection->GetViewTarget()) - continue; - - if (Addresses::SendClientAdjustment) - { - if (Connection->GetPlayerController()) - { - static void (*SendClientAdjustment)(APlayerController*) = decltype(SendClientAdjustment)(Addresses::SendClientAdjustment); - SendClientAdjustment(Connection->GetPlayerController()); - } - } - - // Make weak ptr once for IsActorDormant call - TWeakObjectPtr WeakConnection{}; - WeakConnection.ObjectIndex = Connection->InternalIndex; - WeakConnection.ObjectSerialNumber = GetItemByIndex(Connection->InternalIndex)->SerialNumber; - - /* GetNetTag()++; - Connection->GetTickCount()++; - - for (int32 j = 0; j < Connection->GetSentTemporaries().Num(); j++) // Set up to skip all sent temporary actors - { - Connection->GetSentTemporaries().at(j)->GetNetTag() = GetNetTag(); - } */ - - for (auto& ActorInfo : ConsiderList) - { - if (!ActorInfo || !ActorInfo->Actor) - continue; - - auto Actor = ActorInfo->Actor; - - auto Channel = FindChannel(Actor, Connection); - - /* if (IsActorDormant(ActorInfo, WeakConnection)) - { - continue; - } */ - - std::vector ConnectionViewers; - ConnectionViewers.push_back(ConstructNetViewer(Connection)); - - const bool bLevelInitializedForActor = IsLevelInitializedForActor(Actor, Connection); - - if (!Channel) - { - // if (!IsLevelInitializedForActor(Actor, Connection)) - if (!bLevelInitializedForActor) - { - // If the level this actor belongs to isn't loaded on client, don't bother sending - continue; - } - - /* if (!IsActorRelevantToConnection(Actor, ConnectionViewers)) - { - // If not relevant (and we don't have a channel), skip - continue; - } */ - } - - bool bLowNetBandwidth = false; - - // See of actor wants to try and go dormant - /* if (ShouldActorGoDormant(Actor, ConnectionViewers, Channel, GetTime(), bLowNetBandwidth)) - { - // LOG_INFO(LogDev, "Actor is going dormant!"); - - // Channel is marked to go dormant now once all properties have been replicated (but is not dormant yet) - Channel->StartBecomingDormant(); - } */ - - if (Addresses::ActorChannelClose && Offsets::IsNetRelevantFor) - { - static void (*ActorChannelClose)(UActorChannel*) = decltype(ActorChannelClose)(Addresses::ActorChannelClose); - - if (!Actor->IsAlwaysRelevant() && !Actor->UsesOwnerRelevancy() && !Actor->IsOnlyRelevantToOwner()) - { - if (Connection && Connection->GetViewTarget()) - { - auto Viewer = Connection->GetViewTarget(); - auto Loc = Viewer->GetActorLocation(); - - if (!IsActorRelevantToConnection(Actor, ConnectionViewers)) - { - // LOG_INFO(LogReplication, "Actor is not relevant!"); - - if (Channel) - ActorChannelClose(Channel); - - continue; - } - } - } - } - - enum class EChannelCreateFlags : uint32_t - { - None = (1 << 0), - OpenedLocally = (1 << 1) - }; - - static UChannel* (*CreateChannel)(UNetConnection*, int, bool, int32_t) = decltype(CreateChannel)(Addresses::CreateChannel); - static __int64 (*ReplicateActor)(UActorChannel*) = decltype(ReplicateActor)(Addresses::ReplicateActor); - static UObject* (*CreateChannelByName)(UNetConnection* Connection, FName* ChName, EChannelCreateFlags CreateFlags, int32_t ChannelIndex) = decltype(CreateChannelByName)(Addresses::CreateChannel); - static __int64 (*SetChannelActor)(UActorChannel*, AActor*) = decltype(SetChannelActor)(Addresses::SetChannelActor); - - if (!Channel) - { - if (Actor->IsA(APlayerController::StaticClass()) && Actor != Connection->GetPlayerController()) // isnetrelevantfor should handle this iirc - continue; - - if (bLevelInitializedForActor) - { - if (Engine_Version >= 422) - { - FString ActorStr = L"Actor"; - FName ActorName = UKismetStringLibrary::Conv_StringToName(ActorStr); - - int ChannelIndex = -1; // 4294967295 - Channel = (UActorChannel*)CreateChannelByName(Connection, &ActorName, EChannelCreateFlags::OpenedLocally, ChannelIndex); - } - else - { - Channel = (UActorChannel*)CreateChannel(Connection, 2, true, -1); - } - - if (Channel) - { - SetChannelActor(Channel, Actor); - } - } - - else if (Actor->GetNetUpdateFrequency() < 1.0f) - { - ActorInfo->NextUpdateTime = UGameplayStatics::GetTimeSeconds(GetWorld()) + 0.2f * FRand(); - } - } - - if (Channel) - { - if (ReplicateActor(Channel)) - { - if (ShouldUseNetworkObjectList()) - { - // LOG_INFO(LogReplication, "Replicated Actor!"); - auto TimeSeconds = UGameplayStatics::GetTimeSeconds(World); - const float MinOptimalDelta = 1.0f / Actor->GetNetUpdateFrequency(); - const float MaxOptimalDelta = max(1.0f / Actor->GetMinNetUpdateFrequency(), MinOptimalDelta); - const float DeltaBetweenReplications = (TimeSeconds - ActorInfo->LastNetReplicateTime); - - // Choose an optimal time, we choose 70% of the actual rate to allow frequency to go up if needed - ActorInfo->OptimalNetUpdateDelta = std::clamp(DeltaBetweenReplications * 0.7f, MinOptimalDelta, MaxOptimalDelta); // should we use fmath? - ActorInfo->LastNetReplicateTime = TimeSeconds; - } - } - } - } - } - - // shuffle the list of connections if not all connections were ticked - /* - if (NumClientsToTick < NetDriver->ClientConnections.Num()) - { - int32 NumConnectionsToMove = NumClientsToTick; - while (NumConnectionsToMove > 0) - { - // move all the ticked connections to the end of the list so that the other connections are considered first for the next frame - UNetConnection* Connection = NetDriver->ClientConnections[0]; - NetDriver->ClientConnections.RemoveAt(0, 1); - NetDriver->ClientConnections.Add(Connection); - NumConnectionsToMove--; - } - } - */ - - return Updated; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/NetDriver.h b/dependencies/reboot/Project Reboot 3.0/NetDriver.h deleted file mode 100644 index a92e4d3..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NetDriver.h +++ /dev/null @@ -1,202 +0,0 @@ -#pragma once - -#include "Object.h" -#include "UnrealString.h" - -#include "World.h" -#include "NetConnection.h" -#include "Array.h" - -#include "WeakObjectPtrTemplates.h" -#include "Map.h" -#include "SharedPointer.h" -#include "Level.h" -#include "ActorChannel.h" -#include "NetworkGuid.h" - -struct FActorDestructionInfo -{ - TWeakObjectPtr Level; - TWeakObjectPtr ObjOuter; - FVector DestroyedPosition; - FNetworkGUID NetGUID; - FString PathName; - FName StreamingLevelName; -}; - -struct FNetworkObjectInfo -{ - /** Pointer to the replicated actor. */ - AActor* Actor; - - /** WeakPtr to actor. This is cached here to prevent constantly constructing one when needed for (things like) keys in TMaps/TSets */ - TWeakObjectPtr WeakActor; - - /** Next time to consider replicating the actor. Based on FPlatformTime::Seconds(). */ - double NextUpdateTime; - - /** Last absolute time in seconds since actor actually sent something during replication */ - double LastNetReplicateTime; - - /** Optimal delta between replication updates based on how frequently actor properties are actually changing */ - float OptimalNetUpdateDelta; - - /** Last time this actor was updated for replication via NextUpdateTime - * @warning: internal net driver time, not related to WorldSettings.TimeSeconds */ - float LastNetUpdateTime; - - /** Is this object still pending a full net update due to clients that weren't able to replicate the actor at the time of LastNetUpdateTime */ - uint32 bPendingNetUpdate : 1; - - /** Force this object to be considered relevant for at least one update */ - uint32 bForceRelevantNextUpdate : 1; - - /** List of connections that this actor is dormant on */ - TSet> DormantConnections; - TSet> RecentlyDormantConnections; -}; - -struct FNetViewer -{ - UNetConnection* Connection; // 0x0000(0x0008) (ZeroConstructor, IsPlainOldData) - AActor* InViewer; // 0x0008(0x0008) (ZeroConstructor, IsPlainOldData) - AActor* ViewTarget; // 0x0010(0x0008) (ZeroConstructor, IsPlainOldData) - FVector ViewLocation; // 0x0018(0x000C) (IsPlainOldData) - FVector ViewDir; -}; - -class FNetworkObjectList -{ -public: - typedef TSet> FNetworkObjectSet; - - FNetworkObjectSet AllNetworkObjects; - FNetworkObjectSet ActiveNetworkObjects; - FNetworkObjectSet ObjectsDormantOnAllConnections; - - TMap, int32> NumDormantObjectsPerConnection; - - void Remove(AActor* const Actor); -}; - -struct FActorPriority -{ - int32 Priority; // Update priority, higher = more important. - - FNetworkObjectInfo* ActorInfo; // Actor info. - UActorChannel* Channel; // Actor channel. - - FActorDestructionInfo* DestructionInfo; // Destroy an actor - - FActorPriority() : - Priority(0), ActorInfo(NULL), Channel(NULL), DestructionInfo(NULL) - {} - - FActorPriority(UNetConnection* InConnection, UActorChannel* InChannel, FNetworkObjectInfo* InActorInfo, const std::vector& Viewers, bool bLowBandwidth); - FActorPriority(UNetConnection* InConnection, FActorDestructionInfo* DestructInfo, const std::vector& Viewers); -}; - -class UWorld; - -struct FURL // idk where this actually goes -{ - FString Protocol; // 0x0000(0x0010) (ZeroConstructor) - FString Host; // 0x0010(0x0010) (ZeroConstructor) - int Port; // 0x0020(0x0004) (ZeroConstructor, IsPlainOldData) - int Valid; // 0x0024(0x0004) (ZeroConstructor, IsPlainOldData) - FString Map; // 0x0028(0x0010) (ZeroConstructor) - FString RedirectUrl; // 0x0038(0x0010) (ZeroConstructor) - TArray Op; // 0x0048(0x0010) (ZeroConstructor) - FString Portal; // 0x0058(0x0010) (ZeroConstructor) -}; - -struct FNetGUIDCache -{ - bool SupportsObject(const UObject* Object, const TWeakObjectPtr* WeakObjectPtr = nullptr) const - { - // 1.11 - bool (*SupportsObjectOriginal)(__int64, const UObject*, const TWeakObjectPtr*) = decltype(SupportsObjectOriginal)(__int64(GetModuleHandleW(0)) + 0x1AF01E0); - return SupportsObjectOriginal(__int64(this), Object, WeakObjectPtr); - } -}; - -class UNetDriver : public UObject -{ -public: - // static inline int ReplicationDriverOffset = 0; - static inline bool (*InitListenOriginal)(UNetDriver* NetDriver, FNetworkNotify* InNotify, FURL& ListenURL, bool bReuseAddressAndPort, FString& Error); - static inline void (*SetWorldOriginal)(UNetDriver* NetDriver, UWorld* World); - static inline void (*TickFlushOriginal)(UNetDriver* NetDriver); - - static void TickFlushHook(UNetDriver* NetDriver); - - int& GetMaxInternetClientRate() - { - static auto MaxInternetClientRateOffset = GetOffset("MaxInternetClientRate"); - return Get(MaxInternetClientRateOffset); - } - - int& GetMaxClientRate() - { - static auto MaxClientRateOffset = GetOffset("MaxClientRate"); - return Get(MaxClientRateOffset); - } - - FNetGUIDCache* GetGuidCache() - { - static auto GuidCacheOffset = GetOffset("WorldPackage") + 8; // checked for 1.11 - return GetPtr(GuidCacheOffset); - } - - UWorld*& GetNetDriverWorld() const - { - static auto WorldOffset = GetOffset("World"); - return Get(WorldOffset); - } - - UObject*& GetWorldPackage() const - { - static auto WorldPackageOffset = GetOffset("WorldPackage"); - return Get(WorldPackageOffset); - } - - TArray& GetClientConnections() - { - static auto ClientConnectionsOffset = GetOffset("ClientConnections"); - return Get>(ClientConnectionsOffset); - } - - float& GetTime() - { - static auto TimeOffset = GetOffset("Time"); - return Get(TimeOffset); - } - - float& GetRelevantTimeout() - { - static auto RelevantTimeoutOffset = GetOffset("RelevantTimeout"); - return Get(RelevantTimeoutOffset); - } - - float& GetSpawnPrioritySeconds() - { - static auto SpawnPrioritySecondsOffset = GetOffset("SpawnPrioritySeconds"); - return Get(SpawnPrioritySecondsOffset); - } - - int32& GetNetTag() - { - static auto NetTagOffset = 0x1DC + 4; - return Get(NetTagOffset); - } - - bool IsLevelInitializedForActor(const AActor* InActor, const UNetConnection* InConnection) const; - void RemoveNetworkActor(AActor* Actor); - bool InitListen(FNetworkNotify* InNotify, FURL& ListenURL, bool bReuseAddressAndPort, FString& Error) { return InitListenOriginal(this, InNotify, ListenURL, bReuseAddressAndPort, Error); } - void SetWorld(UWorld* World) { return SetWorldOriginal(this, World); } - int32 ServerReplicateActors(); - int32 ServerReplicateActors_ProcessPrioritizedActors(UNetConnection* Connection, const std::vector& ConnectionViewers, FActorPriority** PriorityActors, const int32 FinalSortedCount, int32& OutUpdated); - void ServerReplicateActors_BuildConsiderList(std::vector& OutConsiderList, const float ServerTickTime); - int32 ServerReplicateActors_PrioritizeActors(UNetConnection* Connection, const std::vector& ConnectionViewers, const std::vector ConsiderList, const bool bCPUSaturated, FActorPriority*& OutPriorityList, FActorPriority**& OutPriorityActors); - FNetworkObjectList& GetNetworkObjectList(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/NetSerialization.h b/dependencies/reboot/Project Reboot 3.0/NetSerialization.h deleted file mode 100644 index 6aac683..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NetSerialization.h +++ /dev/null @@ -1,126 +0,0 @@ -#pragma once - -struct FFastArraySerializerItem -{ - int ReplicationID; // 0x0000(0x0004) (ZeroConstructor, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate) - int ReplicationKey; // 0x0004(0x0004) (ZeroConstructor, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate) - int MostRecentArrayReplicationKey; // 0x0008(0x0004) (ZeroConstructor, IsPlainOldData, RepSkip, RepNotify, Interp, NonTransactional, EditorOnly, NoDestructor, AutoWeak, ContainsInstancedReference, AssetRegistrySearchable, SimpleDisplay, AdvancedDisplay, Protected, BlueprintCallable, BlueprintAuthorityOnly, TextExportTransient, NonPIEDuplicateTransient, ExposeOnSpawn, PersistentInstance, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic, NativeAccessSpecifierProtected, NativeAccessSpecifierPrivate) - - FFastArraySerializerItem() - { - ReplicationID = -1; - ReplicationKey = -1; - MostRecentArrayReplicationKey = -1; - } -}; - -struct FFastArraySerializer2 -{ - char ItemMap[0x50]; - int IDCounter; - int ArrayReplicationKey; - char GuidReferencesMap[0x50]; - char GuidReferencesMap_StructDelta[0x50]; - - /* void MarkItemDirty(FFastArraySerializerItem& Item) - { - if (Item.ReplicationID == -1) - { - Item.ReplicationID = ++IDCounter; - if (IDCounter == -1) - { - IDCounter++; - } - } - - Item.ReplicationKey++; - MarkArrayDirty(); - } */ - - void MarkArrayDirty() - { - IncrementArrayReplicationKey(); - - CachedNumItems = -1; - CachedNumItemsToConsiderForWriting = -1; - } - - void IncrementArrayReplicationKey() - { - ArrayReplicationKey++; - if (ArrayReplicationKey == -1) - { - ArrayReplicationKey++; - } - } - - int CachedNumItems; - int CachedNumItemsToConsiderForWriting; - unsigned char DeltaFlags; // EFastArraySerializerDeltaFlags - int idkwhatthisis; -}; - -struct FFastArraySerializer -{ - static inline bool bNewSerializer; - - int& GetArrayReplicationKey() - { - static int ArrayReplicationKeyOffset = 0x50 + 0x4; - - return *(int*)(__int64(this) + ArrayReplicationKeyOffset); - } - - int& GetIDCounter() - { - static int IDCounterOffset = 0x50; - - return *(int*)(__int64(this) + IDCounterOffset); - } - - int& GetCachedNumItems() - { - static int CachedNumItemsOffset = 0x50 + 0x8 + 0x50 + (bNewSerializer ? 0x50 : 0x0); - - // LOG_INFO(LogDev, "bNewSerializer: {}", bNewSerializer); - - return *(int*)(__int64(this) + CachedNumItemsOffset); - } - - int& GetCachedNumItemsToConsiderForWriting() - { - static int CachedNumItemsToConsiderForWritingOffset = 0x50 + 0x8 + 0x50 + 0x4 + (bNewSerializer ? 0x50 : 0x0); - - return *(int*)(__int64(this) + CachedNumItemsToConsiderForWritingOffset); - } - - void MarkItemDirty(FFastArraySerializerItem* Item) - { - if (Item->ReplicationID == -1) - { - Item->ReplicationID = ++GetIDCounter(); - - if (GetIDCounter() == -1) - GetIDCounter()++; - } - - Item->ReplicationKey++; - MarkArrayDirty(); - } - - void MarkArrayDirty() - { - // ((FFastArraySerializer2*)this)->MarkArrayDirty(); - // return; - - // ItemMap.Reset(); // This allows to clients to add predictive elements to arrays without affecting replication. - GetArrayReplicationKey()++; - - if (GetArrayReplicationKey() == -1) - GetArrayReplicationKey()++; - - // Invalidate the cached item counts so that they're recomputed during the next write - GetCachedNumItems() = -1; - GetCachedNumItemsToConsiderForWriting() = -1; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/NetworkGuid.h b/dependencies/reboot/Project Reboot 3.0/NetworkGuid.h deleted file mode 100644 index f1b8481..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NetworkGuid.h +++ /dev/null @@ -1,104 +0,0 @@ -#pragma once - -#include "inc.h" - -class FNetworkGUID -{ -public: - - uint32 Value; - -public: - - FNetworkGUID() - : Value(0) - { } - - FNetworkGUID(uint32 V) - : Value(V) - { } - -public: - - friend bool operator==(const FNetworkGUID& X, const FNetworkGUID& Y) - { - return (X.Value == Y.Value); - } - - friend bool operator!=(const FNetworkGUID& X, const FNetworkGUID& Y) - { - return (X.Value != Y.Value); - } - - /* friend FArchive& operator<<(FArchive& Ar, FNetworkGUID& G) - { - Ar.SerializeIntPacked(G.Value); - return Ar; - } */ - -public: - - void BuildFromNetIndex(int32 StaticNetIndex) - { - Value = (StaticNetIndex << 1 | 1); - } - - int32 ExtractNetIndex() - { - if (Value & 1) - { - return Value >> 1; - } - return 0; - } - - friend uint32 GetTypeHash(const FNetworkGUID& Guid) - { - return Guid.Value; - } - - bool IsDynamic() const - { - return Value > 0 && !(Value & 1); - } - - bool IsStatic() const - { - return Value & 1; - } - - bool IsValid() const - { - return Value > 0; - } - - // CORE_API bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess); - - /** A Valid but unassigned NetGUID */ - bool IsDefault() const - { - return (Value == 1); - } - - /* CORE_API*/ static FNetworkGUID GetDefault() - { - return FNetworkGUID(1); - } - - void Reset() - { - Value = 0; - } - - /* FString ToString() const - { - return FString::Printf(TEXT("%d"), Value); - } */ - -public: - - /* CORE_API */ static FNetworkGUID Make(int32 seed, bool bIsStatic) - { - return FNetworkGUID(seed << 1 | (bIsStatic ? 1 : 0)); - } -}; diff --git a/dependencies/reboot/Project Reboot 3.0/NetworkObjectList.cpp b/dependencies/reboot/Project Reboot 3.0/NetworkObjectList.cpp deleted file mode 100644 index 92e4b39..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NetworkObjectList.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "NetDriver.h" - -void FNetworkObjectList::Remove(AActor* const Actor) -{ - if (Actor == nullptr) - { - return; - } - - TSharedPtr* NetworkObjectInfoPtr = nullptr; - - for (int i = 0; i < AllNetworkObjects.Num(); i++) - { - auto& CurrentNetworkObject = AllNetworkObjects[i]; - - if (CurrentNetworkObject->Actor == Actor) - { - NetworkObjectInfoPtr = &CurrentNetworkObject; - break; - } - } - - if (NetworkObjectInfoPtr == nullptr) - { - // Sanity check that we're not on the other lists either - // check(!ActiveNetworkObjects.Contains(Actor)); - // check(!ObjectsDormantOnAllConnections.Contains(Actor)); - // check((ActiveNetworkObjects.Num() + ObjectsDormantOnAllConnections.Num()) == AllNetworkObjects.Num()); - return; - } - - FNetworkObjectInfo* NetworkObjectInfo = NetworkObjectInfoPtr->Get(); - - for (int i = 0; i < NetworkObjectInfo->DormantConnections.Num(); i++) - { - auto& ConnectionIt = NetworkObjectInfo->DormantConnections[i]; - - UNetConnection* Connection = ConnectionIt.Get(); - - if (Connection == nullptr) // || Connection->State == USOCK_Closed) - { - NetworkObjectInfo->DormantConnections.Remove(i); - // ConnectionIt.RemoveCurrent(); - continue; - } - - int32* NumDormantObjectsPerConnectionRef = nullptr; - - for (int z = 0; z < NumDormantObjectsPerConnection.Pairs.Num(); z++) - { - auto& Pair = NumDormantObjectsPerConnection.Pairs[z]; - - if (Pair.First.ObjectIndex == Connection->InternalIndex) - { - NumDormantObjectsPerConnectionRef = &Pair.Second; - break; - } - } - - if (!NumDormantObjectsPerConnectionRef) - { - // We should add here TODO MILXNOR - } - - // check(NumDormantObjectsPerConnectionRef > 0); - - if (NumDormantObjectsPerConnectionRef) - (*NumDormantObjectsPerConnectionRef)--; - } - - // Remove this object from all lists - - for (int i = 0; i < AllNetworkObjects.Num(); i++) - { - auto& CurrentNetworkObject = AllNetworkObjects[i]; - - if (CurrentNetworkObject->Actor == Actor) - { - AllNetworkObjects.Remove(i); - break; - } - } - - for (int i = 0; i < ActiveNetworkObjects.Num(); i++) - { - auto& CurrentActiveNetworkObject = ActiveNetworkObjects[i]; - - if (CurrentActiveNetworkObject->Actor == Actor) - { - ActiveNetworkObjects.Remove(i); - break; - } - } - - for (int i = 0; i < ObjectsDormantOnAllConnections.Num(); i++) - { - auto& CurrentDormantObject = ObjectsDormantOnAllConnections[i]; - - if (CurrentDormantObject->Actor == Actor) - { - ObjectsDormantOnAllConnections.Remove(i); - break; - } - } - - // check((ActiveNetworkObjects.Num() + ObjectsDormantOnAllConnections.Num()) == AllNetworkObjects.Num()); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/NumericLimits.h b/dependencies/reboot/Project Reboot 3.0/NumericLimits.h deleted file mode 100644 index 6a2e63a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/NumericLimits.h +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#pragma once - -#include "inc.h" - -/* Numeric constants - *****************************************************************************/ - -#define MIN_uint8 ((uint8) 0x00) -#define MIN_uint16 ((uint16) 0x0000) -#define MIN_uint32 ((uint32) 0x00000000) -#define MIN_uint64 ((uint64) 0x0000000000000000) -#define MIN_int8 ((int8) -128) -#define MIN_int16 ((int16) -32768) -#define MIN_int32 ((int32) 0x80000000) -#define MIN_int64 ((int64) 0x8000000000000000) - -#define MAX_uint8 ((uint8) 0xff) -#define MAX_uint16 ((uint16) 0xffff) -#define MAX_uint32 ((uint32) 0xffffffff) -#define MAX_uint64 ((uint64) 0xffffffffffffffff) -#define MAX_int8 ((int8) 0x7f) -#define MAX_int16 ((int16) 0x7fff) -#define MAX_int32 ((int32) 0x7fffffff) -#define MAX_int64 ((int64) 0x7fffffffffffffff) - -#define MIN_flt (1.175494351e-38F) /* min positive value */ -#define MAX_flt (3.402823466e+38F) -#define MIN_dbl (2.2250738585072014e-308) /* min positive value */ -#define MAX_dbl (1.7976931348623158e+308) - - - /* Numeric type traits - *****************************************************************************/ - - /** - * Helper class to map a numeric type to its limits - */ -template -struct TNumericLimits; - - -/** - * Numeric limits for const types - */ -template -struct TNumericLimits - : public TNumericLimits -{ }; - - -/** - * Numeric limits for volatile types - */ -template -struct TNumericLimits - : public TNumericLimits -{ }; - - -/** - * Numeric limits for const volatile types - */ -template -struct TNumericLimits - : public TNumericLimits -{ }; - - -template<> -struct TNumericLimits -{ - typedef uint8 NumericType; - - static constexpr NumericType Min() - { - return MIN_uint8; - } - - static constexpr NumericType Max() - { - return MAX_uint8; - } - - static constexpr NumericType Lowest() - { - return Min(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef uint16 NumericType; - - static constexpr NumericType Min() - { - return MIN_uint16; - } - - static constexpr NumericType Max() - { - return MAX_uint16; - } - - static constexpr NumericType Lowest() - { - return Min(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef uint32 NumericType; - - static constexpr NumericType Min() - { - return MIN_uint32; - } - - static constexpr NumericType Max() - { - return MAX_uint32; - } - - static constexpr NumericType Lowest() - { - return Min(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef uint64 NumericType; - - static constexpr NumericType Min() - { - return MIN_uint64; - } - - static constexpr NumericType Max() - { - return MAX_uint64; - } - - static constexpr NumericType Lowest() - { - return Min(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef int8 NumericType; - - static constexpr NumericType Min() - { - return MIN_int8; - } - - static constexpr NumericType Max() - { - return MAX_int8; - } - - static constexpr NumericType Lowest() - { - return Min(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef int16 NumericType; - - static constexpr NumericType Min() - { - return MIN_int16; - } - - static constexpr NumericType Max() - { - return MAX_int16; - } - - static constexpr NumericType Lowest() - { - return Min(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef int32 NumericType; - - static constexpr NumericType Min() - { - return MIN_int32; - } - - static constexpr NumericType Max() - { - return MAX_int32; - } - - static constexpr NumericType Lowest() - { - return Min(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef int64 NumericType; - - static constexpr NumericType Min() - { - return MIN_int64; - } - - static constexpr NumericType Max() - { - return MAX_int64; - } - - static constexpr NumericType Lowest() - { - return Min(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef float NumericType; - - static constexpr NumericType Min() - { - return MIN_flt; - } - - static constexpr NumericType Max() - { - return MAX_flt; - } - - static constexpr NumericType Lowest() - { - return -Max(); - } -}; - - -template<> -struct TNumericLimits -{ - typedef double NumericType; - - static constexpr NumericType Min() - { - return MIN_dbl; - } - - static constexpr NumericType Max() - { - return MAX_dbl; - } - - static constexpr NumericType Lowest() - { - return -Max(); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Object.cpp b/dependencies/reboot/Project Reboot 3.0/Object.cpp deleted file mode 100644 index 81e149b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Object.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include "Object.h" - -#include "addresses.h" - -#include "Class.h" -#include "KismetSystemLibrary.h" -#include "UObjectArray.h" -#include "Package.h" - -void* UObject::GetProperty(const std::string& ChildName, bool bWarnIfNotFound) const -{ - for (auto CurrentClass = ClassPrivate; CurrentClass; CurrentClass = *(UClass**)(__int64(CurrentClass) + Offsets::SuperStruct)) - { - void* Property = *(void**)(__int64(CurrentClass) + Offsets::Children); - - if (Property) - { - // LOG_INFO(LogDev, "Reading prop name.."); - - std::string PropName = GetFNameOfProp(Property)->ToString(); - - // LOG_INFO(LogDev, "PropName: {}", PropName); - - if (PropName == ChildName) - { - return Property; - } - - while (Property) - { - if (PropName == ChildName) - { - return Property; - } - - Property = GetNext(Property); - PropName = Property ? GetFNameOfProp(Property)->ToString() : ""; - } - } - } - - if (bWarnIfNotFound) - LOG_WARN(LogFinder, "Unable to find0{}", ChildName); - - return nullptr; -} - -void* UObject::GetProperty(const std::string& ChildName, bool bWarnIfNotFound) -{ - for (auto CurrentClass = ClassPrivate; CurrentClass; CurrentClass = *(UClass**)(__int64(CurrentClass) + Offsets::SuperStruct)) - { - void* Property = *(void**)(__int64(CurrentClass) + Offsets::Children); - - if (Property) - { - // LOG_INFO(LogDev, "Reading prop name.."); - - std::string PropName = GetFNameOfProp(Property)->ToString(); - - // LOG_INFO(LogDev, "PropName: {}", PropName); - - if (PropName == ChildName) - { - return Property; - } - - while (Property) - { - if (PropName == ChildName) - { - return Property; - } - - Property = GetNext(Property); - PropName = Property ? GetFNameOfProp(Property)->ToString() : ""; - } - } - } - - if (bWarnIfNotFound) - LOG_WARN(LogFinder, "Unable to find0{}", ChildName); - - return nullptr; -} - -int UObject::GetOffset(const std::string& ChildName, bool bWarnIfNotFound) -{ - auto Property = GetProperty(ChildName, bWarnIfNotFound); - - if (!Property) - return -1; - - return *(int*)(__int64(Property) + Offsets::Offset_Internal); -} - -int UObject::GetOffset(const std::string& ChildName, bool bWarnIfNotFound) const -{ - auto Property = GetProperty(ChildName, bWarnIfNotFound); - - if (!Property) - return -1; - - return *(int*)(__int64(Property) + Offsets::Offset_Internal); -} - -void* UObject::GetInterfaceAddress(UClass* InterfaceClass) -{ - static void* (*GetInterfaceAddressOriginal)(UObject* a1, UClass* a2) = decltype(GetInterfaceAddressOriginal)(Addresses::GetInterfaceAddress); - return GetInterfaceAddressOriginal(this, InterfaceClass); -} - -bool UObject::ReadBitfieldValue(int Offset, uint8_t FieldMask) -{ - return ReadBitfield(this->GetPtr(Offset), FieldMask); -} - -void UObject::SetBitfieldValue(int Offset, uint8_t FieldMask, bool NewValue) -{ - SetBitfield(this->GetPtr(Offset), FieldMask, NewValue); -} - -std::string UObject::GetPathName() -{ - return UKismetSystemLibrary::GetPathName(this).ToString(); -} - -std::string UObject::GetFullName() -{ - return ClassPrivate ? ClassPrivate->GetName() + " " + UKismetSystemLibrary::GetPathName(this).ToString() : "NoClassPrivate"; -} - -UPackage* UObject::GetOutermost() const -{ - UObject* Top = (UObject*)this; - for (;;) - { - UObject* CurrentOuter = Top->GetOuter(); - if (!CurrentOuter) - { - return Cast(Top); - } - Top = CurrentOuter; - } -} - -bool UObject::IsA(UStruct* otherClass) -{ - UStruct* super = ClassPrivate; - - while (super) - { - if (otherClass == super) - return true; - - super = super->GetSuperStruct(); - } - - return false; -} - -UFunction* UObject::FindFunction(const std::string& ShortFunctionName) -{ - // We could also loop through children. - - UStruct* super = ClassPrivate; - - while (super) - { - if (auto Func = FindObject(super->GetPathName() + "." + ShortFunctionName)) - return Func; - - super = super->GetSuperStruct(); - } - - return nullptr; -} - -/* class UClass* UObject::StaticClass() -{ - static auto Class = FindObject(L"/Script/CoreUObject.Object"); - return Class; -} */ - -void UObject::AddToRoot() -{ - auto Item = GetItemByIndex(InternalIndex); - - if (!Item) - { - LOG_INFO(LogDev, "Invalid item"); - return; - } - - Item->SetRootSet(); -} - -bool UObject::IsValidLowLevel() -{ - if (this == nullptr) - { - // UE_LOG(LogUObjectBase, Warning, TEXT("NULL object")); - return false; - } - if (IsBadReadPtr(this, 8)) // needed? (milxnor) - { - return false; - } - if (!ClassPrivate) - { - // UE_LOG(LogUObjectBase, Warning, TEXT("Object is not registered")); - return false; - } - return ChunkedObjects ? ChunkedObjects->IsValid(this) : UnchunkedObjects ? UnchunkedObjects->IsValid(this) : false; -} - -FORCEINLINE bool UObject::IsPendingKill() const -{ - return ChunkedObjects ? ChunkedObjects->GetItemByIndex(InternalIndex)->IsPendingKill() : UnchunkedObjects ? UnchunkedObjects->GetItemByIndex(InternalIndex)->IsPendingKill() : false; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Object.h b/dependencies/reboot/Project Reboot 3.0/Object.h deleted file mode 100644 index a5f0dfa..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Object.h +++ /dev/null @@ -1,137 +0,0 @@ -#pragma once - -#include - -#include "ObjectMacros.h" -#include "NameTypes.h" - -#include "addresses.h" - -class UClass; -class UFunction; - -struct FGuid -{ - unsigned int A; - unsigned int B; - unsigned int C; - unsigned int D; - - bool operator==(const FGuid& other) - { - return A == other.A && B == other.B && C == other.C && D == other.D; - } - - bool operator!=(const FGuid& other) - { - return !(*this == other); - } -}; - -class UObject -{ -public: - void** VFTable; - /*EObjectFlags */ int32 ObjectFlags; - int32 InternalIndex; - UClass* ClassPrivate; - FName NamePrivate; - UObject* OuterPrivate; - - static inline void (*ProcessEventOriginal)(const UObject*, UFunction*, void*); - - /* virtual */ void ProcessEvent(UFunction* Function, void* Parms = nullptr) - { - // LOG_INFO(LogDev, "PE: 0x{:x}", __int64(ProcessEventOriginal) - __int64(GetModuleHandleW(0))); - ProcessEventOriginal(this, Function, Parms); - } - - /* virtual */ void ProcessEvent(UFunction* Function, void* Parms = nullptr) const - { - // LOG_INFO(LogDev, "PE: 0x{:x}", __int64(ProcessEventOriginal) - __int64(GetModuleHandleW(0))); - ProcessEventOriginal(this, Function, Parms); - } - - std::string GetName() { return NamePrivate.ToString(); } - std::string GetPathName(); - std::string GetFullName(); - UObject* GetOuter() const { return OuterPrivate; } - FName GetFName() const { return NamePrivate; } - - class UPackage* GetOutermost() const; - bool IsA(class UStruct* Other); - class UFunction* FindFunction(const std::string& ShortFunctionName); - - void* GetProperty(const std::string& ChildName, bool bWarnIfNotFound = true); - void* GetProperty(const std::string& ChildName, bool bWarnIfNotFound = true) const; - int GetOffset(const std::string& ChildName, bool bWarnIfNotFound = true); - int GetOffset(const std::string& ChildName, bool bWarnIfNotFound = true) const; - - template - T& Get(int Offset) const { return *(T*)(__int64(this) + Offset); } - - void* GetInterfaceAddress(UClass* InterfaceClass); - - bool ReadBitfieldValue(int Offset, uint8_t FieldMask); - bool ReadBitfieldValue(const std::string& ChildName, uint8_t FieldMask) { return ReadBitfieldValue(GetOffset(ChildName), FieldMask); } - - void SetBitfieldValue(int Offset, uint8_t FieldMask, bool NewValue); - void SetBitfieldValue(const std::string& ChildName, uint8_t FieldMask, bool NewValue) { return SetBitfieldValue(GetOffset(ChildName), FieldMask, NewValue); } - - /* template - T& GetCached(const std::string& ChildName) - { - // We need to find a better way to do this because if there is a member with the same name in a different class then it will return the wrong offset. - static std::unordered_map SavedOffsets; // Name (formatted in {Member}) and Offset - - auto CachedName = // ClassPrivate->GetName() + - ChildName; - auto Offset = SavedOffsets.find(CachedName); - - if (Offset != SavedOffsets.end()) - { - int off = Offset->second; - - return *(T*)(__int64(this) + off); - } - - auto Offset = Get(ChildName); - - SavedOffsets.emplace(CachedName, Offset->second); - - return *(T*)(__int64(this) + Offset->second); - } */ - - template - T& Get(const std::string& ChildName) { return Get(GetOffset(ChildName)); } - - template - T* GetPtr(int Offset) { return (T*)(__int64(this) + Offset); } - - template - T* GetPtr(const std::string& ChildName) { return GetPtr(GetOffset(ChildName)); } - - void AddToRoot(); - bool IsValidLowLevel(); - FORCEINLINE bool IsPendingKill() const; - - // static class UClass* StaticClass(); -}; - -/* struct FInternalUObjectBaseUtilityIsValidFlagsChecker -{ - FORCEINLINE static bool CheckObjectValidBasedOnItsFlags(const UObject* Test) - { - // Here we don't really check if the flags match but if the end result is the same - checkSlow(GUObjectArray.IndexToObject(Test->InternalIndex)->HasAnyFlags(EInternalObjectFlags::PendingKill | EInternalObjectFlags::Garbage) == Test->HasAnyFlags(RF_InternalPendingKill | RF_InternalGarbage)); - return !Test->HasAnyFlags(RF_InternalPendingKill | RF_InternalGarbage); - } -}; */ - -FORCEINLINE bool IsValidChecked(const UObject* Test) -{ - // if (!Test) - // return false; - - return true; // FInternalUObjectBaseUtilityIsValidFlagsChecker::CheckObjectValidBasedOnItsFlags(Test); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ObjectMacros.h b/dependencies/reboot/Project Reboot 3.0/ObjectMacros.h deleted file mode 100644 index fff169b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ObjectMacros.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include "inc.h" - -enum EObjectFlags -{ - RF_NoFlags = 0x00000000, - RF_Public = 0x00000001, - RF_Standalone = 0x00000002, - RF_MarkAsNative = 0x00000004, - RF_Transactional = 0x00000008, - RF_ClassDefaultObject = 0x00000010, - RF_ArchetypeObject = 0x00000020, - RF_Transient = 0x00000040, - RF_MarkAsRootSet = 0x00000080, - RF_TagGarbageTemp = 0x00000100, - RF_NeedInitialization = 0x00000200, - RF_NeedLoad = 0x00000400, - RF_KeepForCooker = 0x00000800, - RF_NeedPostLoad = 0x00001000, - RF_NeedPostLoadSubobjects = 0x00002000, - RF_NewerVersionExists = 0x00004000, - RF_BeginDestroyed = 0x00008000, - RF_FinishDestroyed = 0x00010000, - RF_BeingRegenerated = 0x00020000, - RF_DefaultSubObject = 0x00040000, - RF_WasLoaded = 0x00080000, - RF_TextExportTransient = 0x00100000, - RF_LoadCompleted = 0x00200000, - RF_InheritableComponentTemplate = 0x00400000, - RF_DuplicateTransient = 0x00800000, - RF_StrongRefOnFrame = 0x01000000, - RF_NonPIEDuplicateTransient = 0x02000000, - RF_WillBeLoaded = 0x08000000, - RF_HasExternalPackage = 0x10000000, - RF_AllocatedInSharedPage = 0x80000000, -}; - -enum class EInternalObjectFlags : int -{ - None = 0, - - LoaderImport = 1 << 20, ///< Object is ready to be imported by another package during loading - Garbage = 1 << 21, ///< Garbage from logical point of view and should not be referenced. This flag is mirrored in EObjectFlags as RF_Garbage for performance - PersistentGarbage = 1 << 22, ///< Same as above but referenced through a persistent reference so it can't be GC'd - ReachableInCluster = 1 << 23, ///< External reference to object in cluster exists - ClusterRoot = 1 << 24, ///< Root of a cluster - Native = 1 << 25, ///< Native (UClass only). - Async = 1 << 26, ///< Object exists only on a different thread than the game thread. - AsyncLoading = 1 << 27, ///< Object is being asynchronously loaded. - Unreachable = 1 << 28, ///< Object is not reachable on the object graph. - // PendingKill UE_DEPRECATED(5.0, "PendingKill flag should no longer be used. Use Garbage flag instead.") = 1 << 29, ///< Objects that are pending destruction (invalid for gameplay but valid objects). This flag is mirrored in EObjectFlags as RF_PendingKill for performance - PendingKill = 1 << 29, - RootSet = 1 << 30, ///< Object will not be garbage collected, even if unreferenced. - PendingConstruction = 1 << 31 ///< Object didn't have its class constructor called yet (only the UObjectBase one to initialize its most basic members) - - /* GarbageCollectionKeepFlags = Native | Async | AsyncLoading | LoaderImport, - PRAGMA_DISABLE_DEPRECATION_WARNINGS - MirroredFlags = Garbage | PendingKill, /// Flags mirrored in EObjectFlags - - //~ Make sure this is up to date! - AllFlags = LoaderImport | Garbage | PersistentGarbage | ReachableInCluster | ClusterRoot | Native | Async | AsyncLoading | Unreachable | PendingKill | RootSet | PendingConstruction - PRAGMA_ENABLE_DEPRECATION_WARNINGS */ -}; - -ENUM_CLASS_FLAGS(EInternalObjectFlags) - -#define BODY_MACRO_COMBINE_INNER(A,B,C,D) A##B##C##D -#define BODY_MACRO_COMBINE(A,B,C,D) BODY_MACRO_COMBINE_INNER(A,B,C,D) \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/OnlineReplStructs.h b/dependencies/reboot/Project Reboot 3.0/OnlineReplStructs.h deleted file mode 100644 index 0665abc..0000000 --- a/dependencies/reboot/Project Reboot 3.0/OnlineReplStructs.h +++ /dev/null @@ -1,55 +0,0 @@ -// this file wasn't fun - -#pragma once - -#include "reboot.h" - -struct FUniqueNetIdRepl // : public FUniqueNetIdWrapper -{ - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/Engine.UniqueNetIdRepl"); - return Struct; - } - - static int GetSizeOfStruct() - { - static auto Size = GetStruct()->GetPropertiesSize(); - return Size; - } - - TArray& GetReplicationBytes() - { - static auto ReplicationBytesOffset = FindOffsetStruct("/Script/Engine.UniqueNetIdRepl", "ReplicationBytes"); - return *(TArray*)(__int64(this) + ReplicationBytesOffset); - } - - FORCEINLINE int GetSize() { return GetReplicationBytes().Num(); } // LITERLALY IDK IF THIS IS RIGHT CUZ I CANT FIND IMPL - FORCEINLINE uint8* GetBytes() { return GetReplicationBytes().Data; } // ^^^ - - FORCENOINLINE bool IsIdentical(FUniqueNetIdRepl* OtherUniqueId) - { - return (GetSize() == OtherUniqueId->GetSize()) && - (memcmp(GetBytes(), OtherUniqueId->GetBytes(), GetSize()) == 0); - } - - void CopyFromAnotherUniqueId(FUniqueNetIdRepl* OtherUniqueId) - { - CopyStruct(this, OtherUniqueId, GetSizeOfStruct(), GetStruct()); - - return; - - auto& ReplicationBytes = GetReplicationBytes(); - - ReplicationBytes.Free(); - - // Now this is what we call 1 to 1 array copying. - - for (int i = 0; i < OtherUniqueId->GetReplicationBytes().Num(); i++) - { - ReplicationBytes.Add(OtherUniqueId->GetReplicationBytes().at(i)); - } - } - - /* bool IsEqual(FUniqueNetIdRepl* Other) */ -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/OutputDevice.h b/dependencies/reboot/Project Reboot 3.0/OutputDevice.h deleted file mode 100644 index e57ffe6..0000000 --- a/dependencies/reboot/Project Reboot 3.0/OutputDevice.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -class FOutputDevice -{ -public: - bool bSuppressEventTag; - bool bAutoEmitLineTerminator; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Package.h b/dependencies/reboot/Project Reboot 3.0/Package.h deleted file mode 100644 index ea150bb..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Package.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "Object.h" - -class UPackage : public UObject -{ -public: - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Pawn.h b/dependencies/reboot/Project Reboot 3.0/Pawn.h deleted file mode 100644 index 40eadf2..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Pawn.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "Actor.h" - -class APawn : public AActor -{ -public: - UObject* GetPlayerState() - { - static auto PlayerStateOffset = GetOffset("PlayerState"); - return Get(PlayerStateOffset); - } - - class APlayerController* GetController() - { - static auto ControllerOffset = GetOffset("Controller"); - return Get(ControllerOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/PersistentObjectPtr.h b/dependencies/reboot/Project Reboot 3.0/PersistentObjectPtr.h deleted file mode 100644 index f37e406..0000000 --- a/dependencies/reboot/Project Reboot 3.0/PersistentObjectPtr.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "WeakObjectPtr.h" - -template -struct TPersistentObjectPtr -{ -public: - /** Once the object has been noticed to be loaded, this is set to the object weak pointer **/ - mutable FWeakObjectPtr WeakPtr; - /** Compared to CurrentAnnotationTag and if they are not equal, a guid search will be performed **/ - mutable int TagAtLastTest; - /** Guid for the object this pointer points to or will point to. **/ - TObjectID ObjectID; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Player.h b/dependencies/reboot/Project Reboot 3.0/Player.h deleted file mode 100644 index 6f7e918..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Player.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "Object.h" -#include "PlayerController.h" - -class UPlayer : public UObject -{ -public: - APlayerController*& GetPlayerController() const - { - static auto PlayerControllerOffset = GetOffset("PlayerController"); - return Get(PlayerControllerOffset); - } - - int& GetCurrentNetSpeed() - { - static auto CurrentNetSpeedOffset = GetOffset("CurrentNetSpeed"); - return Get(CurrentNetSpeedOffset); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/PlayerController.cpp b/dependencies/reboot/Project Reboot 3.0/PlayerController.cpp deleted file mode 100644 index 8993917..0000000 --- a/dependencies/reboot/Project Reboot 3.0/PlayerController.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "PlayerController.h" -#include "GameplayStatics.h" - -#include "reboot.h" - -void APlayerController::ServerChangeName(FString& S) -{ - static auto ServerChangeNameFn = FindObject(L"/Script/Engine.PlayerController.ServerChangeName"); - this->ProcessEvent(ServerChangeNameFn, &S); -} - -void APlayerController::SetPlayerIsWaiting(bool NewValue) -{ - static auto bPlayerIsWaitingOffset = GetOffset("bPlayerIsWaiting"); - static auto bPlayerIsWaitingFieldMask = GetFieldMask(this->GetProperty("bPlayerIsWaiting")); - this->SetBitfieldValue(bPlayerIsWaitingOffset, bPlayerIsWaitingFieldMask, NewValue); -} - -UCheatManager*& APlayerController::SpawnCheatManager(UClass* CheatManagerClass) -{ - GetCheatManager() = UGameplayStatics::SpawnObject(CheatManagerClass, this, true); - return GetCheatManager(); -} - -FRotator APlayerController::GetControlRotation() -{ - static auto fn = FindObject(L"/Script/Engine.Controller.GetControlRotation"); - FRotator rot; - this->ProcessEvent(fn, &rot); - return rot; -} - -void APlayerController::ServerRestartPlayer() -{ - static auto fn = FindObject(L"/Script/Engine.PlayerController.ServerRestartPlayer"); - this->ProcessEvent(fn); -} - -UClass* APlayerController::StaticClass() -{ - static auto Class = FindObject(L"/Script/Engine.PlayerController"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/PlayerController.h b/dependencies/reboot/Project Reboot 3.0/PlayerController.h deleted file mode 100644 index 7625905..0000000 --- a/dependencies/reboot/Project Reboot 3.0/PlayerController.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "Class.h" -#include "Controller.h" -#include "CheatManager.h" - -#include "UnrealString.h" -#include "Rotator.h" - -class APlayerController : public AController -{ -public: - UCheatManager*& GetCheatManager() - { - static auto CheatManagerOffset = this->GetOffset("CheatManager"); - return this->Get(CheatManagerOffset); - } - - class UNetConnection*& GetNetConnection() - { - static auto NetConnectionOffset = GetOffset("NetConnection"); - return Get(NetConnectionOffset); - } - - void SetPlayerIsWaiting(bool NewValue); - void ServerChangeName(FString& S); - UCheatManager*& SpawnCheatManager(UClass* CheatManagerClass); - FRotator GetControlRotation(); - void ServerRestartPlayer(); - - static UClass* StaticClass(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/PlayerState.cpp b/dependencies/reboot/Project Reboot 3.0/PlayerState.cpp deleted file mode 100644 index 0b0e821..0000000 --- a/dependencies/reboot/Project Reboot 3.0/PlayerState.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "PlayerState.h" - -#include "reboot.h" - -FString& APlayerState::GetSavedNetworkAddress() -{ - static auto SavedNetworkAddressOffset = GetOffset("SavedNetworkAddress"); - return Get(SavedNetworkAddressOffset); -} - -FString APlayerState::GetPlayerName() -{ - static auto GetPlayerNameFn = FindObject(L"/Script/Engine.PlayerState.GetPlayerName"); - - if (GetPlayerNameFn) - { - FString PlayerName; - this->ProcessEvent(GetPlayerNameFn, &PlayerName); - return PlayerName; - } - - static auto PlayerNameOffset = GetOffset("PlayerName"); - return Get(PlayerNameOffset); -} - -int& APlayerState::GetPlayerID() -{ - static auto PlayerIDOffset = FindOffsetStruct("/Script/Engine.PlayerState", "PlayerID", false); - - if (PlayerIDOffset == -1) - { - static auto PlayerIdOffset = FindOffsetStruct("/Script/Engine.PlayerState", "PlayerId", false); - return Get(PlayerIdOffset); - } - - return Get(PlayerIDOffset); -} - -bool APlayerState::IsBot() -{ - static auto bIsABotOffset = GetOffset("bIsABot"); - static auto bIsABotFieldMask = GetFieldMask(GetProperty("bIsABot")); - return ReadBitfieldValue(bIsABotOffset, bIsABotFieldMask); -} - -void APlayerState::SetIsBot(bool NewValue) -{ - static auto bIsABotOffset = GetOffset("bIsABot"); - static auto bIsABotFieldMask = GetFieldMask(GetProperty("bIsABot")); - return SetBitfieldValue(bIsABotOffset, bIsABotFieldMask, NewValue); -} - -void APlayerState::OnRep_PlayerName() -{ - static auto OnRep_PlayerNameFn = FindObject("/Script/Engine.PlayerState.OnRep_PlayerName"); - this->ProcessEvent(OnRep_PlayerNameFn); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/PlayerState.h b/dependencies/reboot/Project Reboot 3.0/PlayerState.h deleted file mode 100644 index da012b5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/PlayerState.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "Actor.h" - -#include "UnrealString.h" - -class APlayerState : public AActor -{ -public: - FString& GetSavedNetworkAddress(); - FString GetPlayerName(); - int& GetPlayerID(); // for future me to deal with (this is a short on some versions). - bool IsBot(); - void SetIsBot(bool NewValue); - void OnRep_PlayerName(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/PlaysetLevelStreamComponent.cpp b/dependencies/reboot/Project Reboot 3.0/PlaysetLevelStreamComponent.cpp deleted file mode 100644 index ef1527c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/PlaysetLevelStreamComponent.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "PlaysetLevelStreamComponent.h" - -void UPlaysetLevelStreamComponent::SetPlaysetHook(UPlaysetLevelStreamComponent* Component, UFortPlaysetItemDefinition* NewPlayset) -{ - SetPlaysetOriginal(Component, NewPlayset); - - auto Volume = Cast(Component->GetOwner()); - - LOG_INFO(LogDev, "Volume: {}", __int64(Volume)); - - if (!Volume || !Volume->HasAuthority()) - return; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/PlaysetLevelStreamComponent.h b/dependencies/reboot/Project Reboot 3.0/PlaysetLevelStreamComponent.h deleted file mode 100644 index 04d3601..0000000 --- a/dependencies/reboot/Project Reboot 3.0/PlaysetLevelStreamComponent.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "ActorComponent.h" - -#include "FortPlaysetItemDefinition.h" - -class UPlaysetLevelStreamComponent : public UActorComponent -{ -public: - static inline void (*SetPlaysetOriginal)(UPlaysetLevelStreamComponent* Component, UFortPlaysetItemDefinition* NewPlayset); - - static void SetPlaysetHook(UPlaysetLevelStreamComponent* Component, UFortPlaysetItemDefinition* NewPlayset); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/PointerIsConvertibleFromTo.h b/dependencies/reboot/Project Reboot 3.0/PointerIsConvertibleFromTo.h deleted file mode 100644 index 366f207..0000000 --- a/dependencies/reboot/Project Reboot 3.0/PointerIsConvertibleFromTo.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -template -struct TPointerIsConvertibleFromTo -{ -private: - // static uint8 Test(...); - // static uint16 Test(To*); - -public: - enum { Value = sizeof(Test((From*)nullptr)) - 1 }; -}; - diff --git a/dependencies/reboot/Project Reboot 3.0/Project Reboot 3.0.vcxproj b/dependencies/reboot/Project Reboot 3.0/Project Reboot 3.0.vcxproj deleted file mode 100644 index 422c1cb..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Project Reboot 3.0.vcxproj +++ /dev/null @@ -1,499 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {69618184-b9db-4982-b4fe-f83e9bdd0555} - ProjectReboot30 - 10.0 - - - - DynamicLibrary - true - v143 - Unicode - - - DynamicLibrary - false - v143 - true - Unicode - - - DynamicLibrary - true - v143 - Unicode - - - DynamicLibrary - false - v143 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - Level3 - true - WIN32;_DEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - NotUsing - pch.h - stdcpplatest - ../vendor - true - - - Windows - true - false - ../vendor - MinHook/minhook.x64.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) - - - - - Level3 - true - true - true - WIN32;NDEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - NotUsing - pch.h - stdcpplatest - ../vendor - true - MultiThreadedDLL - WOah! - - - Windows - true - true - true - false - ../vendor - MinHook/minhook.x64.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) - - - - - Level3 - true - _DEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - NotUsing - pch.h - stdcpplatest - ../vendor - true - - - Windows - true - false - ../vendor - Oleaut32.lib;Onecore.lib;MinHook/minhook.x64.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - NotUsing - pch.h - stdcpplatest - ../vendor - true - MultiThreadedDLL - - - - - Windows - true - true - true - false - ../vendor - curl/libcurl.lib;curl/zlib.lib;Oleaut32.lib;Onecore.lib;MinHook/minhook.x64.lib;$(CoreLibraryDependencies);%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters b/dependencies/reboot/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters deleted file mode 100644 index 62285ea..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters +++ /dev/null @@ -1,1244 +0,0 @@ - - - - - Engine\Source\Runtime\Core\Private\UObject - - - Engine\Source\Runtime\CoreUObject\Private - - - Engine\Source\Runtime\CoreUObject\Private - - - Engine\Source\Runtime\CoreUObject\Private - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private - - - Engine\Source\Runtime\CoreUObject\Private - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Public\Items - - - Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Private - - - FortniteGame\Source\FortniteGame\Private\Player - - - Engine\Source\Runtime\Core\Private\Math - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Private\Weapons - - - FortniteGame\Source\FortniteGame\Private - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Engine\Private\Components - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Private - - - FortniteGame\Source\FortniteGame\Private\Building - - - FortniteGame\Source\FortniteGame\Private\Weapons - - - FortniteGame\Source\FortniteGame\Private\Building - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Private\Pawns - - - FortniteGame\Source\FortniteGame\Private\Player - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Private\Building - - - FortniteGame\Source\FortniteGame\Private\Creative - - - FortniteGame\Source\FortniteGame\Private\Building\GameplayActors - - - FortniteGame\Source\FortniteGame\Private\Creative\Minigame - - - Engine\Source\Runtime\Engine\Private - - - Reboot\Private - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private - - - FortniteGame\Source\FortniteGame\Private - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private\Player - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private\Pawns - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private\Abilities - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private\Vehicle - - - FortniteGame\Source\FortniteGame\Private - - - FortniteGame\Source\FortniteGame\Private\Items - - - Libaries\ImGUI - - - Libaries\ImGUI - - - Libaries\ImGUI - - - Libaries\ImGUI - - - Libaries\ImGUI - - - Libaries\ImGUI - - - Libaries\ImGUI - - - Libaries\ImGUI - - - FortniteGame\Source\FortniteGame\Private\Vehicle - - - FortniteGame\Source\FortniteGame\Private\Vehicle - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private\Building - - - FortniteGame\Source\FortniteGame\Private - - - Engine\Source\Runtime\Core\Private\GenericPlatform - - - Reboot\Public - - - Engine\Source\Runtime\Engine\Private - - - Reboot\Public - - - Engine\Source\Runtime\CoreUObject\Private - - - FortniteGame\Source\FortniteGame\Private\Vehicle - - - FortniteGame\Source\FortniteGame\Private\Building - - - FortniteGame\Source\FortniteGame\Private - - - FortniteGame\Source\FortniteGame\Private\Items - - - FortniteGame\Source\FortniteGame\Private\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Private\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Private\Athena\Modifiers - - - Reboot\Private - - - Reboot\Private - - - FortniteGame\Source\FortniteGame\Private\Athena - - - FortniteGame\Source\FortniteGame\Private\Player - - - FortniteGame\Source\FortniteGame\Private\Building - - - FortniteGame\Source\FortniteGame\Private\Athena\Island - - - Engine\Source\Runtime\Engine\Private - - - FortniteGame\Source\FortniteGame\Private\Player - - - Engine\Source\Developer\ScriptDisassembler\Private - - - FortniteGame\Source\FortniteGame\Private\Items - - - Reboot\Private - - - Reboot\Private - - - Reboot\Private - - - Reboot\Private - - - - - - - Engine\Source\Runtime\Core\Public\Containers - - - Engine\Source\Runtime\Core\Public\Containers - - - Engine\Source\Runtime\Core\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\Core\Public\Misc - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\Engine\Classes\Kismet - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - FortniteGame\Source\FortniteGame\Public - - - FortniteGame\Source\FortniteGame\Public - - - FortniteGame\Source\FortniteGame\Public - - - FortniteGame\Source\FortniteGame\Public - - - Engine\Source\Runtime\Core\Public\Math - - - Engine\Source\Runtime\Core\Public\Math - - - Engine\Source\Runtime\Engine\Classes\Engine - - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - Engine\Source\Runtime\Engine\Classes\Engine - - - FortniteGame\Source\FortniteGame\Public\Items - - - FortniteGame\Source\FortniteGame\Public\Items - - - FortniteGame\Source\FortniteGame\Public\Player - - - Engine\Source\Runtime\Engine\Classes\Engine - - - FortniteGame\Source\FortniteGame\Public\Player - - - FortniteGame\Source\FortniteGame\Public\Pawns - - - FortniteGame\Source\FortniteGame\Public\Weapons - - - FortniteGame\Source\FortniteGame\Public\Items - - - FortniteGame\Source\FortniteGame\Public\Items - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - FortniteGame\Source\FortniteGame\Public\Player - - - FortniteGame\Source\FortniteGame\Public\Player - - - FortniteGame\Source\FortniteGame\Public - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Public - - - Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Public - - - Engine\Source\Runtime\Engine\Classes\Kismet - - - FortniteGame\Source\FortniteGame\Public\Building - - - FortniteGame\Source\FortniteGame\Public\Building - - - Engine\Source\Runtime\Core\Public\Math - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - FortniteGame\Source\FortniteGame\Public\Weapons - - - Engine\Source\Runtime\Engine\Classes\Kismet - - - Engine\Source\Runtime\Engine\Classes\Components - - - FortniteGame\Source\FortniteGame\Public\Items - - - FortniteGame\Source\FortniteGame\Public - - - Engine\Source\Runtime\GameplayTags\Classes - - - FortniteGame\Source\FortniteGame\Public\Items - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\Engine\Classes\Engine - - - FortniteGame\Source\FortniteGame\Public\Items - - - Engine\Source\Runtime\Core\Public\Containers - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Containers - - - Engine\Source\Runtime\Core\Public\Containers - - - Engine\Source\Runtime\Core\Public\Containers - - - Engine\Source\Runtime\Core\Public\Containers - - - Engine\Source\Runtime\Engine\Classes\Kismet - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\Engine\Classes\Kismet - - - FortniteGame\Source\FortniteGame\Public\Items - - - FortniteGame\Source\FortniteGame\Public\Building - - - FortniteGame\Source\FortniteGame\Public\Pawns - - - Reboot\Public - - - Reboot\Public - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public\Items - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public - - - FortniteGame\Source\FortniteGame\Public\Creative - - - FortniteGame\Source\FortniteGame\Public\Creative - - - FortniteGame\Source\FortniteGame\Public\Items - - - FortniteGame\Source\FortniteGame\Public - - - FortniteGame\Source\FortniteGame\Public\Items - - - FortniteGame\Source\FortniteGame\Public\Building - - - FortniteGame\Source\FortniteGame\Public\Building - - - FortniteGame\Source\FortniteGame\Public\Creative\Minigame - - - Reboot\Public - - - Reboot\Public - - - Engine\Source\Runtime\Engine\Classes\Engine - - - FortniteGame\Source\FortniteGame\Public - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\CoreUObject\Public\Misc - - - FortniteGame\Source\FortniteGame\Public\Building\GameplayActors - - - Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Public - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public\Items - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Engine\Classes\Engine - - - FortniteGame\Source\FortniteGame\Public\Pawns - - - Engine\Source\Runtime\Core\Public\GenericPlatform - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\Core\Public\Misc - - - Engine\Source\Runtime\Core\Public\Math - - - Engine\Source\Runtime\Core\Public\GenericPlatform - - - Engine\Source\Runtime\Core\Public\Math - - - FortniteGame\Source\FortniteGame\Public\Items - - - FortniteGame\Source\FortniteGame\Public - - - Reboot\Public - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public - - - FortniteGame\Source\FortniteGame\Public\Abilities - - - Engine\Source\Runtime\Core\Public\Delegates - - - Engine\Source\Runtime\Core\Public\Delegates - - - Engine\Source\Runtime\Core\Public\Internationalization - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Engine\Classes\Kismet - - - FortniteGame\Source\FortniteGame\Public\Athena\Vehicle - - - Engine\Source\Runtime\Core\Public\Algo - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Algo - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Algo\Impl - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Misc - - - Engine\Source\Runtime\Core\Public\Templates - - - FortniteGame\Source\FortniteGame\Public - - - Reboot\Public - - - Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Public - - - FortniteGame\Source\FortniteGame\Public\Athena\Vehicle - - - FortniteGame\Source\FortniteGame\Public\Athena\Vehicle - - - FortniteGame\Source\FortniteGame\Public\Athena\Vehicle - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Core\Public\Math - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Engine\Classes\GameFramework - - - FortniteGame\Source\FortniteGame\Public\Building - - - Engine\Source\Runtime\Engine\Classes\Engine - - - FortniteGame\Source\FortniteGame\Public - - - FortniteGame\Source\FortniteGame\Public\Building\GameplayActors\Barrier - - - FortniteGame\Source\FortniteGame\Public\Building\GameplayActors\Barrier - - - FortniteGame\Source\FortniteGame\Public\Building\GameplayActors\Barrier - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\Engine\Public - - - Engine\Source\Runtime\Core\Public\Delegates - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - Engine\Source\Runtime\Core\Public\GenericPlatform - - - Engine\Source\Runtime\Core\Public\Templates - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\Core\Public\Delegates - - - Engine\Source\Runtime\Core\Public\Templates - - - FortniteGame\Source\FortniteGame\Public\Items - - - Reboot\Public - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public - - - Engine\Source\Runtime\CoreUObject\Public\UObject - - - FortniteGame\Source\FortniteGame\Public\Athena\Vehicle - - - FortniteGame\Source\FortniteGame\Public\Building - - - Engine\Source\Runtime\Core\Public\Math - - - Engine\Source\Runtime\Core\Public\Math - - - Engine\Source\Runtime\Core\Public\Templates - - - FortniteGame\Source\FortniteGame\Public\Items - - - Reboot\Public - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public\Athena - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - Reboot\Public - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public\Athena - - - FortniteGame\Source\FortniteGame\Public - - - FortniteGame\Source\FortniteGame\Public\Building - - - FortniteGame\Source\FortniteGame\Public\Athena\Island - - - Engine\Source\Runtime\Engine\Classes\Engine - - - Engine\Source\Runtime\Engine\Classes\Engine - - - FortniteGame\Source\FortniteGame\Public\Athena\Modifiers - - - FortniteGame\Source\FortniteGame\Public\AI - - - FortniteGame\Source\FortniteGame\Public\AI - - - FortniteGame\Source\FortniteGame\Public\Athena - - - FortniteGame\Source\FortniteGame\Public\AI - - - Engine\Source\Runtime\AIModule\Classes\EnvironmentQuery - - - Engine\Source\Runtime\AIModule\Classes\EnvironmentQuery - - - Engine\Source\Developer\ScriptDisassembler\Public - - - FortniteGame\Source\FortniteGame\Public\AI - - - FortniteGame\Source\FortniteGame\Public\AI - - - FortniteGame\Source\FortniteGame\Public\AI - - - FortniteGame\Source\FortniteGame\Public\Building\GameplayActors - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public\Athena\Vehicle - - - FortniteGame\Source\FortniteGame\Public\Athena\Vehicle - - - Reboot\Public - - - FortniteGame\Source\FortniteGame\Public\Stats - - - FortniteGame\Source\FortniteGame\Public - - - - - {b88dd971-6115-4cb9-92c3-7bb9a4d9474a} - - - {44b71ed5-9173-4e31-9938-2214bbc4b0e8} - - - {3cc1cd7a-b3d3-47e9-960e-3fb3814fb588} - - - {f9419e52-4764-4d38-b071-87c82b9c2317} - - - {40e6dd42-e035-44da-8cc3-768d479865f6} - - - {9613f557-a37d-4e60-9462-19db955824bc} - - - {eabe5e8e-f084-4bcb-b302-af5d52ebfe39} - - - {d7b8c9a5-5bbe-49a8-b5b0-3ff6d626534f} - - - {e959a791-dbdf-4ec3-a3b3-7f75724d3ce5} - - - {81055b71-1fa3-44f0-b3b8-1b6c8c464514} - - - {08555946-4ef9-4777-94fb-9025ca2dfe61} - - - {34d20f6d-7b34-47a0-b7d5-fcfff1e61401} - - - {71e5f0ae-2081-44af-9847-63afa97ecb00} - - - {b7da14ca-b328-43b1-988b-84af45b808ba} - - - {493b9ebf-983a-4560-a8fc-72781136acdd} - - - {a7131bef-c957-4218-a28c-f1ed68b3fcf2} - - - {f889566a-76be-45e4-824e-71bd6d57c8a6} - - - {58aa6032-1f71-43db-8de6-de3fd72baae5} - - - {812667a2-87b9-4901-bea3-1b5f9f757892} - - - {52fcb572-6fc2-4315-a929-690dc0ab0f97} - - - {a736197d-560f-4eb7-9beb-8add1012ce04} - - - {ffd2b7f3-d44a-45f3-8c06-7c24cd9909de} - - - {2f1b66bd-6006-4ab0-9924-8aaaac4af427} - - - {f97d67ee-e06e-4721-8318-a23f4279e620} - - - {21ca8107-eea3-4cf5-ae5a-17159838820c} - - - {717548a7-0c7f-4bdb-bb99-5744b0e206c0} - - - {4533fd04-0668-4607-a456-0f781bad54f9} - - - {02d68293-0dad-48ba-a61f-60fbfdab971e} - - - {7b146e1a-c896-42ff-bffe-b7a6f6b0240a} - - - {ccf18d87-2aa4-4f58-bd54-7271e99845b5} - - - {3a7564c8-56c2-4273-8a34-67dafe5522c4} - - - {4f177a72-585d-4b79-a258-26bb6d2c225c} - - - {826a509f-03f4-4a18-a9bf-d67b69fe3b93} - - - {55eb1be2-e289-436e-9a10-68ca9f20d6d9} - - - {ff05565d-6ed7-4f30-9378-1951bab60567} - - - {d42d8fb0-7e1c-4194-bc0e-a0257dd6dbec} - - - {a29f6a34-9f04-43ac-adae-48d4751a761d} - - - {87195f09-7368-4d8d-88cb-224e3f96ae43} - - - {9cdf2185-5e04-4d3e-82a0-2e936f905379} - - - {a12cb364-3e34-454a-958f-b1fe54534353} - - - {6c0193a3-7b06-4298-99fe-a5a18be27d58} - - - {4ec49a59-4f0a-424b-9ac7-24901766da09} - - - {aa080dc3-54fb-43f1-b53f-2439e559198d} - - - {eab3cd46-ced6-4e56-9fda-ed35ec9f9f64} - - - {a6fd658c-6824-4186-b45e-2edf5d20eeae} - - - {1f8bc849-7da5-4917-a055-443ae102c233} - - - {3f2848b1-9e39-4c4b-b3bb-b4b5a8bb8360} - - - {247d4c62-23f7-4964-8879-5a0d65c44a73} - - - {bcb0d983-0b85-4ca6-9fac-6567c7d79921} - - - {ad1c6299-9a6d-4eba-a1f8-66642a8afd21} - - - {51b57917-fec7-41b7-bdc8-ad284a5385a4} - - - {d48c31c9-7283-4102-b951-dc0165e91836} - - - {ec38a50b-6bc9-440b-adf1-2291094b700f} - - - {18a41ed2-b864-4a36-9396-cb0672b8464d} - - - {7905895d-5ebf-4313-a9de-06f507c35113} - - - {915f7622-6003-445e-a43f-04d5c7e13b49} - - - {31a7f342-8b7c-4594-a24d-c4dd5c9d230d} - - - {653d6dbf-b361-41ea-a9b8-b85737412d66} - - - {8c77fdeb-c742-4e09-9790-7d32f5240b38} - - - {d0555c50-6464-4766-ad1f-2a7ae8b3b5dd} - - - {d01c7b5d-ef89-43ec-b94f-882c419aa74b} - - - {b00f4455-11e7-4fd9-aa6d-2d814788b544} - - - {98f1bd0d-3eea-4d54-8bff-65ecf4ab1e73} - - - {74e42db4-bdac-4e42-bb7e-58f1ab17b738} - - - {c0586029-3b4a-48f9-8de9-5b48a972cb5e} - - - {2eee3380-ea4b-4137-b058-b57a7b66005e} - - - {af212a31-57d1-4345-a73f-cd28dc4ebd2f} - - - {b1cc2ad4-6196-455c-bda7-d0a2e7be2e70} - - - {a633ca3f-f699-4c92-8522-e49a14157b95} - - - {a28fab04-cc3c-4032-ac3e-22c6b9379312} - - - {3d909143-220c-44b3-819f-79d282c3fc0f} - - - {c04eb59f-e186-49a3-a145-1fd3dc1dcd3d} - - - {563ca89b-be74-42a6-a995-f87ac7a532e4} - - - {39656a6c-bfe1-4521-8652-aea0146564d6} - - - {411d5144-2703-4a96-a7b0-9f2a81abdead} - - - {ade44d65-f7a4-4fc9-ac38-637c84493b58} - - - {7df06629-6271-4cd1-8f2c-ad8d6829b069} - - - {2d9beb55-a616-440e-8861-6a05f0ee2ef3} - - - {d4816986-6cba-4c02-aab1-19108664cbb1} - - - {8953303f-bfb2-4d61-945e-994fb1761cd8} - - - {7442549c-8d75-4bdb-a44a-df55140720c9} - - - {ababaf56-50f2-4d78-baa6-bad1b5ca1cf1} - - - {9b5483b5-3984-4fe1-96d2-e37d72642efd} - - - {4c658de2-f9aa-4a42-9d7c-21014cb29b3d} - - - {f64d3dc0-39df-46a5-a451-2f9011ecbad1} - - - {1df3fb86-ba8f-446d-be0c-cfeb7ec94137} - - - {45f601de-1a88-490c-a74a-5cf729b16dfb} - - - {702a4ab1-e5e1-46e1-b8cd-2fab1c4fb48c} - - - {3c8e3f87-8a4c-4220-b952-39b0e0315e85} - - - - - Engine\Source\Runtime\Engine\Private - - - Engine\Source\Runtime\Core\Public\Delegates - - - Engine\Source\Runtime\Core\Public\Misc - - - \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Quat.h b/dependencies/reboot/Project Reboot 3.0/Quat.h deleted file mode 100644 index db4d242..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Quat.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "inc.h" - -MS_ALIGN(16) struct FQuat -{ -public: - - /** The quaternion's X-component. */ - float X; - - /** The quaternion's Y-component. */ - float Y; - - /** The quaternion's Z-component. */ - float Z; - - /** The quaternion's W-component. */ - float W; - - struct FRotator Rotator() const; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/RandomStream.h b/dependencies/reboot/Project Reboot 3.0/RandomStream.h deleted file mode 100644 index dc4b18b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/RandomStream.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include "inc.h" - -struct FRandomStream -{ -public: - - /** - * Default constructor. - * - * The seed should be set prior to use. - */ - FRandomStream() - : InitialSeed(0) - , Seed(0) - { } - - /** - * Creates and initializes a new random stream from the specified seed value. - * - * @param InSeed The seed value. - */ - FRandomStream(int32 InSeed) - { - Initialize(InSeed); - } - -public: - - /** - * Initializes this random stream with the specified seed value. - * - * @param InSeed The seed value. - */ - void Initialize(int32 InSeed) - { - InitialSeed = InSeed; - Seed = uint32(InSeed); - } - - float GetFraction() const - { - MutateSeed(); - - float Result; - - *(uint32*)&Result = 0x3F800000U | (Seed >> 9); - - return Result - 1.0f; - } - - FORCEINLINE float FRand() const - { - return GetFraction(); - } - -protected: - - /** - * Mutates the current seed into the next seed. - */ - void MutateSeed() const - { - Seed = (Seed * 196314165U) + 907633515U; - } - -private: - - // Holds the initial seed. - int32 InitialSeed; - - // Holds the current seed. This should be an uint32 so that any shift to obtain top bits - // is a logical shift, rather than an arithmetic shift (which smears down the negative bit). - mutable uint32 Seed; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/RemoveCV.h b/dependencies/reboot/Project Reboot 3.0/RemoveCV.h deleted file mode 100644 index b5efbec..0000000 --- a/dependencies/reboot/Project Reboot 3.0/RemoveCV.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -template struct TRemoveCV { typedef T Type; }; -template struct TRemoveCV { typedef T Type; }; -template struct TRemoveCV { typedef T Type; }; -template struct TRemoveCV { typedef T Type; }; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/RemoveReference.h b/dependencies/reboot/Project Reboot 3.0/RemoveReference.h deleted file mode 100644 index f98cb14..0000000 --- a/dependencies/reboot/Project Reboot 3.0/RemoveReference.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -template struct TRemoveReference { typedef T Type; }; -template struct TRemoveReference { typedef T Type; }; -template struct TRemoveReference { typedef T Type; }; diff --git a/dependencies/reboot/Project Reboot 3.0/ReversePredicate.h b/dependencies/reboot/Project Reboot 3.0/ReversePredicate.h deleted file mode 100644 index 8a2a027..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ReversePredicate.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "UnrealTemplate.h" - -/** - * Helper class to reverse a predicate. - * Performs Predicate(B, A) - */ -template -class TReversePredicate -{ - const PredicateType& Predicate; - -public: - TReversePredicate(const PredicateType& InPredicate) - : Predicate(InPredicate) - {} - - template - FORCEINLINE bool operator()(T&& A, T&& B) const { return Predicate(Forward(B), Forward(A)); } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Rotator.h b/dependencies/reboot/Project Reboot 3.0/Rotator.h deleted file mode 100644 index e220514..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Rotator.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include "Quat.h" -#include "Vector.h" - -#include "UnrealMathUtility.h" - -struct FRotator -{ -#ifdef ABOVE_S20 - double Pitch; - double Yaw; - double Roll; -#else - float Pitch; - float Yaw; - float Roll; -#endif - - FQuat Quaternion() const; - - FVector Vector() const; - - static float NormalizeAxis(float Angle); - static float ClampAxis(float Angle); -}; - -FORCEINLINE float FRotator::ClampAxis(float Angle) -{ - // returns Angle in the range (-360,360) - Angle = FMath::Fmod(Angle, 360.f); - - if (Angle < 0.f) - { - // shift to [0,360) range - Angle += 360.f; - } - - return Angle; -} - -FORCEINLINE float FRotator::NormalizeAxis(float Angle) -{ - // returns Angle in the range [0,360) - Angle = ClampAxis(Angle); - - if (Angle > 180.f) - { - // shift to (-180,180] - Angle -= 360.f; - } - - return Angle; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/SavePackage.cpp b/dependencies/reboot/Project Reboot 3.0/SavePackage.cpp deleted file mode 100644 index 968f5ff..0000000 --- a/dependencies/reboot/Project Reboot 3.0/SavePackage.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "Package.h" - -#include "reboot.h" - -UClass* UPackage::StaticClass() -{ - static auto Class = FindObject("/Script/CoreUObject.Package"); - return Class; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ScriptDelegates.h b/dependencies/reboot/Project Reboot 3.0/ScriptDelegates.h deleted file mode 100644 index 2455b69..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ScriptDelegates.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -#include "WeakObjectPtr.h" - -template -class TScriptDelegate -{ -public: - TWeakPtr Object; - FName FunctionName; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ScriptDisassembler.cpp b/dependencies/reboot/Project Reboot 3.0/ScriptDisassembler.cpp deleted file mode 100644 index 8264ff6..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ScriptDisassembler.cpp +++ /dev/null @@ -1,1679 +0,0 @@ -#include "ScriptDisassembler.h" - -enum EExprToken425 -{ - // Variable references. - EX_LocalVariable = 0x00, // A local variable. - EX_InstanceVariable = 0x01, // An object variable. - EX_DefaultVariable = 0x02, // Default variable for a class context. - // = 0x03, - EX_Return = 0x04, // Return from function. - // = 0x05, - EX_Jump = 0x06, // Goto a local address in code. - EX_JumpIfNot = 0x07, // Goto if not expression. - // = 0x08, - EX_Assert = 0x09, // Assertion. - // = 0x0A, - EX_Nothing = 0x0B, // No operation. - // = 0x0C, - // = 0x0D, - // = 0x0E, - EX_Let = 0x0F, // Assign an arbitrary size value to a variable. - // = 0x10, - // = 0x11, - EX_ClassContext = 0x12, // Class default object context. - EX_MetaCast = 0x13, // Metaclass cast. - EX_LetBool = 0x14, // Let boolean variable. - EX_EndParmValue = 0x15, // end of default value for optional function parameter - EX_EndFunctionParms = 0x16, // End of function call parameters. - EX_Self = 0x17, // Self object. - EX_Skip = 0x18, // Skippable expression. - EX_Context = 0x19, // Call a function through an object context. - EX_Context_FailSilent = 0x1A, // Call a function through an object context (can fail silently if the context is NULL; only generated for functions that don't have output or return values). - EX_VirtualFunction = 0x1B, // A function call with parameters. - EX_FinalFunction = 0x1C, // A prebound function call with parameters. - EX_IntConst = 0x1D, // Int constant. - EX_FloatConst = 0x1E, // Floating point constant. - EX_StringConst = 0x1F, // String constant. - EX_ObjectConst = 0x20, // An object constant. - EX_NameConst = 0x21, // A name constant. - EX_RotationConst = 0x22, // A rotation constant. - EX_VectorConst = 0x23, // A vector constant. - EX_ByteConst = 0x24, // A byte constant. - EX_IntZero = 0x25, // Zero. - EX_IntOne = 0x26, // One. - EX_True = 0x27, // Bool True. - EX_False = 0x28, // Bool False. - EX_TextConst = 0x29, // FText constant - EX_NoObject = 0x2A, // NoObject. - EX_TransformConst = 0x2B, // A transform constant - EX_IntConstByte = 0x2C, // Int constant that requires 1 byte. - EX_NoInterface = 0x2D, // A null interface (similar to EX_NoObject, but for interfaces) - EX_DynamicCast = 0x2E, // Safe dynamic class casting. - EX_StructConst = 0x2F, // An arbitrary UStruct constant - EX_EndStructConst = 0x30, // End of UStruct constant - EX_SetArray = 0x31, // Set the value of arbitrary array - EX_EndArray = 0x32, - // = 0x33, - EX_UnicodeStringConst = 0x34, // Unicode string constant. - EX_Int64Const = 0x35, // 64-bit integer constant. - EX_UInt64Const = 0x36, // 64-bit unsigned integer constant. - // = 0x37, - EX_PrimitiveCast = 0x38, // A casting operator for primitives which reads the type as the subsequent byte - EX_SetSet = 0x39, - EX_EndSet = 0x3A, - EX_SetMap = 0x3B, - EX_EndMap = 0x3C, - EX_SetConst = 0x3D, - EX_EndSetConst = 0x3E, - EX_MapConst = 0x3F, - EX_EndMapConst = 0x40, - // = 0x41, - EX_StructMemberContext = 0x42, // Context expression to address a property within a struct - EX_LetMulticastDelegate = 0x43, // Assignment to a multi-cast delegate - EX_LetDelegate = 0x44, // Assignment to a delegate - EX_LocalVirtualFunction = 0x45, // Special instructions to quickly call a virtual function that we know is going to run only locally - EX_LocalFinalFunction = 0x46, // Special instructions to quickly call a final function that we know is going to run only locally - // = 0x47, // CST_ObjectToBool - EX_LocalOutVariable = 0x48, // local out (pass by reference) function parameter - // = 0x49, // CST_InterfaceToBool - EX_DeprecatedOp4A = 0x4A, - EX_InstanceDelegate = 0x4B, // const reference to a delegate or normal function object - EX_PushExecutionFlow = 0x4C, // push an address on to the execution flow stack for future execution when a EX_PopExecutionFlow is executed. Execution continues on normally and doesn't change to the pushed address. - EX_PopExecutionFlow = 0x4D, // continue execution at the last address previously pushed onto the execution flow stack. - EX_ComputedJump = 0x4E, // Goto a local address in code, specified by an integer value. - EX_PopExecutionFlowIfNot = 0x4F, // continue execution at the last address previously pushed onto the execution flow stack, if the condition is not true. - EX_Breakpoint = 0x50, // Breakpoint. Only observed in the editor, otherwise it behaves like EX_Nothing. - EX_InterfaceContext = 0x51, // Call a function through a native interface variable - EX_ObjToInterfaceCast = 0x52, // Converting an object reference to native interface variable - EX_EndOfScript = 0x53, // Last byte in script code - EX_CrossInterfaceCast = 0x54, // Converting an interface variable reference to native interface variable - EX_InterfaceToObjCast = 0x55, // Converting an interface variable reference to an object - // = 0x56, - // = 0x57, - // = 0x58, - // = 0x59, - EX_WireTracepoint = 0x5A, // Trace point. Only observed in the editor, otherwise it behaves like EX_Nothing. - EX_SkipOffsetConst = 0x5B, // A CodeSizeSkipOffset constant - EX_AddMulticastDelegate = 0x5C, // Adds a delegate to a multicast delegate's targets - EX_ClearMulticastDelegate = 0x5D, // Clears all delegates in a multicast target - EX_Tracepoint = 0x5E, // Trace point. Only observed in the editor, otherwise it behaves like EX_Nothing. - EX_LetObj = 0x5F, // assign to any object ref pointer - EX_LetWeakObjPtr = 0x60, // assign to a weak object pointer - EX_BindDelegate = 0x61, // bind object and name to delegate - EX_RemoveMulticastDelegate = 0x62, // Remove a delegate from a multicast delegate's targets - EX_CallMulticastDelegate = 0x63, // Call multicast delegate - EX_LetValueOnPersistentFrame = 0x64, - EX_ArrayConst = 0x65, - EX_EndArrayConst = 0x66, - EX_SoftObjectConst = 0x67, - EX_CallMath = 0x68, // static pure function from on local call space - EX_SwitchValue = 0x69, - EX_InstrumentationEvent = 0x6A, // Instrumentation event - EX_ArrayGetByRef = 0x6B, - EX_ClassSparseDataVariable = 0x6C, // Sparse data variable - EX_FieldPathConst = 0x6D, - EX_Max = 0x100, -}; - - -void FKismetBytecodeDisassembler::DisassembleStructure(UFunction* Source) -{ - // Script.Empty(); - // Script.Append(Source->Script); - - for (int i = 0; i < Source->GetScript().Num(); i++) - { - Script.push_back(Source->GetScript().at(i)); - } - - int32 ScriptIndex = 0; - while (ScriptIndex < Script.size()) - { - Stream << std::format("Label_0x{:x}", ScriptIndex); - - AddIndent(); - SerializeExpr(ScriptIndex); - DropIndent(); - } -} - -uint8 FKismetBytecodeDisassembler::SerializeExpr(int32& ScriptIndex) -{ - AddIndent(); - - uint8 Opcode = Script[ScriptIndex]; - ScriptIndex++; - - ProcessCommon(ScriptIndex, Opcode); - - DropIndent(); - - return Opcode; -} - - -int32 FKismetBytecodeDisassembler::ReadINT(int32& ScriptIndex) -{ - int32 Value = Script[ScriptIndex]; ++ScriptIndex; - Value = Value | ((int32)Script[ScriptIndex] << 8); ++ScriptIndex; - Value = Value | ((int32)Script[ScriptIndex] << 16); ++ScriptIndex; - Value = Value | ((int32)Script[ScriptIndex] << 24); ++ScriptIndex; - - return Value; -} - -uint64 FKismetBytecodeDisassembler::ReadQWORD(int32& ScriptIndex) -{ - uint64 Value = Script[ScriptIndex]; ++ScriptIndex; - Value = Value | ((uint64)Script[ScriptIndex] << 8); ++ScriptIndex; - Value = Value | ((uint64)Script[ScriptIndex] << 16); ++ScriptIndex; - Value = Value | ((uint64)Script[ScriptIndex] << 24); ++ScriptIndex; - Value = Value | ((uint64)Script[ScriptIndex] << 32); ++ScriptIndex; - Value = Value | ((uint64)Script[ScriptIndex] << 40); ++ScriptIndex; - Value = Value | ((uint64)Script[ScriptIndex] << 48); ++ScriptIndex; - Value = Value | ((uint64)Script[ScriptIndex] << 56); ++ScriptIndex; - - return Value; -} - -struct FScriptName // todo mve -{ - uint32_t ComparisonIndex; - uint32_t DisplayIndex; - uint32_t Number = 0; -}; - -uint8 FKismetBytecodeDisassembler::ReadBYTE(int32& ScriptIndex) -{ - uint8 Value = Script[ScriptIndex]; ++ScriptIndex; - - return Value; -} - -std::string FKismetBytecodeDisassembler::ReadName(int32& ScriptIndex) -{ - const FScriptName ConstValue = *(FScriptName*)(Script.data() + ScriptIndex); - ScriptIndex += sizeof(FScriptName); - - FName Name; - Name.ComparisonIndex.Value = ConstValue.ComparisonIndex; - Name.Number = ConstValue.Number; - - return Name.ToString(); -} - -uint16 FKismetBytecodeDisassembler::ReadWORD(int32& ScriptIndex) -{ - uint16 Value = Script[ScriptIndex]; ++ScriptIndex; - Value = Value | ((uint16)Script[ScriptIndex] << 8); ++ScriptIndex; - return Value; -} - -float FKismetBytecodeDisassembler::ReadFLOAT(int32& ScriptIndex) -{ - union { float f; int32 i; } Result; - Result.i = ReadINT(ScriptIndex); - return Result.f; -} - -CodeSkipSizeType FKismetBytecodeDisassembler::ReadSkipCount(int32& ScriptIndex) -{ -#if SCRIPT_LIMIT_BYTECODE_TO_64KB - return ReadWORD(ScriptIndex); -#else - static_assert(sizeof(CodeSkipSizeType) == 4, "Update this code as size changed."); - return ReadINT(ScriptIndex); -#endif -} - -std::string FKismetBytecodeDisassembler::ReadString(int32& ScriptIndex) -{ - const uint8 Opcode = Script[ScriptIndex++]; - - switch (Opcode) - { - case EX_StringConst: - return ReadString8(ScriptIndex); - - case EX_UnicodeStringConst: - return ReadString16(ScriptIndex); - - default: - // checkf(false, TEXT("FKismetBytecodeDisassembler::ReadString - Unexpected opcode. Expected %d or %d, got %d"), (int)EX_StringConst, (int)EX_UnicodeStringConst, (int)Opcode); - break; - } - - return std::string(); -} - -std::string FKismetBytecodeDisassembler::ReadString8(int32& ScriptIndex) -{ - std::string Result; - - do - { - Result += (ANSICHAR)ReadBYTE(ScriptIndex); - } while (Script[ScriptIndex - 1] != 0); - - return Result; -} - -std::string FKismetBytecodeDisassembler::ReadString16(int32& ScriptIndex) -{ - std::string Result; - - do - { - Result += (TCHAR)ReadWORD(ScriptIndex); - } while ((Script[ScriptIndex - 1] != 0) || (Script[ScriptIndex - 2] != 0)); - - // Inline combine any surrogate pairs in the data when loading into a UTF-32 string - // StringConv::InlineCombineSurrogates(Result); - - return Result; -} - -void FKismetBytecodeDisassembler::ProcessCastByte(int32 CastType, int32& ScriptIndex) -{ - // Expression of cast - SerializeExpr(ScriptIndex); -} - -namespace EExprToken -{ - static uint8 GetPrimitiveCast() - { - if (Engine_Version == 425) - return EExprToken425::EX_PrimitiveCast; - } - - static uint8 GetEndSet() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndSet; - } - - static uint8 GetSetConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_SetConst; - } - - static uint8 GetEndSetConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndSetConst; - } - - static uint8 GetSetMap() - { - if (Engine_Version == 425) - return EExprToken425::EX_SetMap; - } - - static uint8 GetEndMap() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndMap; - } - - static uint8 GetMapConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_MapConst; - } - - static uint8 GetEndMapConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndMapConst; - } - - static uint8 GetObjToInterfaceCast() - { - if (Engine_Version == 425) - return EExprToken425::EX_ObjToInterfaceCast; - } - - static uint8 GetCrossInterfaceCast() - { - if (Engine_Version == 425) - return EExprToken425::EX_CrossInterfaceCast; - } - - static uint8 GetInterfaceToObjCast() - { - if (Engine_Version == 425) - return EExprToken425::EX_InterfaceToObjCast; - } - - static uint8 GetLet() - { - if (Engine_Version == 425) - return EExprToken425::EX_Let; - } - - static uint8 GetSetSet() - { - if (Engine_Version == 425) - return EExprToken425::EX_SetSet; - } - - static uint8 GetLetObj() - { - if (Engine_Version == 425) - return EExprToken425::EX_LetObj; - } - - static uint8 GetLetWeakObjectPtr() - { - if (Engine_Version == 425) - return EExprToken425::EX_LetWeakObjPtr; - } - - static uint8 GetLetBool() - { - if (Engine_Version == 425) - return EExprToken425::EX_LetBool; - } - - static uint8 GetLetValueOnPersistentFrame() - { - if (Engine_Version == 425) - return EExprToken425::EX_LetValueOnPersistentFrame; - } - - static uint8 GetStructMemberContext() - { - if (Engine_Version == 425) - return EExprToken425::EX_StructMemberContext; - } - - static uint8 GetLetDelegate() - { - if (Engine_Version == 425) - return EExprToken425::EX_LetDelegate; - } - - static uint8 GetLocalVirtualFunction() - { - if (Engine_Version == 425) - return EExprToken425::EX_LocalVirtualFunction; - } - - static uint8 GetLocalFinalFunction() - { - if (Engine_Version == 425) - return EExprToken425::EX_LocalFinalFunction; - } - - static uint8 GetLetMulticastDelegate() - { - if (Engine_Version == 425) - return EExprToken425::EX_LetMulticastDelegate; - } - - static uint8 GetComputedJump() - { - if (Engine_Version == 425) - return EExprToken425::EX_ComputedJump; - } - - static uint8 GetJump() - { - if (Engine_Version == 425) - return EExprToken425::EX_Jump; - } - - static uint8 GetLocalVariable() - { - if (Engine_Version == 425) - return EExprToken425::EX_LocalVariable; - } - - static uint8 GetDefaultVariable() - { - if (Engine_Version == 425) - return EExprToken425::EX_DefaultVariable; - } - - static uint8 GetInstanceVariable() - { - if (Engine_Version == 425) - return EExprToken425::EX_InstanceVariable; - } - - static uint8 GetLocalOutVariable() - { - if (Engine_Version == 425) - return EExprToken425::EX_LocalOutVariable; - } - - static uint8 GetClassSparseDataVariable() - { - if (Engine_Version == 425) - return EExprToken425::EX_ClassSparseDataVariable; - } - - static uint8 GetInterfaceContext() - { - if (Engine_Version == 425) - return EExprToken425::EX_InterfaceContext; - } - - static uint8 GetDeprecatedOp4A() - { - if (Engine_Version == 425) - return EExprToken425::EX_DeprecatedOp4A; - } - - static uint8 GetNothing() - { - if (Engine_Version == 425) - return EExprToken425::EX_Nothing; - } - - static uint8 GetEndOfScript() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndOfScript; - } - - static uint8 GetEndFunctionParms() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndFunctionParms; - } - - static uint8 GetEndStructConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndStructConst; - } - - static uint8 GetEndArray() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndArray; - } - - static uint8 GetEndArrayConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndArrayConst; - } - - static uint8 GetIntZero() - { - if (Engine_Version == 425) - return EExprToken425::EX_IntZero; - } - - static uint8 GetIntOne() - { - if (Engine_Version == 425) - return EExprToken425::EX_IntOne; - } - - static uint8 GetTrue() - { - if (Engine_Version == 425) - return EExprToken425::EX_True; - } - - static uint8 GetFalse() - { - if (Engine_Version == 425) - return EExprToken425::EX_False; - } - - static uint8 GetNoObject() - { - if (Engine_Version == 425) - return EExprToken425::EX_NoObject; - } - - static uint8 GetNoInterface() - { - if (Engine_Version == 425) - return EExprToken425::EX_NoInterface; - } - - static uint8 GetSelf() - { - if (Engine_Version == 425) - return EExprToken425::EX_Self; - } - - static uint8 GetEndParmValue() - { - if (Engine_Version == 425) - return EExprToken425::EX_EndParmValue; - } - - static uint8 GetReturn() - { - if (Engine_Version == 425) - return EExprToken425::EX_Return; - } - - static uint8 GetCallMath() - { - if (Engine_Version == 425) - return EExprToken425::EX_CallMath; - } - - static uint8 GetFinalFunction() - { - if (Engine_Version == 425) - return EExprToken425::EX_FinalFunction; - } - - static uint8 GetCallMulticastDelegate() - { - if (Engine_Version == 425) - return EExprToken425::EX_CallMulticastDelegate; - } - - static uint8 GetVirtaulFunction() - { - if (Engine_Version == 425) - return EExprToken425::EX_VirtualFunction; - } - - static uint8 GetClassContext() - { - if (Engine_Version == 425) - return EExprToken425::EX_ClassContext; - } - - static uint8 GetContext() - { - if (Engine_Version == 425) - return EExprToken425::EX_Context; - } - - static uint8 GetContext_FailSilent() - { - if (Engine_Version == 425) - return EExprToken425::EX_Context_FailSilent; - } - - static uint8 GetIntConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_IntConst; - } - - static uint8 GetSkipOffsetConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_SkipOffsetConst; - } - - static uint8 GetFloatConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_FloatConst; - } - - static uint8 GetStringConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_StringConst; - } - - static uint8 GetUnicodeStringConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_UnicodeStringConst; - } - - static uint8 GetTextConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_TextConst; - } - - static uint8 GetObjectConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_ObjectConst; - } - - static uint8 GetSoftObjectConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_SoftObjectConst; - } - - static uint8 GetFieldPathConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_FieldPathConst; - } - - static uint8 GetNameConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_NameConst; - } - - static uint8 GetRotationConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_RotationConst; - } - - static uint8 GetVectorConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_VectorConst; - } - - static uint8 GetTransformConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_TransformConst; - } - - static uint8 GetStructConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_StructConst; - } - - static uint8 GetSetArray() - { - if (Engine_Version == 425) - return EExprToken425::EX_SetArray; - } - - static uint8 GetArrayConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_ArrayConst; - } - - static uint8 GetByteConst() - { - if (Engine_Version == 425) - return EExprToken425::EX_ByteConst; - } - - static uint8 GetIntConstByte() - { - if (Engine_Version == 425) - return EExprToken425::EX_IntConstByte; - } - - static uint8 GetMetaCast() - { - if (Engine_Version == 425) - return EExprToken425::EX_MetaCast; - } - - static uint8 GetDynamicCast() - { - if (Engine_Version == 425) - return EExprToken425::EX_DynamicCast; - } - - static uint8 GetJumpIfNot() - { - if (Engine_Version == 425) - return EExprToken425::EX_JumpIfNot; - } - - static uint8 GetAssert() - { - if (Engine_Version == 425) - return EExprToken425::EX_Assert; - } - - static uint8 GetSkip() - { - if (Engine_Version == 425) - return EExprToken425::EX_Skip; - } - - static uint8 GetInstanceDelegate() - { - if (Engine_Version == 425) - return EExprToken425::EX_InstanceDelegate; - } - - static uint8 GetAddMulticastDelegate() - { - if (Engine_Version == 425) - return EExprToken425::EX_AddMulticastDelegate; - } - - static uint8 GetRemoveMulticastDelegate() - { - if (Engine_Version == 425) - return EExprToken425::EX_RemoveMulticastDelegate; - } - - static uint8 GetClearMulticastDelegate() - { - if (Engine_Version == 425) - return EExprToken425::EX_ClearMulticastDelegate; - } - - static uint8 GetBindDelegate() - { - if (Engine_Version == 425) - return EExprToken425::EX_BindDelegate; - } - - static uint8 GetPushExecutionFlow() - { - if (Engine_Version == 425) - return EExprToken425::EX_PushExecutionFlow; - } - - static uint8 GetPopExecutionFlowIfNot() - { - if (Engine_Version == 425) - return EExprToken425::EX_PopExecutionFlowIfNot; - } - - static uint8 GetBreakpoint() - { - if (Engine_Version == 425) - return EExprToken425::EX_Breakpoint; - } - - static uint8 GetWireTracepoint() - { - if (Engine_Version == 425) - return EExprToken425::EX_WireTracepoint; - } - - static uint8 GetInstrumentationEvent() - { - if (Engine_Version == 425) - return EExprToken425::EX_InstrumentationEvent; - } - - static uint8 GetTracepoint() - { - if (Engine_Version == 425) - return EExprToken425::EX_Tracepoint; - } - - static uint8 GetSwitchValue() - { - if (Engine_Version == 425) - return EExprToken425::EX_SwitchValue; - } - - static uint8 GetArrayGetByRef() - { - if (Engine_Version == 425) - return EExprToken425::EX_ArrayGetByRef; - } -} - -std::string GetNameSafe(void* Property) -{ - return GetFNameOfProp(Property)->ToString(); -} - -void FKismetBytecodeDisassembler::ProcessCommon(int32& ScriptIndex, uint8 Opcode) -{ - using FProperty = void; - - if (Opcode == EExprToken::GetPrimitiveCast()) - { - // A type conversion. - uint8 ConversionType = ReadBYTE(ScriptIndex); - Stream << std::format("{} PrimitiveCast of type {}", Indents, ConversionType); - AddIndent(); - - Stream << std::format("{} Argument:", Indents); - ProcessCastByte(ConversionType, ScriptIndex); - - //@TODO: - //Ar.Logf(TEXT("%s Expression:"), *Indents); - //SerializeExpr( ScriptIndex ); - } - else if (Opcode == EExprToken::GetSetSet()) - { - Stream << std::format("{} set set", Indents); - SerializeExpr(ScriptIndex); - ReadINT(ScriptIndex); - while (SerializeExpr(ScriptIndex) != EX_EndSet) - { - // Set contents - } - } - else if (Opcode == EExprToken::GetEndSet()) - { - Stream << std::format("{} EX_EndSet", Indents); - } - else if (Opcode == EExprToken::GetSetConst()) - { - FProperty* InnerProp = ReadPointer(ScriptIndex); - int32 Num = ReadINT(ScriptIndex); - Stream << std::format("{} set set const - elements number: {}, inner property: {}", Indents, Num, GetNameSafe(InnerProp)); - while (SerializeExpr(ScriptIndex) != EX_EndSetConst) - { - // Set contents - } - } - else if (Opcode == EExprToken::GetEndSetConst()) - { - Stream << std::format("{} EX_EndSetConst", Indents); - } - else if (Opcode == EExprToken::GetSetMap()) - { - Stream << std::format("{} set map", Indents); - SerializeExpr(ScriptIndex); - ReadINT(ScriptIndex); - while (SerializeExpr(ScriptIndex) != EX_EndMap) - { - // Map contents - } - } - else if (Opcode == EExprToken::GetEndMap()) - { - Stream << std::format("{} EX_EndMap", Indents); - } - else if (Opcode == EExprToken::GetMapConst()) - { - FProperty* KeyProp = ReadPointer(ScriptIndex); - FProperty* ValProp = ReadPointer(ScriptIndex); - int32 Num = ReadINT(ScriptIndex); - Stream << std::format("{} set map const - elements number: {}, key property: {}, val property: {}", Indents, Num, GetNameSafe(KeyProp), GetNameSafe(ValProp)); - while (SerializeExpr(ScriptIndex) != EX_EndMapConst) - { - // Map contents - } - } - else if (Opcode == EExprToken::GetEndMapConst()) - { - Stream << std::format("{} EX_EndMapConst", Indents); - } - else if (Opcode == EExprToken::GetObjToInterfaceCast()) - { - // A conversion from an object variable to a native interface variable. - // We use a different bytecode to avoid the branching each time we process a cast token - - // the interface class to convert to - UClass* InterfaceClass = ReadPointer(ScriptIndex); - Stream << std::format("{} ObjToInterfaceCast to {}", Indents, InterfaceClass->GetName()); - - SerializeExpr(ScriptIndex); - } - else if (Opcode == EExprToken::GetCrossInterfaceCast()) - { - // A conversion from one interface variable to a different interface variable. - // We use a different bytecode to avoid the branching each time we process a cast token - - // the interface class to convert to - UClass* InterfaceClass = ReadPointer(ScriptIndex); - Stream << std::format("{} InterfaceToInterfaceCast to {}", Indents, InterfaceClass->GetName()); - - SerializeExpr(ScriptIndex); - } - else if (Opcode == EExprToken::GetInterfaceToObjCast()) - { - // A conversion from an interface variable to a object variable. - // We use a different bytecode to avoid the branching each time we process a cast token - - // the interface class to convert to - UClass* ObjectClass = ReadPointer(ScriptIndex); - Stream << std::format("{} InterfaceToObjCast to {}", Indents, ObjectClass->GetName()); - - SerializeExpr(ScriptIndex); - } - else if (Opcode == EExprToken::GetLet()) - { - Stream << std::format("{} Let (Variable = Expression)", Indents); - AddIndent(); - - ReadPointer(ScriptIndex); - - // Variable expr. - Stream << std::format("{} Variable:", Indents); - SerializeExpr(ScriptIndex); - - // Assignment expr. - Stream << std::format("{} Expression:", Indents); - SerializeExpr(ScriptIndex); - - DropIndent(); - } - else if (Opcode == EExprToken::GetLetObj() || Opcode == EExprToken::GetLetWeakObjectPtr()) - { - if (Opcode == EExprToken::GetLetObj()) - { - Stream << std::format("{} Let Obj (Variable = Expression):", Indents); - } - else - { - Stream << std::format("{} Let WeakObjPtr (Variable = Expression):", Indents); - } - - AddIndent(); - - // Variable expr. - Stream << std::format("{} Variable:", Indents); - SerializeExpr(ScriptIndex); - - // Assignment expr. - Stream << std::format("{} Expression:", Indents); - SerializeExpr(ScriptIndex); - - DropIndent(); - } - else if (Opcode == EExprToken::GetLetBool()) - { - Stream << std::format("{} LetBool (Variable = Expression):", Indents); - AddIndent(); - - // Variable expr. - Stream << std::format("{} Variable:", Indents); - SerializeExpr(ScriptIndex); - - // Assignment expr. - Stream << std::format("{} Expression:", Indents); - SerializeExpr(ScriptIndex); - - DropIndent(); - } - /* - case EX_LetValueOnPersistentFrame: - { - Ar.Logf(TEXT("%s $%X: LetValueOnPersistentFrame"), *Indents, (int32)Opcode); - AddIndent(); - - auto Prop = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s Destination variable: %s, offset: %d"), *Indents, *GetNameSafe(Prop), - Prop ? Prop->GetOffset_ForDebug() : 0); - - Ar.Logf(TEXT("%s Expression:"), *Indents); - SerializeExpr(ScriptIndex); - - DropIndent(); - - break; - } - case EX_StructMemberContext: - { - Ar.Logf(TEXT("%s $%X: Struct member context "), *Indents, (int32)Opcode); - AddIndent(); - - FProperty* Prop = ReadPointer(ScriptIndex); - - Ar.Logf(TEXT("%s Expression within struct %s, offset %d"), *Indents, *(Prop->GetName()), - Prop->GetOffset_ForDebug()); // although that isn't a UFunction, we are not going to indirect the props of a struct, so this should be fine - - Ar.Logf(TEXT("%s Expression to struct:"), *Indents); - SerializeExpr(ScriptIndex); - - DropIndent(); - - break; - } - case EX_LetDelegate: - { - Ar.Logf(TEXT("%s $%X: LetDelegate (Variable = Expression)"), *Indents, (int32)Opcode); - AddIndent(); - - // Variable expr. - Ar.Logf(TEXT("%s Variable:"), *Indents); - SerializeExpr(ScriptIndex); - - // Assignment expr. - Ar.Logf(TEXT("%s Expression:"), *Indents); - SerializeExpr(ScriptIndex); - - DropIndent(); - break; - } - case EX_LocalVirtualFunction: - { - FString FunctionName = ReadName(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Local Virtual Script Function named %s"), *Indents, (int32)Opcode, *FunctionName); - - while (SerializeExpr(ScriptIndex) != EX_EndFunctionParms) - { - } - break; - } - case EX_LocalFinalFunction: - { - UStruct* StackNode = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Local Final Script Function (stack node %s::%s)"), *Indents, (int32)Opcode, StackNode ? *StackNode->GetOuter()->GetName() : TEXT("(null)"), StackNode ? *StackNode->GetName() : TEXT("(null)")); - - while (SerializeExpr(ScriptIndex) != EX_EndFunctionParms) - { - // Params - } - break; - } - case EX_LetMulticastDelegate: - { - Ar.Logf(TEXT("%s $%X: LetMulticastDelegate (Variable = Expression)"), *Indents, (int32)Opcode); - AddIndent(); - - // Variable expr. - Ar.Logf(TEXT("%s Variable:"), *Indents); - SerializeExpr(ScriptIndex); - - // Assignment expr. - Ar.Logf(TEXT("%s Expression:"), *Indents); - SerializeExpr(ScriptIndex); - - DropIndent(); - break; - } - - case EX_ComputedJump: - { - Ar.Logf(TEXT("%s $%X: Computed Jump, offset specified by expression:"), *Indents, (int32)Opcode); - - AddIndent(); - SerializeExpr(ScriptIndex); - DropIndent(); - - break; - } - - case EX_Jump: - { - CodeSkipSizeType SkipCount = ReadSkipCount(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Jump to offset 0x%X"), *Indents, (int32)Opcode, SkipCount); - break; - } - case EX_LocalVariable: - { - FProperty* PropertyPtr = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Local variable named %s"), *Indents, (int32)Opcode, PropertyPtr ? *PropertyPtr->GetName() : TEXT("(null)")); - break; - } - case EX_DefaultVariable: - { - FProperty* PropertyPtr = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Default variable named %s"), *Indents, (int32)Opcode, PropertyPtr ? *PropertyPtr->GetName() : TEXT("(null)")); - break; - } - case EX_InstanceVariable: - { - FProperty* PropertyPtr = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Instance variable named %s"), *Indents, (int32)Opcode, PropertyPtr ? *PropertyPtr->GetName() : TEXT("(null)")); - break; - } - case EX_LocalOutVariable: - { - FProperty* PropertyPtr = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Local out variable named %s"), *Indents, (int32)Opcode, PropertyPtr ? *PropertyPtr->GetName() : TEXT("(null)")); - break; - } - case EX_ClassSparseDataVariable: - { - FProperty* PropertyPtr = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Class sparse data variable named %s"), *Indents, (int32)Opcode, PropertyPtr ? *PropertyPtr->GetName() : TEXT("(null)")); - break; - } - case EX_InterfaceContext: - { - Ar.Logf(TEXT("%s $%X: EX_InterfaceContext:"), *Indents, (int32)Opcode); - SerializeExpr(ScriptIndex); - break; - } - case EX_DeprecatedOp4A: - { - Ar.Logf(TEXT("%s $%X: This opcode has been removed and does nothing."), *Indents, (int32)Opcode); - break; - } - case EX_Nothing: - { - Ar.Logf(TEXT("%s $%X: EX_Nothing"), *Indents, (int32)Opcode); - break; - } - case EX_EndOfScript: - { - Ar.Logf(TEXT("%s $%X: EX_EndOfScript"), *Indents, (int32)Opcode); - break; - } - case EX_EndFunctionParms: - { - Ar.Logf(TEXT("%s $%X: EX_EndFunctionParms"), *Indents, (int32)Opcode); - break; - } - case EX_EndStructConst: - { - Ar.Logf(TEXT("%s $%X: EX_EndStructConst"), *Indents, (int32)Opcode); - break; - } - case EX_EndArray: - { - Ar.Logf(TEXT("%s $%X: EX_EndArray"), *Indents, (int32)Opcode); - break; - } - case EX_EndArrayConst: - { - Ar.Logf(TEXT("%s $%X: EX_EndArrayConst"), *Indents, (int32)Opcode); - break; - } - case EX_IntZero: - { - Ar.Logf(TEXT("%s $%X: EX_IntZero"), *Indents, (int32)Opcode); - break; - } - case EX_IntOne: - { - Ar.Logf(TEXT("%s $%X: EX_IntOne"), *Indents, (int32)Opcode); - break; - } - case EX_True: - { - Ar.Logf(TEXT("%s $%X: EX_True"), *Indents, (int32)Opcode); - break; - } - case EX_False: - { - Ar.Logf(TEXT("%s $%X: EX_False"), *Indents, (int32)Opcode); - break; - } - case EX_NoObject: - { - Ar.Logf(TEXT("%s $%X: EX_NoObject"), *Indents, (int32)Opcode); - break; - } - case EX_NoInterface: - { - Ar.Logf(TEXT("%s $%X: EX_NoObject"), *Indents, (int32)Opcode); - break; - } - case EX_Self: - { - Ar.Logf(TEXT("%s $%X: EX_Self"), *Indents, (int32)Opcode); - break; - } - case EX_EndParmValue: - { - Ar.Logf(TEXT("%s $%X: EX_EndParmValue"), *Indents, (int32)Opcode); - break; - } - case EX_Return: - { - Ar.Logf(TEXT("%s $%X: Return expression"), *Indents, (int32)Opcode); - - SerializeExpr(ScriptIndex); // Return expression. - break; - } - case EX_CallMath: - { - UStruct* StackNode = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Call Math (stack node %s::%s)"), *Indents, (int32)Opcode, *GetNameSafe(StackNode ? StackNode->GetOuter() : nullptr), *GetNameSafe(StackNode)); - - while (SerializeExpr(ScriptIndex) != EX_EndFunctionParms) - { - // Params - } - break; - } - case EX_FinalFunction: - { - UStruct* StackNode = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Final Function (stack node %s::%s)"), *Indents, (int32)Opcode, StackNode ? *StackNode->GetOuter()->GetName() : TEXT("(null)"), StackNode ? *StackNode->GetName() : TEXT("(null)")); - - while (SerializeExpr(ScriptIndex) != EX_EndFunctionParms) - { - // Params - } - break; - } - case EX_CallMulticastDelegate: - { - UStruct* StackNode = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: CallMulticastDelegate (signature %s::%s) delegate:"), *Indents, (int32)Opcode, StackNode ? *StackNode->GetOuter()->GetName() : TEXT("(null)"), StackNode ? *StackNode->GetName() : TEXT("(null)")); - SerializeExpr(ScriptIndex); - Ar.Logf(TEXT("Params:")); - while (SerializeExpr(ScriptIndex) != EX_EndFunctionParms) - { - // Params - } - break; - } - case EX_VirtualFunction: - { - FString FunctionName = ReadName(ScriptIndex); - Ar.Logf(TEXT("%s $%X: Virtual Function named %s"), *Indents, (int32)Opcode, *FunctionName); - - while (SerializeExpr(ScriptIndex) != EX_EndFunctionParms) - { - } - break; - } - case EX_ClassContext: - case EX_Context: - case EX_Context_FailSilent: - { - Ar.Logf(TEXT("%s $%X: %s"), *Indents, (int32)Opcode, Opcode == EX_ClassContext ? TEXT("Class Context") : TEXT("Context")); - AddIndent(); - - // Object expression. - Ar.Logf(TEXT("%s ObjectExpression:"), *Indents); - SerializeExpr(ScriptIndex); - - if (Opcode == EX_Context_FailSilent) - { - Ar.Logf(TEXT(" Can fail silently on access none ")); - } - - // Code offset for NULL expressions. - CodeSkipSizeType SkipCount = ReadSkipCount(ScriptIndex); - Ar.Logf(TEXT("%s Skip Bytes: 0x%X"), *Indents, SkipCount); - - // Property corresponding to the r-value data, in case the l-value needs to be mem-zero'd - FField* Field = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s R-Value Property: %s"), *Indents, Field ? *Field->GetName() : TEXT("(null)")); - - // Context expression. - Ar.Logf(TEXT("%s ContextExpression:"), *Indents); - SerializeExpr(ScriptIndex); - - DropIndent(); - break; - } - case EX_IntConst: - { - int32 ConstValue = ReadINT(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal int32 %d"), *Indents, (int32)Opcode, ConstValue); - break; - } - case EX_SkipOffsetConst: - { - CodeSkipSizeType ConstValue = ReadSkipCount(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal CodeSkipSizeType 0x%X"), *Indents, (int32)Opcode, ConstValue); - break; - } - case EX_FloatConst: - { - float ConstValue = ReadFLOAT(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal float %f"), *Indents, (int32)Opcode, ConstValue); - break; - } - case EX_StringConst: - { - FString ConstValue = ReadString8(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal ansi string \"%s\""), *Indents, (int32)Opcode, *ConstValue); - break; - } - case EX_UnicodeStringConst: - { - FString ConstValue = ReadString16(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal unicode string \"%s\""), *Indents, (int32)Opcode, *ConstValue); - break; - } - case EX_TextConst: - { - // What kind of text are we dealing with? - const EBlueprintTextLiteralType TextLiteralType = (EBlueprintTextLiteralType)Script[ScriptIndex++]; - - switch (TextLiteralType) - { - case EBlueprintTextLiteralType::Empty: - { - Ar.Logf(TEXT("%s $%X: literal text - empty"), *Indents, (int32)Opcode); - } - break; - - case EBlueprintTextLiteralType::LocalizedText: - { - const FString SourceString = ReadString(ScriptIndex); - const FString KeyString = ReadString(ScriptIndex); - const FString Namespace = ReadString(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal text - localized text { namespace: \"%s\", key: \"%s\", source: \"%s\" }"), *Indents, (int32)Opcode, *Namespace, *KeyString, *SourceString); - } - break; - - case EBlueprintTextLiteralType::InvariantText: - { - const FString SourceString = ReadString(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal text - invariant text: \"%s\""), *Indents, (int32)Opcode, *SourceString); - } - break; - - case EBlueprintTextLiteralType::LiteralString: - { - const FString SourceString = ReadString(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal text - literal string: \"%s\""), *Indents, (int32)Opcode, *SourceString); - } - break; - - case EBlueprintTextLiteralType::StringTableEntry: - { - ReadPointer(ScriptIndex); // String Table asset (if any) - const FString TableIdString = ReadString(ScriptIndex); - const FString KeyString = ReadString(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal text - string table entry { tableid: \"%s\", key: \"%s\" }"), *Indents, (int32)Opcode, *TableIdString, *KeyString); - } - break; - - default: - checkf(false, TEXT("Unknown EBlueprintTextLiteralType! Please update FKismetBytecodeDisassembler::ProcessCommon to handle this type of text.")); - break; - } - break; - } - case EX_ObjectConst: - { - UObject* Pointer = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: EX_ObjectConst (%p:%s)"), *Indents, (int32)Opcode, Pointer, *Pointer->GetFullName()); - break; - } - case EX_SoftObjectConst: - { - Ar.Logf(TEXT("%s $%X: EX_SoftObjectConst"), *Indents, (int32)Opcode); - SerializeExpr(ScriptIndex); - break; - } - case EX_FieldPathConst: - { - Ar.Logf(TEXT("%s $%X: EX_FieldPathConst"), *Indents, (int32)Opcode); - SerializeExpr(ScriptIndex); - break; - } - case EX_NameConst: - { - FString ConstValue = ReadName(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal name %s"), *Indents, (int32)Opcode, *ConstValue); - break; - } - case EX_RotationConst: - { - float Pitch = ReadFLOAT(ScriptIndex); - float Yaw = ReadFLOAT(ScriptIndex); - float Roll = ReadFLOAT(ScriptIndex); - - Ar.Logf(TEXT("%s $%X: literal rotation (%f,%f,%f)"), *Indents, (int32)Opcode, Pitch, Yaw, Roll); - break; - } - case EX_VectorConst: - { - float X = ReadFLOAT(ScriptIndex); - float Y = ReadFLOAT(ScriptIndex); - float Z = ReadFLOAT(ScriptIndex); - - Ar.Logf(TEXT("%s $%X: literal vector (%f,%f,%f)"), *Indents, (int32)Opcode, X, Y, Z); - break; - } - case EX_TransformConst: - { - - float RotX = ReadFLOAT(ScriptIndex); - float RotY = ReadFLOAT(ScriptIndex); - float RotZ = ReadFLOAT(ScriptIndex); - float RotW = ReadFLOAT(ScriptIndex); - - float TransX = ReadFLOAT(ScriptIndex); - float TransY = ReadFLOAT(ScriptIndex); - float TransZ = ReadFLOAT(ScriptIndex); - - float ScaleX = ReadFLOAT(ScriptIndex); - float ScaleY = ReadFLOAT(ScriptIndex); - float ScaleZ = ReadFLOAT(ScriptIndex); - - Ar.Logf(TEXT("%s $%X: literal transform R(%f,%f,%f,%f) T(%f,%f,%f) S(%f,%f,%f)"), *Indents, (int32)Opcode, TransX, TransY, TransZ, RotX, RotY, RotZ, RotW, ScaleX, ScaleY, ScaleZ); - break; - } - case EX_StructConst: - { - UScriptStruct* Struct = ReadPointer(ScriptIndex); - int32 SerializedSize = ReadINT(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal struct %s (serialized size: %d)"), *Indents, (int32)Opcode, *Struct->GetName(), SerializedSize); - while (SerializeExpr(ScriptIndex) != EX_EndStructConst) - { - // struct contents - } - break; - } - case EX_SetArray: - { - Ar.Logf(TEXT("%s $%X: set array"), *Indents, (int32)Opcode); - SerializeExpr(ScriptIndex); - while (SerializeExpr(ScriptIndex) != EX_EndArray) - { - // Array contents - } - break; - } - case EX_ArrayConst: - { - FProperty* InnerProp = ReadPointer(ScriptIndex); - int32 Num = ReadINT(ScriptIndex); - Ar.Logf(TEXT("%s $%X: set array const - elements number: %d, inner property: %s"), *Indents, (int32)Opcode, Num, *GetNameSafe(InnerProp)); - while (SerializeExpr(ScriptIndex) != EX_EndArrayConst) - { - // Array contents - } - break; - } - case EX_ByteConst: - { - uint8 ConstValue = ReadBYTE(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal byte %d"), *Indents, (int32)Opcode, ConstValue); - break; - } - case EX_IntConstByte: - { - int32 ConstValue = ReadBYTE(ScriptIndex); - Ar.Logf(TEXT("%s $%X: literal int %d"), *Indents, (int32)Opcode, ConstValue); - break; - } - case EX_MetaCast: - { - UClass* Class = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: MetaCast to %s of expr:"), *Indents, (int32)Opcode, *Class->GetName()); - SerializeExpr(ScriptIndex); - break; - } - case EX_DynamicCast: - { - UClass* Class = ReadPointer(ScriptIndex); - Ar.Logf(TEXT("%s $%X: DynamicCast to %s of expr:"), *Indents, (int32)Opcode, *Class->GetName()); - SerializeExpr(ScriptIndex); - break; - } - case EX_JumpIfNot: - { - // Code offset. - CodeSkipSizeType SkipCount = ReadSkipCount(ScriptIndex); - - Ar.Logf(TEXT("%s $%X: Jump to offset 0x%X if not expr:"), *Indents, (int32)Opcode, SkipCount); - - // Boolean expr. - SerializeExpr(ScriptIndex); - break; - } - case EX_Assert: - { - uint16 LineNumber = ReadWORD(ScriptIndex); - uint8 InDebugMode = ReadBYTE(ScriptIndex); - - Ar.Logf(TEXT("%s $%X: assert at line %d, in debug mode = %d with expr:"), *Indents, (int32)Opcode, LineNumber, InDebugMode); - SerializeExpr(ScriptIndex); // Assert expr. - break; - } - case EX_Skip: - { - CodeSkipSizeType W = ReadSkipCount(ScriptIndex); - Ar.Logf(TEXT("%s $%X: possibly skip 0x%X bytes of expr:"), *Indents, (int32)Opcode, W); - - // Expression to possibly skip. - SerializeExpr(ScriptIndex); - - break; - } - case EX_InstanceDelegate: - { - // the name of the function assigned to the delegate. - FString FuncName = ReadName(ScriptIndex); - - Ar.Logf(TEXT("%s $%X: instance delegate function named %s"), *Indents, (int32)Opcode, *FuncName); - break; - } - case EX_AddMulticastDelegate: - { - Ar.Logf(TEXT("%s $%X: Add MC delegate"), *Indents, (int32)Opcode); - SerializeExpr(ScriptIndex); - SerializeExpr(ScriptIndex); - break; - } - case EX_RemoveMulticastDelegate: - { - Ar.Logf(TEXT("%s $%X: Remove MC delegate"), *Indents, (int32)Opcode); - SerializeExpr(ScriptIndex); - SerializeExpr(ScriptIndex); - break; - } - case EX_ClearMulticastDelegate: - { - Ar.Logf(TEXT("%s $%X: Clear MC delegate"), *Indents, (int32)Opcode); - SerializeExpr(ScriptIndex); - break; - } - case EX_BindDelegate: - { - // the name of the function assigned to the delegate. - FString FuncName = ReadName(ScriptIndex); - - Ar.Logf(TEXT("%s $%X: BindDelegate '%s' "), *Indents, (int32)Opcode, *FuncName); - - Ar.Logf(TEXT("%s Delegate:"), *Indents); - SerializeExpr(ScriptIndex); - - Ar.Logf(TEXT("%s Object:"), *Indents); - SerializeExpr(ScriptIndex); - - break; - } - case EX_PushExecutionFlow: - { - CodeSkipSizeType SkipCount = ReadSkipCount(ScriptIndex); - Ar.Logf(TEXT("%s $%X: FlowStack.Push(0x%X);"), *Indents, (int32)Opcode, SkipCount); - break; - } - case EX_PopExecutionFlow: - { - Ar.Logf(TEXT("%s $%X: if (FlowStack.Num()) { jump to statement at FlowStack.Pop(); } else { ERROR!!! }"), *Indents, (int32)Opcode); - break; - } - case EX_PopExecutionFlowIfNot: - { - Ar.Logf(TEXT("%s $%X: if (!condition) { if (FlowStack.Num()) { jump to statement at FlowStack.Pop(); } else { ERROR!!! } }"), *Indents, (int32)Opcode); - // Boolean expr. - SerializeExpr(ScriptIndex); - break; - } - case EX_Breakpoint: - { - Ar.Logf(TEXT("%s $%X: <<< BREAKPOINT >>>"), *Indents, (int32)Opcode); - break; - } - case EX_WireTracepoint: - { - Ar.Logf(TEXT("%s $%X: .. wire debug site .."), *Indents, (int32)Opcode); - break; - } - case EX_InstrumentationEvent: - { - const uint8 EventType = ReadBYTE(ScriptIndex); - switch (EventType) - { - case EScriptInstrumentation::InlineEvent: - Ar.Logf(TEXT("%s $%X: .. instrumented inline event .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::Stop: - Ar.Logf(TEXT("%s $%X: .. instrumented event stop .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::PureNodeEntry: - Ar.Logf(TEXT("%s $%X: .. instrumented pure node entry site .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::NodeDebugSite: - Ar.Logf(TEXT("%s $%X: .. instrumented debug site .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::NodeEntry: - Ar.Logf(TEXT("%s $%X: .. instrumented wire entry site .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::NodeExit: - Ar.Logf(TEXT("%s $%X: .. instrumented wire exit site .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::PushState: - Ar.Logf(TEXT("%s $%X: .. push execution state .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::RestoreState: - Ar.Logf(TEXT("%s $%X: .. restore execution state .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::ResetState: - Ar.Logf(TEXT("%s $%X: .. reset execution state .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::SuspendState: - Ar.Logf(TEXT("%s $%X: .. suspend execution state .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::PopState: - Ar.Logf(TEXT("%s $%X: .. pop execution state .."), *Indents, (int32)Opcode); - break; - case EScriptInstrumentation::TunnelEndOfThread: - Ar.Logf(TEXT("%s $%X: .. tunnel end of thread .."), *Indents, (int32)Opcode); - break; - } - break; - } - case EX_Tracepoint: - { - Ar.Logf(TEXT("%s $%X: .. debug site .."), *Indents, (int32)Opcode); - break; - } - case EX_SwitchValue: - { - const auto NumCases = ReadWORD(ScriptIndex); - const auto AfterSkip = ReadSkipCount(ScriptIndex); - - Ar.Logf(TEXT("%s $%X: Switch Value %d cases, end in 0x%X"), *Indents, (int32)Opcode, NumCases, AfterSkip); - AddIndent(); - Ar.Logf(TEXT("%s Index:"), *Indents); - SerializeExpr(ScriptIndex); - - for (uint16 CaseIndex = 0; CaseIndex < NumCases; ++CaseIndex) - { - Ar.Logf(TEXT("%s [%d] Case Index (label: 0x%X):"), *Indents, CaseIndex, ScriptIndex); - SerializeExpr(ScriptIndex); // case index value term - const auto OffsetToNextCase = ReadSkipCount(ScriptIndex); - Ar.Logf(TEXT("%s [%d] Offset to the next case: 0x%X"), *Indents, CaseIndex, OffsetToNextCase); - Ar.Logf(TEXT("%s [%d] Case Result:"), *Indents, CaseIndex); - SerializeExpr(ScriptIndex); // case term - } - - Ar.Logf(TEXT("%s Default result (label: 0x%X):"), *Indents, ScriptIndex); - SerializeExpr(ScriptIndex); - Ar.Logf(TEXT("%s (label: 0x%X)"), *Indents, ScriptIndex); - DropIndent(); - break; - } - case EX_ArrayGetByRef: - { - Ar.Logf(TEXT("%s $%X: Array Get-by-Ref Index"), *Indents, (int32)Opcode); - AddIndent(); - SerializeExpr(ScriptIndex); - SerializeExpr(ScriptIndex); - DropIndent(); - break; - } - default: - { - // This should never occur. - // UE_LOG(LogScriptDisassembler, Warning, TEXT("Unknown bytecode 0x%02X; ignoring it"), (uint8)Opcode); - break; - } - } - */ -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ScriptDisassembler.h b/dependencies/reboot/Project Reboot 3.0/ScriptDisassembler.h deleted file mode 100644 index 28ffe60..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ScriptDisassembler.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include "Array.h" - -#include - -#include "reboot.h" - -class FKismetBytecodeDisassembler -{ -private: - std::vector Script; - std::string Indents; - std::ofstream Stream; -public: - void DisassembleStructure(UFunction* Source); - - int32 ReadINT(int32& ScriptIndex); - uint64 ReadQWORD(int32& ScriptIndex); - uint8 ReadBYTE(int32& ScriptIndex); - std::string ReadName(int32& ScriptIndex); - uint16 ReadWORD(int32& ScriptIndex); - float ReadFLOAT(int32& ScriptIndex); - CodeSkipSizeType ReadSkipCount(int32& ScriptIndex); - std::string ReadString(int32& ScriptIndex); - std::string ReadString8(int32& ScriptIndex); - std::string ReadString16(int32& ScriptIndex); - - uint8 SerializeExpr(int32& ScriptIndex); - void ProcessCastByte(int32 CastType, int32& ScriptIndex); - void ProcessCommon(int32& ScriptIndex, uint8 Opcode); - - void AddIndent() - { - Indents += (" "); - } - - void DropIndent() - { - // Blah, this is awful - // Indents.LeftInline(Indents.Len() - 2); - Indents = Indents.substr(2); - } - - template - T* ReadPointer(int32& ScriptIndex) - { - return (T*)ReadQWORD(ScriptIndex); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ScriptInterface.h b/dependencies/reboot/Project Reboot 3.0/ScriptInterface.h deleted file mode 100644 index 7984d9b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ScriptInterface.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "Object.h" - -class FScriptInterface -{ -public: - UObject* ObjectPointer = nullptr; - void* InterfacePointer = nullptr; - - FORCEINLINE UObject*& GetObjectRef() - { - return ObjectPointer; - } -}; - -template -class TScriptInterface : public FScriptInterface -{ -public: -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Set.h b/dependencies/reboot/Project Reboot 3.0/Set.h deleted file mode 100644 index f400dd8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Set.h +++ /dev/null @@ -1,220 +0,0 @@ -#pragma once - -#include "SparseArray.h" - -template -class TSetElement -{ -public: - ElementType Value; - mutable int32 HashNextId; - mutable int32 HashIndex; - - TSetElement(ElementType InValue, int32 InHashNextId, int32 InHashIndex) - : Value(InValue) - , HashNextId(InHashNextId) - , HashIndex(InHashIndex) - { - } - - FORCEINLINE TSetElement& operator=(const TSetElement& Other) - { - Value = Other.Value; - } - - FORCEINLINE bool operator==(const TSetElement& Other) const - { - return Value == Other.Value; - } - FORCEINLINE bool operator!=(const TSetElement& Other) const - { - return Value != Other.Value; - } -}; - -template -class TSet -{ -private: - friend TSparseArray; - -public: - typedef TSetElement ElementType; - typedef TSparseArrayElementOrListLink ArrayElementType; - -public: - TSparseArray Elements; - - mutable TInlineAllocator<1>::ForElementType Hash; - mutable int32 HashSize; - -public: - class FBaseIterator - { - private: - TSet& IteratedSet; - TSparseArray::FBaseIterator ElementIt; - - public: - FORCEINLINE FBaseIterator(const TSet& InSet, TSparseArray>::FBaseIterator InElementIt) - : IteratedSet(const_cast&>(InSet)) - , ElementIt(InElementIt) - { - } - - FORCEINLINE explicit operator bool() const - { - return (bool)ElementIt; - } - FORCEINLINE TSet::FBaseIterator& operator++() - { - ++ElementIt; - return *this; - } - FORCEINLINE bool operator==(const TSet::FBaseIterator& OtherIt) const - { - return ElementIt == OtherIt.ElementIt; - } - FORCEINLINE bool operator!=(const TSet::FBaseIterator& OtherIt) const - { - return ElementIt != OtherIt.ElementIt; - } - FORCEINLINE TSet::FBaseIterator& operator=(TSet::FBaseIterator& OtherIt) - { - return ElementIt = OtherIt.ElementIt; - } - FORCEINLINE SetType& operator*() - { - return (*ElementIt).Value; - } - FORCEINLINE const SetType& operator*() const - { - return &((*ElementIt).Value); - } - FORCEINLINE SetType* operator->() - { - return &((*ElementIt).Value); - } - FORCEINLINE const SetType* operator->() const - { - return &(*ElementIt).Value; - } - FORCEINLINE const int32 GetIndex() const - { - return ElementIt.GetIndex(); - } - FORCEINLINE ElementType& GetSetElement() - { - return *ElementIt; - } - FORCEINLINE const ElementType& GetSetElement() const - { - return *ElementIt; - } - FORCEINLINE bool IsElementValid() const - { - return ElementIt.IsElementValid(); - } - }; - -public: - FORCEINLINE TSet::FBaseIterator begin() - { - return TSet::FBaseIterator(*this, Elements.begin()); - } - FORCEINLINE const TSet::FBaseIterator begin() const - { - return TSet::FBaseIterator(*this, Elements.begin()); - } - FORCEINLINE TSet::FBaseIterator end() - { - return TSet::FBaseIterator(*this, Elements.end()); - } - FORCEINLINE const TSet::FBaseIterator end() const - { - return TSet::FBaseIterator(*this, Elements.end()); - } - - FORCEINLINE SetType& operator[](int Index) - { - return Elements[Index].ElementData.Value; - } - - FORCEINLINE int32 Num() const - { - return Elements.Num(); - } - FORCEINLINE bool IsValid() const - { - return Elements.Data.Data != nullptr && Elements.AllocationFlags.MaxBits > 0; - } - FORCEINLINE TSparseArray& GetElements() - { - return Elements; - } - FORCEINLINE const TSparseArray& GetElements() const - { - return Elements; - } - FORCEINLINE const TBitArray& GetAllocationFlags() const - { - return Elements.GetAllocationFlags(); - } - FORCEINLINE bool IsIndexValid(int32 IndexToCheck) const - { - return Elements.IsIndexValid(IndexToCheck); - } - FORCEINLINE const bool Contains(const SetType& ElementToLookFor) const - { - if (Num() <= 0) - return false; - - for (SetType Element : *this) - { - if (Element == ElementToLookFor) - return true; - } - return false; - } - FORCEINLINE const int32 Find(const SetType& ElementToLookFor) const - { - for (auto It = this->begin(); It != this->end(); ++It) - { - if (*It == ElementToLookFor) - { - return It.GetIndex(); - } - } - - return -1; - } - FORCEINLINE bool Remove(const SetType& ElementToRemove) - { - auto Idx = Find(ElementToRemove); - - if (Idx == -1) - return false; - - Elements.RemoveAt(Idx); - return true; - } - FORCEINLINE bool Remove(int Index) - { - Elements.RemoveAt(Index); - return true; - } -}; - - -/* template //, typename KeyFuncs, typename Allocator> -class TSet -{ -public: - typedef TSetElement ElementType; - typedef TSparseArrayElementOrListLink ArrayElementType; - - TSparseArray Elements; - - mutable TInlineAllocator<1>::ForElementType Hash; - mutable int32 HashSize; -}; */ \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/SharedPointer.h b/dependencies/reboot/Project Reboot 3.0/SharedPointer.h deleted file mode 100644 index 3e09418..0000000 --- a/dependencies/reboot/Project Reboot 3.0/SharedPointer.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include "SharedPointerInternals.h" - -template< class ObjectType> -class TSharedPtr -{ -public: - ObjectType* Object; - - int32 SharedReferenceCount; - int32 WeakReferenceCount; - - FORCEINLINE ObjectType* Get() - { - return Object; - } - FORCEINLINE ObjectType* Get() const - { - return Object; - } - FORCEINLINE ObjectType& operator*() - { - return *Object; - } - FORCEINLINE const ObjectType& operator*() const - { - return *Object; - } - FORCEINLINE ObjectType* operator->() - { - return Object; - } - FORCEINLINE ObjectType* operator->() const - { - return Object; - } -}; - -template< class ObjectType, ESPMode Mode > -class TSharedRef -{ -public: - ObjectType* Object; - FSharedReferencer SharedReferenceCount; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/SharedPointerInternals.h b/dependencies/reboot/Project Reboot 3.0/SharedPointerInternals.h deleted file mode 100644 index 8fc59dc..0000000 --- a/dependencies/reboot/Project Reboot 3.0/SharedPointerInternals.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#ifndef PLATFORM_CPU_ARM_FAMILY -#if (defined(__arm__) || defined(_M_ARM) || defined(__aarch64__) || defined(_M_ARM64)) -#define PLATFORM_CPU_ARM_FAMILY 1 -#else -#define PLATFORM_CPU_ARM_FAMILY 0 -#endif -#endif -#define PLATFORM_WEAKLY_CONSISTENT_MEMORY PLATFORM_CPU_ARM_FAMILY -#define FORCE_THREADSAFE_SHAREDPTRS PLATFORM_WEAKLY_CONSISTENT_MEMORY - -enum class ESPMode -{ - /** Forced to be not thread-safe. */ - NotThreadSafe = 0, - - /** - * Fast, doesn't ever use atomic interlocks. - * Some code requires that all shared pointers are thread-safe. - * It's better to change it here, instead of replacing ESPMode::Fast to ESPMode::ThreadSafe throughout the code. - */ - Fast = FORCE_THREADSAFE_SHAREDPTRS ? 1 : 0, - - /** Conditionally thread-safe, never spin locks, but slower */ - ThreadSafe = 1 -}; - -class FReferenceControllerBase -{ -public: - FORCEINLINE explicit FReferenceControllerBase() - : SharedReferenceCount(1) - , WeakReferenceCount(1) - { - } - - int32 SharedReferenceCount; - int32 WeakReferenceCount; -}; - -template< ESPMode Mode > -class FSharedReferencer -{ -public: - FReferenceControllerBase* ReferenceController; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/SoftObjectPath.h b/dependencies/reboot/Project Reboot 3.0/SoftObjectPath.h deleted file mode 100644 index 276317e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/SoftObjectPath.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "NameTypes.h" -#include "UnrealString.h" - -struct FSoftObjectPath -{ -public: - /** Asset path, patch to a top level object in a package. This is /package/path.assetname */ - FName AssetPathName; - - /** Optional FString for subobject within an asset. This is the sub path after the : */ - FString SubPathString; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/SoftObjectPtr.h b/dependencies/reboot/Project Reboot 3.0/SoftObjectPtr.h deleted file mode 100644 index 43ad475..0000000 --- a/dependencies/reboot/Project Reboot 3.0/SoftObjectPtr.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include "Object.h" - -#include "PersistentObjectPtr.h" -#include "SoftObjectPath.h" -#include "AssetPtr.h" - -#include "reboot.h" - -struct FSoftObjectPtr : public TPersistentObjectPtr -{ -public: -}; - -template -struct TSoftObjectPtr -{ -public: - FSoftObjectPtr SoftObjectPtr; - - bool IsValid() - { - if (Engine_Version <= 416) - { - auto& AssetPtr = *(TAssetPtr*)this; - return true; - } - else - { - return SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value; - } - } - - T* Get(UClass* ClassToLoad = nullptr, bool bTryToLoad = false) - { - if (Engine_Version <= 416) - { - auto& AssetPtr = *(TAssetPtr*)this; - return AssetPtr.Get(); - } - else - { - if (SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value <= 0) - return nullptr; - - if (bTryToLoad) - { - return LoadObject(SoftObjectPtr.ObjectID.AssetPathName.ToString(), ClassToLoad); - } - - return FindObject(SoftObjectPtr.ObjectID.AssetPathName.ToString()); - } - } -}; - -static inline int GetSoftObjectSize() -{ - return Engine_Version == 416 ? sizeof(TAssetPtr) : sizeof(TSoftObjectPtr); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Sort.h b/dependencies/reboot/Project Reboot 3.0/Sort.h deleted file mode 100644 index c35e2ff..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Sort.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "IntroSort.h" - -#include "UnrealTemplate.h" - -namespace Algo -{ - template - FORCEINLINE void Sort(RangeType& Range, PredicateType Pred) - { - IntroSort(Range, MoveTemp(Pred)); - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Sorting.h b/dependencies/reboot/Project Reboot 3.0/Sorting.h deleted file mode 100644 index 20c418d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Sorting.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include "Sort.h" - -template -struct TDereferenceWrapper -{ - const PREDICATE_CLASS& Predicate; - - TDereferenceWrapper(const PREDICATE_CLASS& InPredicate) - : Predicate(InPredicate) {} - - /** Pass through for non-pointer types */ - FORCEINLINE bool operator()(T& A, T& B) { return Predicate(A, B); } - FORCEINLINE bool operator()(const T& A, const T& B) const { return Predicate(A, B); } -}; -/** Partially specialized version of the above class */ -template -struct TDereferenceWrapper -{ - const PREDICATE_CLASS& Predicate; - - TDereferenceWrapper(const PREDICATE_CLASS& InPredicate) - : Predicate(InPredicate) {} - - /** Dereference pointers */ - FORCEINLINE bool operator()(T* A, T* B) const - { - return Predicate(*A, *B); - } -}; - -template -struct TArrayRange -{ - TArrayRange(T* InPtr, int32 InSize) - : Begin(InPtr) - , Size(InSize) - { - } - - T* GetData() const { return Begin; } - int32 Num() const { return Size; } - -private: - T* Begin; - int32 Size; -}; - -template -void Sort(T** First, const int32 Num, const PREDICATE_CLASS& Predicate) -{ - TArrayRange ArrayRange(First, Num); - Algo::Sort(ArrayRange, TDereferenceWrapper(Predicate)); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/SparseArray.h b/dependencies/reboot/Project Reboot 3.0/SparseArray.h deleted file mode 100644 index 4698b75..0000000 --- a/dependencies/reboot/Project Reboot 3.0/SparseArray.h +++ /dev/null @@ -1,260 +0,0 @@ -#pragma once - -#include "Array.h" -#include "BitArray.h" -#include "log.h" - -#define INDEX_NONE -1 - -template -union TSparseArrayElementOrListLink -{ - TSparseArrayElementOrListLink(ElementType& InElement) - : ElementData(InElement) - { - } - TSparseArrayElementOrListLink(ElementType&& InElement) - : ElementData(InElement) - { - } - - TSparseArrayElementOrListLink(int32 InPrevFree, int32 InNextFree) - : PrevFreeIndex(InPrevFree) - , NextFreeIndex(InNextFree) - { - } - - TSparseArrayElementOrListLink operator=(const TSparseArrayElementOrListLink& Other) - { - return TSparseArrayElementOrListLink(Other.NextFreeIndex, Other.PrevFreeIndex); - } - - /** If the element is allocated, its value is stored here. */ - ElementType ElementData; - - struct - { - /** If the element isn't allocated, this is a link to the previous element in the array's free list. */ - int PrevFreeIndex; - - /** If the element isn't allocated, this is a link to the next element in the array's free list. */ - int NextFreeIndex; - }; -}; - -template -class TSparseArray -{ -public: - typedef TSparseArrayElementOrListLink FSparseArrayElement; - - TArray Data; - TBitArray AllocationFlags; - int32 FirstFreeIndex; - int32 NumFreeIndices; - - FORCEINLINE int32 Num() const - { - return Data.Num() - NumFreeIndices; - } - - class FBaseIterator - { - private: - TSparseArray& IteratedArray; - TBitArray::FSetBitIterator BitArrayIt; - - public: - FORCEINLINE FBaseIterator(const TSparseArray& Array, const TBitArray::FSetBitIterator BitIterator) - : IteratedArray(const_cast&>(Array)) - , BitArrayIt(const_cast(BitIterator)) - { - } - - FORCEINLINE explicit operator bool() const - { - return (bool)BitArrayIt; - } - FORCEINLINE TSparseArray::FBaseIterator& operator++() - { - ++BitArrayIt; - return *this; - } - FORCEINLINE ArrayType& operator*() - { - return IteratedArray[BitArrayIt.GetIndex()].ElementData; - } - FORCEINLINE const ArrayType& operator*() const - { - return IteratedArray[BitArrayIt.GetIndex()].ElementData; - } - FORCEINLINE ArrayType* operator->() - { - return &IteratedArray[BitArrayIt.GetIndex()].ElementData; - } - FORCEINLINE const ArrayType* operator->() const - { - return &IteratedArray[BitArrayIt.GetIndex()].ElementData; - } - FORCEINLINE bool operator==(const TSparseArray::FBaseIterator& Other) const - { - return BitArrayIt == Other.BitArrayIt; - } - FORCEINLINE bool operator!=(const TSparseArray::FBaseIterator& Other) const - { - return BitArrayIt != Other.BitArrayIt; - } - - FORCEINLINE int32 GetIndex() const - { - return BitArrayIt.GetIndex(); - } - FORCEINLINE bool IsElementValid() const - { - return *BitArrayIt; - } - }; - -public: - FORCEINLINE TSparseArray::FBaseIterator begin() - { - return TSparseArray::FBaseIterator(*this, TBitArray::FSetBitIterator(AllocationFlags, 0)); - } - FORCEINLINE const TSparseArray::FBaseIterator begin() const - { - return TSparseArray::FBaseIterator(*this, TBitArray::FSetBitIterator(AllocationFlags, 0)); - } - FORCEINLINE TSparseArray::FBaseIterator end() - { - return TSparseArray::FBaseIterator(*this, TBitArray::FSetBitIterator(AllocationFlags)); - } - FORCEINLINE const TSparseArray::FBaseIterator end() const - { - return TSparseArray::FBaseIterator(*this, TBitArray::FSetBitIterator(AllocationFlags)); - } - - FORCEINLINE FSparseArrayElement& operator[](uint32 Index) - { - return *(FSparseArrayElement*)&Data.at(Index).ElementData; - } - FORCEINLINE const FSparseArrayElement& operator[](uint32 Index) const - { - return *(const FSparseArrayElement*)&Data.at(Index).ElementData; - } - FORCEINLINE int32 GetNumFreeIndices() const - { - return NumFreeIndices; - } - FORCEINLINE int32 GetFirstFreeIndex() const - { - return FirstFreeIndex; - } - FORCEINLINE const TArray& GetData() const - { - return Data; - } - FSparseArrayElement& GetData(int32 Index) - { - return *(FSparseArrayElement*)&Data.at(Index).ElementData; - // return ((FSparseArrayElement*)Data.Data)[Index]; - } - - /** Accessor for the element or free list data. */ - const FSparseArrayElement& GetData(int32 Index) const - { - return *(const FSparseArrayElement*)&Data.at(Index).ElementData; - // return ((FSparseArrayElement*)Data.Data)[Index]; - } - FORCEINLINE const TBitArray& GetAllocationFlags() const - { - return AllocationFlags; - } - FORCEINLINE bool IsIndexValid(int32 IndexToCheck) const - { - return AllocationFlags.IsSet(IndexToCheck); - } - - void RemoveAt(int32 Index, int32 Count = 1) - { - /* if (!TIsTriviallyDestructible::Value) - { - for (int32 It = Index, ItCount = Count; ItCount; ++It, --ItCount) - { - ((ElementType&)GetData(It).ElementData).~ElementType(); - } - } */ - - RemoveAtUninitialized(Index, Count); - } - - /** Removes Count elements from the array, starting from Index, without destructing them. */ - void RemoveAtUninitialized(int32 Index, int32 Count = 1) - { - for (; Count; --Count) - { - // check(AllocationFlags[Index]); - - // Mark the element as free and add it to the free element list. - if (NumFreeIndices) - { - GetData(FirstFreeIndex).PrevFreeIndex = Index; - } - auto& IndexData = GetData(Index); - IndexData.PrevFreeIndex = -1; - IndexData.NextFreeIndex = NumFreeIndices > 0 ? FirstFreeIndex : INDEX_NONE; - FirstFreeIndex = Index; - ++NumFreeIndices; - AllocationFlags.Set(Index, false); - // AllocationFlags[Index] = false; - - ++Index; - } - } - - /* - FORCEINLINE bool RemoveAt(const int32 IndexToRemove) - { - LOG_INFO(LogDev, "IndexToRemove: {}", IndexToRemove); - LOG_INFO(LogDev, "AllocationFlags.IsSet(IndexToRemove): {}", AllocationFlags.IsSet(IndexToRemove)); - LOG_INFO(LogDev, "Data.Num(): {}", Data.Num()); - - if (IndexToRemove >= 0 && IndexToRemove < Data.Num() && AllocationFlags.IsSet(IndexToRemove)) - { - int32 PreviousFreeIndex = -1; - int32 NextFreeIndex = -1; - - LOG_INFO(LogDev, "NumFreeIndices: {}", NumFreeIndices); - - if (NumFreeIndices == 0) - { - FirstFreeIndex = IndexToRemove; - Data.at(IndexToRemove) = { -1, -1 }; - } - else - { - for (auto It = AllocationFlags.begin(); It != AllocationFlags.end(); ++It) - { - if (!It) - { - if (It.GetIndex() < IndexToRemove) - { - Data.at(IndexToRemove).PrevFreeIndex = It.GetIndex(); - } - else if (It.GetIndex() > IndexToRemove) - { - Data.at(IndexToRemove).NextFreeIndex = It.GetIndex(); - break; - } - } - } - } - - AllocationFlags.Set(IndexToRemove, false); - NumFreeIndices++; - - return true; - } - return false; - } - */ -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Stack.h b/dependencies/reboot/Project Reboot 3.0/Stack.h deleted file mode 100644 index 57b919c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Stack.h +++ /dev/null @@ -1,98 +0,0 @@ -#pragma once - -#include "OutputDevice.h" -#include "Class.h" - -#define RESULT_DECL void*const RESULT_PARAM - -struct FFrame : public FOutputDevice // https://github.com/EpicGames/UnrealEngine/blob/7acbae1c8d1736bb5a0da4f6ed21ccb237bc8851/Engine/Source/Runtime/CoreUObject/Public/UObject/Stack.h#L83 -{ -public: - void** VFT; // 10 - - // Variables. - UFunction* Node; // 16 - UObject* Object; // 24 // 0x18 - uint8* Code; // 32 // 0x20 - uint8* Locals; // 40 - - // MORE STUFF HERE - - void* MostRecentProperty; // 48 - uint8_t* MostRecentPropertyAddress; // 56 - - void*& GetPropertyChainForCompiledIn() - { - static auto PropertyChainForCompiledInOffset = 0x80; - return *(void**)(__int64(this) + PropertyChainForCompiledInOffset); - } - - uint8_t*& GetMostRecentPropertyAddress() - { - auto off = (void*)(&((struct FFrame*)NULL)->MostRecentPropertyAddress); - LOG_INFO(LogDev, "{}", off); - return MostRecentPropertyAddress; - } - - __forceinline void StepExplicitProperty(void* const Result, void* Property) - { - static void (*StepExplicitPropertyOriginal)(__int64 frame, void* const Result, void* Property) = decltype(StepExplicitPropertyOriginal)(Addresses::FrameStepExplicitProperty); - StepExplicitPropertyOriginal(__int64(this), Result, Property); - } - - __forceinline void Step(UObject* Context, RESULT_DECL) - { - static void (*StepOriginal)(__int64 frame, UObject* Context, RESULT_DECL) = decltype(StepOriginal)(Addresses::FrameStep); - StepOriginal(__int64(this), Context, RESULT_PARAM); - - // int32 B = *Code++; - // (GNatives[B])(Context, *this, RESULT_PARAM); - } - - __forceinline void StepCompiledIn(void* const Result/*, const FFieldClass* ExpectedPropertyType*/, bool bPrint = false) // https://github.com/EpicGames/UnrealEngine/blob/cdaec5b33ea5d332e51eee4e4866495c90442122/Engine/Source/Runtime/CoreUObject/Public/UObject/Stack.h#L444 - { - if (Code) - { - Step(Object, Result); - } - else - { - // LOG_INFO(LogDev, "UNIMPLENTED!"); - /* checkSlow(ExpectedPropertyType && ExpectedPropertyType->IsChildOf(FProperty::StaticClass())); - checkSlow(PropertyChainForCompiledIn && PropertyChainForCompiledIn->IsA(ExpectedPropertyType)); - FProperty* Property = (FProperty*)PropertyChainForCompiledIn; - PropertyChainForCompiledIn = Property->Next; - StepExplicitProperty(Result, Property); */ - - if (bPrint) - LOG_INFO(LogDev, "No code!"); - - void* Property = GetPropertyChainForCompiledIn(); - GetPropertyChainForCompiledIn() = GetNext(Property); - StepExplicitProperty(Result, Property); - } - } - - template - __forceinline TNativeType& StepCompiledInRef(void* const TemporaryBuffer) - { - GetMostRecentPropertyAddress() = nullptr; - // GetMostRecentPropertyContainer() = nullptr; // added in ue5.1 - - if (Code) - { - Step(Object, TemporaryBuffer); - } - else - { - LOG_INFO(LogDev, "UNIMPLENTED2!"); - - /* checkSlow(CastField(PropertyChainForCompiledIn) && CastField(PropertyChainForCompiledIn)); - TProperty* Property = (TProperty*)PropertyChainForCompiledIn; - PropertyChainForCompiledIn = Property->Next; - StepExplicitProperty(TemporaryBuffer, Property); */ - } - - return (GetMostRecentPropertyAddress() != NULL) ? *(TNativeType*)(GetMostRecentPropertyAddress()) : *(TNativeType*)TemporaryBuffer; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/StringAssetReference.h b/dependencies/reboot/Project Reboot 3.0/StringAssetReference.h deleted file mode 100644 index 44d2ee6..0000000 --- a/dependencies/reboot/Project Reboot 3.0/StringAssetReference.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "UnrealString.h" - -struct FStringAssetReference -{ - FString AssetLongPathname; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Text.h b/dependencies/reboot/Project Reboot 3.0/Text.h deleted file mode 100644 index f30a18d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Text.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "SharedPointer.h" -#include "inc.h" - -struct ITextData -{ - -}; - -class FText -{ -public: - TSharedRef TextData; - uint32 Flags; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/TimerManager.h b/dependencies/reboot/Project Reboot 3.0/TimerManager.h deleted file mode 100644 index aabe2b8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/TimerManager.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "EngineTypes.h" -#include "Function.h" -#include "DelegateCombinations.h" - -DECLARE_DELEGATE(FTimerDelegate); - -struct FTimerUnifiedDelegate -{ - /** Holds the delegate to call. */ - FTimerDelegate FuncDelegate; - /** Holds the dynamic delegate to call. */ - FTimerDynamicDelegate FuncDynDelegate; - /** Holds the TFunction callback to call. */ - TFunction FuncCallback; - - FTimerUnifiedDelegate() {}; - FTimerUnifiedDelegate(FTimerDelegate const& D) : FuncDelegate(D) {}; -}; - -class FTimerManager // : public FNoncopyable -{ -public: - FORCEINLINE void SetTimer(FTimerHandle& InOutHandle, FTimerDelegate const& InDelegate, float InRate, bool InbLoop, float InFirstDelay = -1.f) - { - static void (*InternalSetTimerOriginal)(__int64 TimerManager, FTimerHandle& InOutHandle, FTimerUnifiedDelegate&& InDelegate, float InRate, bool InbLoop, float InFirstDelay) = - decltype(InternalSetTimerOriginal)(Addresses::SetTimer); - - InternalSetTimerOriginal(__int64(this), InOutHandle, FTimerUnifiedDelegate(InDelegate), InRate, InbLoop, InFirstDelay); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Transform.h b/dependencies/reboot/Project Reboot 3.0/Transform.h deleted file mode 100644 index 012d8c9..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Transform.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "Vector.h" -#include "Quat.h" - -MS_ALIGN(16) struct FTransform -{ - FQuat Rotation = FQuat(0, 0, 0, 0); // 0x0000(0x0010) (Edit, BlueprintVisible, SaveGame, IsPlainOldData, NoDestructor, NativeAccessSpecifierPublic) - FVector Translation = FVector(0, 0, 0); // 0x0010(0x000C) (Edit, BlueprintVisible, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - unsigned char UnknownData00[0x4]; // 0x001C(0x0004) MISSED OFFSET - FVector Scale3D = FVector(0, 0, 0); // 0x0020(0x000C) (Edit, BlueprintVisible, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - unsigned char UnknownData01[0x4]; // 0x002C(0x0004) MISSED OFFSET -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Tuple.h b/dependencies/reboot/Project Reboot 3.0/Tuple.h deleted file mode 100644 index 3f59c93..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Tuple.h +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once - diff --git a/dependencies/reboot/Project Reboot 3.0/TypeCompatibleBytes.h b/dependencies/reboot/Project Reboot 3.0/TypeCompatibleBytes.h deleted file mode 100644 index 7fc20fc..0000000 --- a/dependencies/reboot/Project Reboot 3.0/TypeCompatibleBytes.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include "inc.h" - -template -struct TAlignedBytes; // this intentionally won't compile, we don't support the requested alignment - -/** Unaligned storage. */ -template -struct TAlignedBytes -{ - uint8 Pad[Size]; -}; - -#ifndef GCC_PACK -#define GCC_PACK(n) -#endif -#ifndef GCC_ALIGN -#define GCC_ALIGN(n) -#endif -#ifndef MS_ALIGN -#define MS_ALIGN(n) -#endif - -// C++/CLI doesn't support alignment of native types in managed code, so we enforce that the element -// size is a multiple of the desired alignment -#ifdef __cplusplus_cli -#define IMPLEMENT_ALIGNED_STORAGE(Align) \ - template \ - struct TAlignedBytes \ - { \ - uint8 Pad[Size]; \ - static_assert(Size % Align == 0, "CLR interop types must not be aligned."); \ - }; -#else -/** A macro that implements TAlignedBytes for a specific alignment. */ -#define IMPLEMENT_ALIGNED_STORAGE(Align) \ - template \ - struct TAlignedBytes \ - { \ - struct MS_ALIGN(Align) TPadding \ - { \ - uint8 Pad[Size]; \ - } GCC_ALIGN(Align); \ - TPadding Padding; \ - }; -#endif - -// Implement TAlignedBytes for these alignments. -IMPLEMENT_ALIGNED_STORAGE(16); -IMPLEMENT_ALIGNED_STORAGE(8); -IMPLEMENT_ALIGNED_STORAGE(4); -IMPLEMENT_ALIGNED_STORAGE(2); - -#undef IMPLEMENT_ALIGNED_STORAGE - -template -struct TTypeCompatibleBytes : - public TAlignedBytes< - sizeof(ElementType), - alignof(ElementType) - > -{}; diff --git a/dependencies/reboot/Project Reboot 3.0/TypeWrapper.h b/dependencies/reboot/Project Reboot 3.0/TypeWrapper.h deleted file mode 100644 index d9029f3..0000000 --- a/dependencies/reboot/Project Reboot 3.0/TypeWrapper.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -template -struct TTypeWrapper; - -template -struct TUnwrapType -{ - typedef T Type; -}; - -template -struct TUnwrapType> -{ - typedef T Type; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/UObjectArray.h b/dependencies/reboot/Project Reboot 3.0/UObjectArray.h deleted file mode 100644 index 14b1e35..0000000 --- a/dependencies/reboot/Project Reboot 3.0/UObjectArray.h +++ /dev/null @@ -1,174 +0,0 @@ -#pragma once - -#include "inc.h" - -#include "Object.h" -#include "ObjectMacros.h" - -struct FUObjectItem -{ - UObject* Object; - int32 Flags; - int32 ClusterRootIndex; - int32 SerialNumber; - - FORCEINLINE bool IsPendingKill() const - { - return !!(Flags & int32(EInternalObjectFlags::PendingKill)); - } - - FORCEINLINE void SetFlag(EInternalObjectFlags FlagToSet) - { - // static_assert(sizeof(int32) == sizeof(Flags), "Flags must be 32-bit for atomics."); - int32 StartValue = int32(Flags); - - if ((StartValue & int32(FlagToSet)) == int32(FlagToSet)) - { - return; - } - - int32 NewValue = StartValue | int32(FlagToSet); - } - - FORCEINLINE void SetRootSet() - { - SetFlag(EInternalObjectFlags::RootSet); - } -}; - -class FFixedUObjectArray -{ - FUObjectItem* Objects; - int32 MaxElements; - int32 NumElements; -public: - FORCEINLINE int32 Num() const { return NumElements; } - FORCEINLINE int32 Capacity() const { return MaxElements; } - FORCEINLINE bool IsValidIndex(int32 Index) const { return Index < Num() && Index >= 0; } - - FORCEINLINE FUObjectItem* GetItemByIndex(int32 Index) - { - if (!IsValidIndex(Index)) return nullptr; - return &Objects[Index]; - } - - bool IsValid(UObject* Object) - { - int32 Index = Object->InternalIndex; - if (Index == -1) - { - // UE_LOG(LogUObjectArray, Warning, TEXT("Object is not in global object array")); - return false; - } - if (!IsValidIndex(Index)) - { - // UE_LOG(LogUObjectArray, Warning, TEXT("Invalid object index %i"), Index); - return false; - } - - FUObjectItem* Slot = GetItemByIndex(Index); - if (!Slot || Slot->Object == nullptr) - { - // UE_LOG(LogUObjectArray, Warning, TEXT("Empty slot")); - return false; - } - if (Slot->Object != Object) - { - // UE_LOG(LogUObjectArray, Warning, TEXT("Other object in slot")); - return false; - } - return true; - } - - FORCEINLINE UObject* GetObjectByIndex(int32 Index) - { - if (auto Item = GetItemByIndex(Index)) - return Item->Object; - - return nullptr; - } -}; - -extern inline int NumElementsPerChunk = 0x10000; - -class FChunkedFixedUObjectArray -{ - // enum { NumElementsPerChunk = 64 * 1024, }; - - FUObjectItem** Objects; - FUObjectItem* PreAllocatedObjects; - int32 MaxElements; - int32 NumElements; - int32 MaxChunks; - int32 NumChunks; -public: - FORCEINLINE int32 Num() const { return NumElements; } - FORCEINLINE int32 Capacity() const { return MaxElements; } - FORCEINLINE bool IsValidIndex(int32 Index) const { return Index < Num() && Index >= 0; } - - FORCEINLINE FUObjectItem* GetItemByIndex(int32 Index) - { - if (!IsValidIndex(Index)) return nullptr; - - const int32 ChunkIndex = Index / NumElementsPerChunk; - const int32 WithinChunkIndex = Index % NumElementsPerChunk; - - // checkf(ChunkIndex < NumChunks, TEXT("ChunkIndex (%d) < NumChunks (%d)"), ChunkIndex, NumChunks); - // checkf(Index < MaxElements, TEXT("Index (%d) < MaxElements (%d)"), Index, MaxElements); - FUObjectItem* Chunk = Objects[ChunkIndex]; - - if (!Chunk) - return nullptr; - - return Chunk + WithinChunkIndex; - } - - bool IsValid(UObject* Object) - { - int32 Index = Object->InternalIndex; - if (Index == -1) - { - // UE_LOG(LogUObjectArray, Warning, TEXT("Object is not in global object array")); - return false; - } - if (!IsValidIndex(Index)) - { - // UE_LOG(LogUObjectArray, Warning, TEXT("Invalid object index %i"), Index); - return false; - } - - FUObjectItem* Slot = GetItemByIndex(Index); - if (!Slot || Slot->Object == nullptr) - { - // UE_LOG(LogUObjectArray, Warning, TEXT("Empty slot")); - return false; - } - if (Slot->Object != Object) - { - // UE_LOG(LogUObjectArray, Warning, TEXT("Other object in slot")); - return false; - } - return true; - } - - FORCEINLINE UObject* GetObjectByIndex(int32 Index) - { - if (auto Item = GetItemByIndex(Index)) - return Item->Object; - - return nullptr; - } -}; - -extern inline FChunkedFixedUObjectArray* ChunkedObjects = 0; -extern inline FFixedUObjectArray* UnchunkedObjects = 0; - -FORCEINLINE UObject* GetObjectByIndex(int32 Index) -{ - return ChunkedObjects ? ChunkedObjects->GetObjectByIndex(Index) : UnchunkedObjects ? UnchunkedObjects->GetObjectByIndex(Index) : nullptr; -} - -FORCEINLINE FUObjectItem* GetItemByIndex(int32 Index) -{ - return ChunkedObjects ? ChunkedObjects->GetItemByIndex(Index) : UnchunkedObjects ? UnchunkedObjects->GetItemByIndex(Index) : nullptr; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/UObjectGlobals.cpp b/dependencies/reboot/Project Reboot 3.0/UObjectGlobals.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/dependencies/reboot/Project Reboot 3.0/UObjectGlobals.h b/dependencies/reboot/Project Reboot 3.0/UObjectGlobals.h deleted file mode 100644 index 88ad455..0000000 --- a/dependencies/reboot/Project Reboot 3.0/UObjectGlobals.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "Object.h" -#include "Package.h" - -#define ANY_PACKAGE (UObject*)-1 - -extern inline UObject* (*StaticFindObjectOriginal)(UClass* Class, UObject* InOuter, const TCHAR* Name, bool ExactClass) = nullptr; - -template -static inline T* StaticFindObject(UClass* Class, UObject* InOuter, const TCHAR* Name, bool ExactClass = false) -{ - // LOG_INFO(LogDev, "StaticFindObjectOriginal: {}", __int64(StaticFindObjectOriginal)); - return (T*)StaticFindObjectOriginal(Class, InOuter, Name, ExactClass); -} - -static inline UPackage* GetTransientPackage() -{ - static auto TransientPackage = StaticFindObject(nullptr, nullptr, L"/Engine/Transient"); - return TransientPackage; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/UnrealEngine.cpp b/dependencies/reboot/Project Reboot 3.0/UnrealEngine.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/dependencies/reboot/Project Reboot 3.0/UnrealMath.cpp b/dependencies/reboot/Project Reboot 3.0/UnrealMath.cpp deleted file mode 100644 index b34354e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/UnrealMath.cpp +++ /dev/null @@ -1,154 +0,0 @@ -#include "Rotator.h" -#include "Quat.h" -#include "UnrealMathUtility.h" - -#define INV_PI (0.31830988618f) -#define HALF_PI (1.57079632679f) -#define PI (3.1415926535897932f) - -static FORCEINLINE void SinCos(float* ScalarSin, float* ScalarCos, float Value) -{ - // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. - float quotient = (INV_PI * 0.5f) * Value; - if (Value >= 0.0f) - { - quotient = (float)((int)(quotient + 0.5f)); - } - else - { - quotient = (float)((int)(quotient - 0.5f)); - } - float y = Value - (2.0f * PI) * quotient; - - // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). - float sign; - if (y > HALF_PI) - { - y = PI - y; - sign = -1.0f; - } - else if (y < -HALF_PI) - { - y = -PI - y; - sign = -1.0f; - } - else - { - sign = +1.0f; - } - - float y2 = y * y; - - // 11-degree minimax approximation - *ScalarSin = (((((-2.3889859e-08f * y2 + 2.7525562e-06f) * y2 - 0.00019840874f) * y2 + 0.0083333310f) * y2 - 0.16666667f) * y2 + 1.0f) * y; - - // 10-degree minimax approximation - float p = ((((-2.6051615e-07f * y2 + 2.4760495e-05f) * y2 - 0.0013888378f) * y2 + 0.041666638f) * y2 - 0.5f) * y2 + 1.0f; - *ScalarCos = sign * p; -} - -struct FQuat FRotator::Quaternion() const -{ -#if PLATFORM_ENABLE_VECTORINTRINSICS - const VectorRegister Angles = MakeVectorRegister(Rotator.Pitch, Rotator.Yaw, Rotator.Roll, 0.0f); - const VectorRegister HalfAngles = VectorMultiply(Angles, DEG_TO_RAD_HALF); - - VectorRegister SinAngles, CosAngles; - VectorSinCos(&SinAngles, &CosAngles, &HalfAngles); - - // Vectorized conversion, measured 20% faster than using scalar version after VectorSinCos. - // Indices within VectorRegister (for shuffles): P=0, Y=1, R=2 - const VectorRegister SR = VectorReplicate(SinAngles, 2); - const VectorRegister CR = VectorReplicate(CosAngles, 2); - - const VectorRegister SY_SY_CY_CY_Temp = VectorShuffle(SinAngles, CosAngles, 1, 1, 1, 1); - - const VectorRegister SP_SP_CP_CP = VectorShuffle(SinAngles, CosAngles, 0, 0, 0, 0); - const VectorRegister SY_CY_SY_CY = VectorShuffle(SY_SY_CY_CY_Temp, SY_SY_CY_CY_Temp, 0, 2, 0, 2); - - const VectorRegister CP_CP_SP_SP = VectorShuffle(CosAngles, SinAngles, 0, 0, 0, 0); - const VectorRegister CY_SY_CY_SY = VectorShuffle(SY_SY_CY_CY_Temp, SY_SY_CY_CY_Temp, 2, 0, 2, 0); - - const uint32 Neg = uint32(1 << 31); - const uint32 Pos = uint32(0); - const VectorRegister SignBitsLeft = MakeVectorRegister(Pos, Neg, Pos, Pos); - const VectorRegister SignBitsRight = MakeVectorRegister(Neg, Neg, Neg, Pos); - const VectorRegister LeftTerm = VectorBitwiseXor(SignBitsLeft, VectorMultiply(CR, VectorMultiply(SP_SP_CP_CP, SY_CY_SY_CY))); - const VectorRegister RightTerm = VectorBitwiseXor(SignBitsRight, VectorMultiply(SR, VectorMultiply(CP_CP_SP_SP, CY_SY_CY_SY))); - - FQuat RotationQuat; - const VectorRegister Result = VectorAdd(LeftTerm, RightTerm); - VectorStoreAligned(Result, &RotationQuat); -#else - const float DEG_TO_RAD = PI / (180.f); - const float DIVIDE_BY_2 = DEG_TO_RAD / 2.f; - float SP, SY, SR; - float CP, CY, CR; - - SinCos(&SP, &CP, Pitch * DIVIDE_BY_2); - SinCos(&SY, &CY, Yaw * DIVIDE_BY_2); - SinCos(&SR, &CR, Roll * DIVIDE_BY_2); - - FQuat RotationQuat{}; - RotationQuat.X = CR * SP * SY - SR * CP * CY; - RotationQuat.Y = -CR * SP * CY - SR * CP * SY; - RotationQuat.Z = CR * CP * SY - SR * SP * CY; - RotationQuat.W = CR * CP * CY + SR * SP * SY; -#endif // PLATFORM_ENABLE_VECTORINTRINSICS - -#if ENABLE_NAN_DIAGNOSTIC || DO_CHECK - // Very large inputs can cause NaN's. Want to catch this here - ensureMsgf(!RotationQuat.ContainsNaN(), TEXT("Invalid input to FRotator::Quaternion - generated NaN output: %s"), *RotationQuat.ToString()); -#endif - - return RotationQuat; -} - -FVector FRotator::Vector() const -{ - float CP, SP, CY, SY; - SinCos(&SP, &CP, Pitch * (PI / 180.0f)); - SinCos(&SY, &CY, Yaw * (PI / 180.0f)); - FVector V = FVector(CP * CY, CP * SY, SP); - - return V; -} - -FRotator FQuat::Rotator() const -{ - const float SingularityTest = Z * X - W * Y; - const float YawY = 2.f * (W * Z + X * Y); - const float YawX = (1.f - 2.f * (FMath::Square(Y) + FMath::Square(Z))); - - // reference - // http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles - // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/ - - // this value was found from experience, the above websites recommend different values - // but that isn't the case for us, so I went through different testing, and finally found the case - // where both of world lives happily. - const float SINGULARITY_THRESHOLD = 0.4999995f; - const float RAD_TO_DEG = (180.f) / PI; - FRotator RotatorFromQuat; - - if (SingularityTest < -SINGULARITY_THRESHOLD) - { - RotatorFromQuat.Pitch = -90.f; - RotatorFromQuat.Yaw = FMath::Atan2(YawY, YawX) * RAD_TO_DEG; - RotatorFromQuat.Roll = FRotator::NormalizeAxis(-RotatorFromQuat.Yaw - (2.f * FMath::Atan2(X, W) * RAD_TO_DEG)); - } - else if (SingularityTest > SINGULARITY_THRESHOLD) - { - RotatorFromQuat.Pitch = 90.f; - RotatorFromQuat.Yaw = FMath::Atan2(YawY, YawX) * RAD_TO_DEG; - RotatorFromQuat.Roll = FRotator::NormalizeAxis(RotatorFromQuat.Yaw - (2.f * FMath::Atan2(X, W) * RAD_TO_DEG)); - } - else - { - RotatorFromQuat.Pitch = FMath::FastAsin(2.f * (SingularityTest)) * RAD_TO_DEG; - RotatorFromQuat.Yaw = FMath::Atan2(YawY, YawX) * RAD_TO_DEG; - RotatorFromQuat.Roll = FMath::Atan2(-2.f * (W * X + Y * Z), (1.f - 2.f * (FMath::Square(X) + FMath::Square(Y)))) * RAD_TO_DEG; - } - - return RotatorFromQuat; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/UnrealMathUtility.h b/dependencies/reboot/Project Reboot 3.0/UnrealMathUtility.h deleted file mode 100644 index 41660ab..0000000 --- a/dependencies/reboot/Project Reboot 3.0/UnrealMathUtility.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include "GenericPlatformMath.h" - -struct FMath : public FGenericPlatformMath -{ - template< class T > - static FORCEINLINE T Clamp(const T X, const T Min, const T Max) - { - return X < Min ? Min : X < Max ? X : Max; - } - - template< class T > - static FORCEINLINE T Square(const T A) - { - return A * A; - } - -#define FASTASIN_HALF_PI (1.5707963050f) - /** - * Computes the ASin of a scalar value. - * - * @param Value input angle - * @return ASin of Value - */ - static FORCEINLINE float FastAsin(float Value) - { - // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = FMath::Abs(Value); - float omx = 1.0f - x; - if (omx < 0.0f) - { - omx = 0.0f; - } - float root = FMath::Sqrt(omx); - // 7-degree minimax approximation - float result = ((((((-0.0012624911f * x + 0.0066700901f) * x - 0.0170881256f) * x + 0.0308918810f) * x - 0.0501743046f) * x + 0.0889789874f) * x - 0.2145988016f) * x + FASTASIN_HALF_PI; - result *= root; // acos(|x|) - // acos(x) = pi - acos(-x) when x < 0, asin(x) = pi/2 - acos(x) - return (nonnegative ? FASTASIN_HALF_PI - result : result - FASTASIN_HALF_PI); - } -#undef FASTASIN_HALF_PI -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/UnrealNames.cpp b/dependencies/reboot/Project Reboot 3.0/UnrealNames.cpp deleted file mode 100644 index 18ffecc..0000000 --- a/dependencies/reboot/Project Reboot 3.0/UnrealNames.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "NameTypes.h" - -#include "reboot.h" -#include "UnrealString.h" - -#include "KismetStringLibrary.h" - -std::string FName::ToString() const -{ - static auto KismetStringLibrary = FindObject(L"/Script/Engine.Default__KismetStringLibrary"); - - static auto Conv_NameToString = FindObject(L"/Script/Engine.KismetStringLibrary.Conv_NameToString"); - - struct { FName InName; FString OutStr; } Conv_NameToString_Params{ *this }; - - KismetStringLibrary->ProcessEvent(Conv_NameToString, &Conv_NameToString_Params); - - auto Str = Conv_NameToString_Params.OutStr.ToString(); - - // Conv_NameToString_Params.OutStr.Free(); - - return Str; -} - -int32 FName::Compare(const FName& Other) const -{ - if (GetComparisonIndexFast() == Other.GetComparisonIndexFast()) - { - return GetNumber() - Other.GetNumber(); - } - // Names don't match. This means we don't even need to check numbers. - else - { - // return ToString() == Other.ToString(); // FOR REAL!! (Milxnor) - /* TNameEntryArray& Names = GetNames(); - const FNameEntry* const ThisEntry = GetComparisonNameEntry(); - const FNameEntry* const OtherEntry = Other.GetComparisonNameEntry(); - - FNameBuffer TempBuffer1; - FNameBuffer TempBuffer2; - - // If one or both entries return an invalid name entry, the comparison fails - fallback to comparing the index - if (ThisEntry == nullptr || OtherEntry == nullptr) - { - return GetComparisonIndexFast() - Other.GetComparisonIndexFast(); - } - // Ansi/Wide mismatch, convert to wide - else if (ThisEntry->IsWide() != OtherEntry->IsWide()) - { - return FCStringWide::Stricmp( - ThisEntry->IsWide() ? ThisEntry->GetWideNamePtr(TempBuffer1.WideName) : StringCast(ThisEntry->GetAnsiNamePtr(TempBuffer1.AnsiName)).Get(), - OtherEntry->IsWide() ? OtherEntry->GetWideNamePtr(TempBuffer2.WideName) : StringCast(OtherEntry->GetAnsiNamePtr(TempBuffer2.AnsiName)).Get()); - } - // Both are wide. - else if (ThisEntry->IsWide()) - { - return FCStringWide::Stricmp(ThisEntry->GetWideNamePtr(TempBuffer1.WideName), OtherEntry->GetWideNamePtr(TempBuffer2.WideName)); - } - // Both are ansi. - else - { - return FCStringAnsi::Stricmp(ThisEntry->GetAnsiNamePtr(TempBuffer1.AnsiName), OtherEntry->GetAnsiNamePtr(TempBuffer2.AnsiName)); - } */ - } - - return GetComparisonIndexFast() < Other.GetComparisonIndexFast(); -} - -std::string FName::ToString() -{ - static auto KismetStringLibrary = FindObject(L"/Script/Engine.Default__KismetStringLibrary"); - - static auto Conv_NameToString = FindObject(L"/Script/Engine.KismetStringLibrary.Conv_NameToString"); - - struct { FName InName; FString OutStr; } Conv_NameToString_Params{ *this }; - - KismetStringLibrary->ProcessEvent(Conv_NameToString, &Conv_NameToString_Params); - - auto Str = Conv_NameToString_Params.OutStr.ToString(); - - // Conv_NameToString_Params.OutStr.Free(); - - return Str; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/UnrealString.h b/dependencies/reboot/Project Reboot 3.0/UnrealString.h deleted file mode 100644 index 58f769c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/UnrealString.h +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once - -#include - -#include "Array.h" -#include "log.h" - -// #define EXPERIMENTAL_FSTRING - -class FString -{ -public: - TArray Data; - -public: - std::string ToString() const - { - auto length = std::wcslen(Data.Data); - std::string str(length, '\0'); - std::use_facet>(std::locale()).narrow(Data.Data, Data.Data + length, '?', &str[0]); - - return str; - } - - void Free() - { - Data.Free(); - } - - bool IsValid() - { - return Data.Data; - } - - void Set(const wchar_t* NewStr) - { - if (!NewStr/* || std::wcslen(NewStr) == 0 */) - return; - - constexpr size_t Inc = 1; - -#ifndef EXPERIMENTAL_FSTRING - Data.ArrayMax = Data.ArrayNum = *NewStr ? (int)std::wcslen(NewStr) + Inc : 0; - - if (Data.ArrayNum) - Data.Data = const_cast(NewStr); -#else - Data.ArrayNum = (int)std::wcslen(NewStr) + Inc; - Data.ArrayMax = Data.ArrayNum; - - if (Data.ArrayNum > 0) - { - int amountToAlloc = (Data.ArrayNum * sizeof(TCHAR)); - - if (Addresses::Free && Addresses::Realloc) - { - Data.Data = (TCHAR*)FMemory::Realloc(0, amountToAlloc, 0); - memcpy_s(Data.Data, amountToAlloc, NewStr, amountToAlloc); - } - else - { - Data.Data = (TCHAR*)NewStr; - } - } -#endif - } - - FString() {} - -#ifdef EXPERIMENTAL_FSTRING - FString& operator=(const wchar_t* Other) - { - this->Set(Other); - return *this; - } - - FString& operator=(const FString& Other) - { - this->Set(Other.Data.Data); - return *this; - } - - FString(const FString& Other) - { - this->Set(Other.Data.Data); - } -#endif - - FString(const wchar_t* str) - { - Set(str); - } - - ~FString() - { -#ifdef EXPERIMENTAL_FSTRING - if (Data.Data) - { - // LOG_INFO(LogDev, "Deconstructing FString!"); - // free(Data.Data); - - if (Addresses::Realloc && Addresses::Free) - { - static void (*freeOriginal)(void*) = decltype(freeOriginal)(Addresses::Free); - freeOriginal(Data.Data); - } - else - { - // VirtualFree(Data.Data, 0, MEM_RELEASE); - } - } -#endif - - // Free(); - - Data.Data = nullptr; - Data.ArrayNum = 0; - Data.ArrayMax = 0; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/UnrealTemplate.h b/dependencies/reboot/Project Reboot 3.0/UnrealTemplate.h deleted file mode 100644 index b939c9e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/UnrealTemplate.h +++ /dev/null @@ -1,106 +0,0 @@ -#pragma once - -#include "inc.h" - -#include "EnableIf.h" -#include "RemoveReference.h" -#include "AndOrNot.h" -#include "IsArithmetic.h" -#include "IsPointer.h" -#include "TypeCompatibleBytes.h" - -template struct TRValueToLValueReference { typedef T Type; }; -template struct TRValueToLValueReference { typedef T& Type; }; - -template -FORCEINLINE ReferencedType* IfAThenAElseB(ReferencedType* A, ReferencedType* B) -{ - using PTRINT = int64; - const PTRINT IntA = reinterpret_cast(A); - const PTRINT IntB = reinterpret_cast(B); - - // Compute a mask which has all bits set if IntA is zero, and no bits set if it's non-zero. - const PTRINT MaskB = -(!IntA); - - return reinterpret_cast(IntA | (MaskB & IntB)); -} - -template//, typename = typename TEnableIf::Value>::Type> -auto GetData(T&& Container) -> decltype(Container.GetData()) -{ - return Container.GetData(); -} - -template -constexpr T* GetData(T(&Container)[N]) -{ - return Container; -} - -template -constexpr T* GetData(std::initializer_list List) -{ - return List.begin(); -} - -template//, typename = typename TEnableIf::Value>::Type> -SIZE_T GetNum(T&& Container) -{ - return (SIZE_T)Container.Num(); -} - -template -FORCEINLINE T&& Forward(typename TRemoveReference::Type& Obj) -{ - return (T&&)Obj; -} - -template -FORCEINLINE T&& Forward(typename TRemoveReference::Type&& Obj) -{ - return (T&&)Obj; -} - -template -FORCEINLINE typename TRemoveReference::Type&& MoveTemp(T&& Obj) -{ - typedef typename TRemoveReference::Type CastType; - - // Validate that we're not being passed an rvalue or a const object - the former is redundant, the latter is almost certainly a mistake - // static_assert(TIsLValueReferenceType::Value, "MoveTemp called on an rvalue"); - // static_assert(!TAreTypesEqual::Value, "MoveTemp called on a const object"); - - return (CastType&&)Obj; -} - -template -struct TUseBitwiseSwap -{ - // We don't use bitwise swapping for 'register' types because this will force them into memory and be slower. - enum { Value = !TOrValue<__is_enum(T), TIsPointer, TIsArithmetic>::Value }; -}; - -template -inline typename TEnableIf::Value>::Type Swap(T& A, T& B) -{ - T Temp = MoveTemp(A); - A = MoveTemp(B); - B = MoveTemp(Temp); -} - -#define LIKELY(x) (x) - -template -inline typename TEnableIf::Value>::Type Swap(T& A, T& B) -{ - if (LIKELY(&A != &B)) - { - TTypeCompatibleBytes Temp; - // FMemory::Memcpy(&Temp, &A, sizeof(T)); - // FMemory::Memcpy(&A, &B, sizeof(T)); - // FMemory::Memcpy(&B, &Temp, sizeof(T)); - memcpy(&Temp, &A, sizeof(T)); - memcpy(&A, &B, sizeof(T)); - memcpy(&B, &Temp, sizeof(T)); - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/UnrealTypeTraits.h b/dependencies/reboot/Project Reboot 3.0/UnrealTypeTraits.h deleted file mode 100644 index 220af6a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/UnrealTypeTraits.h +++ /dev/null @@ -1,151 +0,0 @@ -#pragma once - -#include "IsEnum.h" -#include "IsPointer.h" -#include "IsArithmetic.h" -#include "AndOrNot.h" -#include "IsPODType.h" -#include "IsTriviallyCopyConstructible.h" - -template -struct TCallTraitsParamTypeHelper -{ - typedef const T& ParamType; - typedef const T& ConstParamType; -}; -template -struct TCallTraitsParamTypeHelper -{ - typedef const T ParamType; - typedef const T ConstParamType; -}; -template -struct TCallTraitsParamTypeHelper -{ - typedef T* ParamType; - typedef const T* ConstParamType; -}; - -template -struct TCallTraitsBase -{ -private: - enum { PassByValue = TOr>, TIsArithmetic, TIsPointer>::Value }; -public: - typedef T ValueType; - typedef T& Reference; - typedef const T& ConstReference; - typedef typename TCallTraitsParamTypeHelper::ParamType ParamType; - typedef typename TCallTraitsParamTypeHelper::ConstParamType ConstPointerType; -}; - -/** - * TCallTraits - */ -template -struct TCallTraits : public TCallTraitsBase {}; - -// Fix reference-to-reference problems. -template -struct TCallTraits -{ - typedef T& ValueType; - typedef T& Reference; - typedef const T& ConstReference; - typedef T& ParamType; - typedef T& ConstPointerType; -}; - -// Array types -template -struct TCallTraits -{ -private: - typedef T ArrayType[N]; -public: - typedef const T* ValueType; - typedef ArrayType& Reference; - typedef const ArrayType& ConstReference; - typedef const T* const ParamType; - typedef const T* const ConstPointerType; -}; - -// const array types -template -struct TCallTraits -{ -private: - typedef const T ArrayType[N]; -public: - typedef const T* ValueType; - typedef ArrayType& Reference; - typedef const ArrayType& ConstReference; - typedef const T* const ParamType; - typedef const T* const ConstPointerType; -}; - - -/*----------------------------------------------------------------------------- - Traits for our particular container classes ------------------------------------------------------------------------------*/ - -/** - * Helper for array traits. Provides a common base to more easily refine a portion of the traits - * when specializing. Mainly used by MemoryOps.h which is used by the contiguous storage containers like TArray. - */ -template -struct TTypeTraitsBase -{ - typedef typename TCallTraits::ParamType ConstInitType; - typedef typename TCallTraits::ConstPointerType ConstPointerType; - - // There's no good way of detecting this so we'll just assume it to be true for certain known types and expect - // users to customize it for their custom types. - enum { IsBytewiseComparable = TOr, TIsArithmetic, TIsPointer>::Value }; -}; - -/** - * Traits for types. - */ -template struct TTypeTraits : public TTypeTraitsBase {}; - -template -struct TIsBitwiseConstructible -{ - // Assume no bitwise construction in general - enum { Value = false }; -}; - -template -struct TIsBitwiseConstructible -{ - // Ts can always be bitwise constructed from itself if it is trivially copyable. - enum { Value = TIsTriviallyCopyConstructible::Value }; -}; - -template -struct TIsBitwiseConstructible : TIsBitwiseConstructible -{ - // Constructing a const T is the same as constructing a T -}; - -// Const pointers can be bitwise constructed from non-const pointers. -// This is not true for pointer conversions in general, e.g. where an offset may need to be applied in the case -// of multiple inheritance, but there is no way of detecting that at compile-time. -template -struct TIsBitwiseConstructible -{ - // Constructing a const T is the same as constructing a T - enum { Value = true }; -}; - -// Unsigned types can be bitwise converted to their signed equivalents, and vice versa. -// (assuming two's-complement, which we are) -template <> struct TIsBitwiseConstructible { enum { Value = true }; }; -template <> struct TIsBitwiseConstructible< char, uint8> { enum { Value = true }; }; -template <> struct TIsBitwiseConstructible { enum { Value = true }; }; -template <> struct TIsBitwiseConstructible< short, uint16> { enum { Value = true }; }; -template <> struct TIsBitwiseConstructible { enum { Value = true }; }; -template <> struct TIsBitwiseConstructible< int32, uint32> { enum { Value = true }; }; -template <> struct TIsBitwiseConstructible { enum { Value = true }; }; -template <> struct TIsBitwiseConstructible< int64, uint64> { enum { Value = true }; }; diff --git a/dependencies/reboot/Project Reboot 3.0/Vector.h b/dependencies/reboot/Project Reboot 3.0/Vector.h deleted file mode 100644 index d3b5d17..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Vector.h +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once - -#include "inc.h" - -struct FVector -{ -public: -#ifdef ABOVE_S20 - using VectorDataType = double; -#else - using VectorDataType = float; -#endif - - VectorDataType X; - VectorDataType Y; - VectorDataType Z; - - bool CompareVectors(const FVector& A) - { - return X == A.X && Y == A.Y && Z == A.Z; - } - - FVector() : X(0), Y(0), Z(0) {} - FVector(VectorDataType x, VectorDataType y, VectorDataType z) : X(x), Y(y), Z(z) {} - - FVector operator+(const FVector& A) - { - return FVector{ this->X + A.X, this->Y + A.Y, this->Z + A.Z }; - } - - FVector operator-(const FVector& A) - { - return FVector{ this->X - A.X, this->Y - A.Y, this->Z - A.Z }; - } - - FORCEINLINE VectorDataType SizeSquared() const - { - return X * X + Y * Y + Z * Z; - } - - FORCEINLINE VectorDataType operator|(const FVector& V) const - { - return X * V.X + Y * V.Y + Z * V.Z; - } - - FVector operator*(const VectorDataType A) - { - return FVector{ this->X * A, this->Y * A, this->Z * A }; - } - - /* bool operator==(const FVector& A) - { - return X == A.X && Y == A.Y && Z == A.Z; - } */ - - void operator+=(const FVector& A) - { - *this = *this + A; - } - - void operator-=(const FVector& A) - { - *this = *this - A; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/Vector2D.h b/dependencies/reboot/Project Reboot 3.0/Vector2D.h deleted file mode 100644 index 65b2d40..0000000 --- a/dependencies/reboot/Project Reboot 3.0/Vector2D.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -struct FVector2D -{ - float X; - float Y; -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/WeakObjectPtr.h b/dependencies/reboot/Project Reboot 3.0/WeakObjectPtr.h deleted file mode 100644 index 7496a5a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/WeakObjectPtr.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "UObjectArray.h" - -struct FWeakObjectPtr -{ -public: - int ObjectIndex; - int ObjectSerialNumber; - - UObject* Get() - { - return ChunkedObjects ? ChunkedObjects->GetObjectByIndex(ObjectIndex) : UnchunkedObjects ? UnchunkedObjects->GetObjectByIndex(ObjectIndex) : nullptr; - } - - bool operator==(const FWeakObjectPtr& other) - { - return ObjectIndex == other.ObjectIndex && ObjectSerialNumber == other.ObjectSerialNumber; - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/WeakObjectPtrTemplates.h b/dependencies/reboot/Project Reboot 3.0/WeakObjectPtrTemplates.h deleted file mode 100644 index 8807d3e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/WeakObjectPtrTemplates.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "WeakObjectPtr.h" -#include "Object.h" - -template -struct TWeakObjectPtr; - -template -struct TWeakObjectPtr : public TWeakObjectPtrBase -{ - T* Get() - { - return (T*)TWeakObjectPtrBase::Get(); - } - - bool operator==(const TWeakObjectPtr& other) - { - return TWeakObjectPtrBase::operator==(other); - } -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/World.cpp b/dependencies/reboot/Project Reboot 3.0/World.cpp deleted file mode 100644 index 3ce6b0d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/World.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "World.h" - -#include "KismetStringLibrary.h" -#include "Actor.h" - -#include "reboot.h" - -AWorldSettings* UWorld::K2_GetWorldSettings() -{ - static auto fn = FindObject(L"/Script/Engine.World.K2_GetWorldSettings"); - AWorldSettings* WorldSettings; - this->ProcessEvent(fn, &WorldSettings); - return WorldSettings; -} - -void UWorld::Listen() -{ - auto GameNetDriverName = UKismetStringLibrary::Conv_StringToName(L"GameNetDriver"); - - UNetDriver* NewNetDriver = nullptr; - - constexpr bool bUseBeacons = true; - - int Port = 7777 - Globals::AmountOfListens + 1; - - if (bUseBeacons) - { - static auto BeaconClass = FindObject(L"/Script/FortniteGame.FortOnlineBeaconHost"); - auto NewBeacon = GetWorld()->SpawnActor(BeaconClass); - - if (!NewBeacon) - { - LOG_ERROR(LogNet, "Failed to spawn beacon!"); - return; - } - - static bool (*InitHost)(UObject* Beacon) = decltype(InitHost)(Addresses::InitHost); - static void (*PauseBeaconRequests)(UObject* Beacon, bool bPause) = decltype(PauseBeaconRequests)(Addresses::PauseBeaconRequests); - - static auto ListenPortOffset = NewBeacon->GetOffset("ListenPort"); - NewBeacon->Get(ListenPortOffset) = Engine_Version < 426 ? Port - 1 : Port; - - InitHost(NewBeacon); - PauseBeaconRequests(NewBeacon, false); - - static auto Beacon_NetDriverOffset = NewBeacon->GetOffset("NetDriver"); - NewNetDriver = NewBeacon->Get(Beacon_NetDriverOffset); - } - else - { - NewNetDriver = GetEngine()->CreateNetDriver(GetWorld(), GameNetDriverName); - } - - if (!NewNetDriver) - { - LOG_ERROR(LogNet, "Failed to create net driver!"); - return; - } - - static auto NetDriverNameOffset = NewNetDriver->GetOffset("NetDriverName"); - NewNetDriver->Get(NetDriverNameOffset) = GameNetDriverName; - - static auto World_NetDriverOffset = GetWorld()->GetOffset("NetDriver"); - GetWorld()->Get(World_NetDriverOffset) = NewNetDriver; - - FURL URL = FURL(); - URL.Port = Port - (Engine_Version >= 426); - - NewNetDriver->SetWorld(GetWorld()); - - // LEVEL COLLECTIONS - - static auto LevelCollectionsOffset = GetWorld()->GetOffset("LevelCollections"); - auto& LevelCollections = GetWorld()->Get>(LevelCollectionsOffset); - static int LevelCollectionSize = FindObject(L"/Script/Engine.LevelCollection")->GetPropertiesSize(); - - *(UNetDriver**)(__int64(LevelCollections.AtPtr(0, LevelCollectionSize)) + 0x10) = NewNetDriver; - *(UNetDriver**)(__int64(LevelCollections.AtPtr(1, LevelCollectionSize)) + 0x10) = NewNetDriver; - - FString Error; - - if (!NewNetDriver->InitListen(GetWorld(), URL, false, Error)) - { - LOG_ERROR(LogNet, "Failed to init listen!"); - return; - } - - const bool bLanSpeed = false; - - if (!bLanSpeed && (NewNetDriver->GetMaxInternetClientRate() < NewNetDriver->GetMaxClientRate()) && (NewNetDriver->GetMaxInternetClientRate() > 2500)) - { - NewNetDriver->GetMaxClientRate() = NewNetDriver->GetMaxInternetClientRate(); - } - - LOG_INFO(LogNet, "Listening on port {}!", Port + Globals::AmountOfListens - 1); -} - -AWorldSettings* UWorld::GetWorldSettings(const bool bCheckStreamingPersistent, const bool bChecked) const -{ - // checkSlow(!IsInActualRenderingThread()); - AWorldSettings* WorldSettings = nullptr; - static auto PersistentLevelOffset = GetOffset("PersistentLevel"); - - if (this->Get(PersistentLevelOffset)) - { - WorldSettings = Get(PersistentLevelOffset)->GetWorldSettings(bChecked); - - if (bCheckStreamingPersistent) - { - static auto StreamingLevelsOffset = GetOffset("StreamingLevels"); - auto& StreamingLevels = Get>(StreamingLevelsOffset); - - static auto LevelStreamingPersistentClass = FindObject(L"/Script/Engine.LevelStreamingPersistent"); - - if (StreamingLevels.Num() > 0 && - StreamingLevels.at(0) && - StreamingLevels.at(0)->IsA(LevelStreamingPersistentClass)) - { - static auto LoadedLevelOffset = StreamingLevels.at(0)->GetOffset("LoadedLevel"); - ULevel* Level = StreamingLevels.at(0)->Get(LoadedLevelOffset); - if (Level != nullptr) - { - WorldSettings = Level->GetWorldSettings(); - } - } - } - } - - return WorldSettings; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/World.h b/dependencies/reboot/Project Reboot 3.0/World.h deleted file mode 100644 index e101801..0000000 --- a/dependencies/reboot/Project Reboot 3.0/World.h +++ /dev/null @@ -1,169 +0,0 @@ -#pragma once - -#include "EngineTypes.h" -#include "Transform.h" -#include "Object.h" -#include "Rotator.h" -#include "Actor.h" -#include "GameInstance.h" - -struct FNetworkNotify -{ - -}; - -class AWorldSettings : public AActor -{ -public: -}; - -struct FActorSpawnParameters -{ - FName Name = FName(0); - UObject* Template = nullptr; - UObject* Owner = nullptr; - UObject** Instigator = nullptr; - UObject* OverrideLevel = nullptr; - ESpawnActorCollisionHandlingMethod SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::Undefined; - uint16 bRemoteOwned : 1; - uint16 bNoFail : 1; - uint16 bDeferConstruction : 1; - uint16 bAllowDuringConstructionScript : 1; -#if WITH_EDITOR - uint16 bTemporaryEditorActor : 1; -#endif - EObjectFlags ObjectFlags; -}; - -struct FActorSpawnParametersUE500 -{ - FName Name = FName(0); - UObject* Template = nullptr; - UObject* Owner = nullptr; - UObject** Instigator = nullptr; - UObject* OverrideLevel = nullptr; - UObject* OverrideParentComponent; - ESpawnActorCollisionHandlingMethod SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::Undefined; - uint8_t TransformScaleMethod; - uint16 bRemoteOwned : 1; - uint16 bNoFail : 1; - uint16 bDeferConstruction : 1; - uint16 bAllowDuringConstructionScript : 1; -#if WITH_EDITOR - uint16 bTemporaryEditorActor : 1; -#endif - enum class ESpawnActorNameMode : uint8_t - { - Required_Fatal, - Required_ErrorAndReturnNull, - Required_ReturnNull, - Requested - }; - - ESpawnActorNameMode NameMode; - EObjectFlags ObjectFlags; - TFunction CustomPreSpawnInitalization; // my favorite -}; - -static inline void* CreateSpawnParameters(ESpawnActorCollisionHandlingMethod SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::Undefined, bool bDeferConstruction = false, UObject* Owner = nullptr) -{ - if (Engine_Version >= 500) - { - auto addr = (FActorSpawnParametersUE500*)VirtualAlloc(0, sizeof(FActorSpawnParametersUE500), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - - if (!addr) - return nullptr; - - addr->Owner = Owner; - addr->bDeferConstruction = bDeferConstruction; - addr->SpawnCollisionHandlingOverride = SpawnCollisionHandlingOverride; - return addr; - } - else - { - auto addr = (FActorSpawnParameters*)VirtualAlloc(0, sizeof(FActorSpawnParameters), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - - if (!addr) - return nullptr; - - addr->Owner = Owner; - addr->bDeferConstruction = bDeferConstruction; - addr->SpawnCollisionHandlingOverride = SpawnCollisionHandlingOverride; - return addr; - } - - return nullptr; -} - -class UWorld : public UObject, public FNetworkNotify -{ -public: - static inline UObject* (*SpawnActorOriginal)(UWorld* World, UClass* Class, FTransform const* UserTransformPtr, void* SpawnParameters); - - template - T*& GetGameMode() - { - static auto AuthorityGameModeOffset = GetOffset("AuthorityGameMode"); - return this->Get(AuthorityGameModeOffset); - } - - class AGameState*& GetGameState() - { - static auto GameStateOffset = GetOffset("GameState"); - return this->Get(GameStateOffset); - } - - class UNetDriver*& GetNetDriver() - { - static auto NetDriverOffset = GetOffset("NetDriver"); - return this->Get(NetDriverOffset); - } - - UGameInstance* GetOwningGameInstance() - { - static auto OwningGameInstanceOffset = GetOffset("OwningGameInstance"); - return this->Get(OwningGameInstanceOffset); - } - - inline FTimerManager& GetTimerManager() - { - return GetOwningGameInstance()->GetTimerManager(); - // return (GetOwningGameInstance() ? GetOwningGameInstance()->GetTimerManager() : *TimerManager); - } - - template - ActorType* SpawnActor(UClass* Class, FTransform UserTransformPtr = FTransform(), void* SpawnParameters = nullptr) - { - if (!SpawnParameters) - SpawnParameters = CreateSpawnParameters(); - - auto actor = (ActorType*)SpawnActorOriginal(this, Class, &UserTransformPtr, SpawnParameters); - - VirtualFree(SpawnParameters, 0, MEM_RELEASE); - - return actor; - } - - template - ActorType* SpawnActor(UClass* Class, FVector Location, FQuat Rotation = FQuat(), FVector Scale3D = FVector(1, 1, 1), void* SpawnParameters = nullptr) - { - if (!SpawnParameters) - SpawnParameters = CreateSpawnParameters(); - - FTransform UserTransformPtr{}; - UserTransformPtr.Translation = Location; - UserTransformPtr.Rotation = Rotation; - UserTransformPtr.Scale3D = Scale3D; - - auto actor = SpawnActor(Class, UserTransformPtr, SpawnParameters); - - VirtualFree(SpawnParameters, 0, MEM_RELEASE); - - return actor; - } - - AWorldSettings* GetWorldSettings(bool bCheckStreamingPersistent = false, bool bChecked = true) const; - AWorldSettings* K2_GetWorldSettings(); // DONT USE WHEN POSSIBLE - - void Listen(); -}; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/addresses.cpp b/dependencies/reboot/Project Reboot 3.0/addresses.cpp deleted file mode 100644 index 0abdded..0000000 --- a/dependencies/reboot/Project Reboot 3.0/addresses.cpp +++ /dev/null @@ -1,626 +0,0 @@ -#include "addresses.h" - -#include "UObjectGlobals.h" -#include "World.h" -#include "NetDriver.h" -#include "GameSession.h" - -#include "NetSerialization.h" - -#include "Array.h" -#include "AbilitySystemComponent.h" - -#include "finder.h" -#include - -#include "ai.h" -#include "BuildingActor.h" -#include "FortPlaysetItemDefinition.h" -#include "FortGameModeAthena.h" -#include "UObjectArray.h" - -void Addresses::SetupVersion() -{ - static FString(*GetEngineVersion)() = decltype(GetEngineVersion)(Memcury::Scanner::FindPattern("40 53 48 83 EC 20 48 8B D9 E8 ? ? ? ? 48 8B C8 41 B8 04 ? ? ? 48 8B D3", false).Get()); - - std::string FullVersion; - FString toFree; - - if (!GetEngineVersion) - { - auto VerStr = Memcury::Scanner::FindPattern("2B 2B 46 6F 72 74 6E 69 74 65 2B 52 65 6C 65 61 73 65 2D ? ? ? ?").Get(); - - // if (!VerStr) - - FullVersion = decltype(FullVersion.c_str())(VerStr); - Engine_Version = 500; - } - - else - { - toFree = GetEngineVersion(); - FullVersion = toFree.ToString(); - } - - std::string FNVer = FullVersion; - std::string EngineVer = FullVersion; - std::string CLStr; - - if (!FullVersion.contains("Live") && !FullVersion.contains(("Next")) && !FullVersion.contains(("Cert"))) - { - if (GetEngineVersion) - { - FNVer.erase(0, FNVer.find_last_of(("-"), FNVer.length() - 1) + 1); - EngineVer.erase(EngineVer.find_first_of(("-"), FNVer.length() - 1), 40); - - if (EngineVer.find_first_of(".") != EngineVer.find_last_of(".")) // this is for 4.21.0 and itll remove the .0 - EngineVer.erase(EngineVer.find_last_of((".")), 2); - - Engine_Version = std::stod(EngineVer) * 100; - } - - else - { - const std::regex base_regex(("-([0-9.]*)-")); - std::cmatch base_match; - - std::regex_search(FullVersion.c_str(), base_match, base_regex); - - FNVer = base_match[1]; - } - - Fortnite_Version = std::stod(FNVer); - - if (Fortnite_Version >= 16.00 && Fortnite_Version <= 18.40) - Engine_Version = 427; // 4.26.1; - } - - else - { - // TODO - // Engine_Version = FullVersion.contains(("Next")) ? 419 : 416; - CLStr = FullVersion.substr(FullVersion.find_first_of('-') + 1); - CLStr = CLStr.substr(0, CLStr.find_first_of('+')); - Fortnite_CL = std::stoi(CLStr); - Engine_Version = Fortnite_CL <= 3775276 ? 416 : 419; // std::stoi(FullVersion.substr(0, FullVersion.find_first_of('-'))); - // Fortnite_Version = FullVersion.contains(("Next")) ? 2.4 : 1.8; - } - - // Fortnite_Season = std::floor(Fortnite_Version); - - FFastArraySerializer::bNewSerializer = Fortnite_Version >= 8.30; - - if (Fortnite_CL == 3807424) - Fortnite_Version = 1.11; - if (Fortnite_CL == 3700114) - Fortnite_Version = 1.72; - if (Fortnite_CL == 3724489) - Fortnite_Version = 1.8; - if (Fortnite_CL == 3757339) - Fortnite_Version = 1.9; - if (Fortnite_CL == 3841827) - Fortnite_Version = 2.2; - if (Fortnite_CL == 3847564) - Fortnite_Version = 2.3; - if (Fortnite_CL == 3858292) - Fortnite_Version = 2.4; - if (Fortnite_CL == 3870737) - Fortnite_Version = 2.42; - - toFree.Free(); -} - -void Addresses::FindAll() -{ - auto Base = __int64(GetModuleHandleW(0)); - - LOG_INFO(LogDev, "Finding ProcessEvent"); - Addresses::ProcessEvent = FindProcessEvent(); - UObject::ProcessEventOriginal = decltype(UObject::ProcessEventOriginal)(ProcessEvent); - LOG_INFO(LogDev, "Finding StaticFindObject"); - - Addresses::StaticFindObject = FindStaticFindObject(); - StaticFindObjectOriginal = decltype(StaticFindObjectOriginal)(StaticFindObject); - LOG_INFO(LogDev, "StaticFindObject: 0x{:x}", StaticFindObject - Base); - LOG_INFO(LogDev, "Finding GetPlayerViewpoint"); - - Addresses::GetPlayerViewpoint = FindGetPlayerViewpoint(); - LOG_INFO(LogDev, "Finding CreateNetDriver"); - - Addresses::CreateNetDriver = FindCreateNetDriver(); - LOG_INFO(LogDev, "Finding InitHost"); - - Addresses::InitHost = FindInitHost(); - LOG_INFO(LogDev, "Finding PauseBeaconRequests"); - - Addresses::PauseBeaconRequests = FindPauseBeaconRequests(); - LOG_INFO(LogDev, "Finding SpawnActor"); - - Addresses::SpawnActor = FindSpawnActor(); - LOG_INFO(LogDev, "Finding InitListen"); - - Addresses::InitListen = FindInitListen(); - LOG_INFO(LogDev, "Finding SetWorld"); - - Addresses::SetWorld = FindSetWorld(); - LOG_INFO(LogDev, "Finding KickPlayer"); - - Addresses::KickPlayer = FindKickPlayer(); - LOG_INFO(LogDev, "Finding TickFlush"); - - Addresses::TickFlush = FindTickFlush(); - LOG_INFO(LogDev, "Finding GetNetMode"); - - Addresses::GetNetMode = FindGetNetMode(); - LOG_INFO(LogDev, "Finding Realloc"); - - Addresses::Realloc = FindRealloc(); - LOG_INFO(LogDev, "Finding CollectGarbage"); - - Addresses::CollectGarbage = FindCollectGarbage(); - LOG_INFO(LogDev, "Finding NoMCP"); - - Addresses::NoMCP = FindNoMCP(); - LOG_INFO(LogDev, "Finding PickTeam"); - - Addresses::PickTeam = FindPickTeam(); - LOG_INFO(LogDev, "Finding InternalTryActivateAbility"); - - Addresses::InternalTryActivateAbility = FindInternalTryActivateAbility(); - LOG_INFO(LogDev, "Finding GiveAbility"); - - Addresses::GiveAbility = FindGiveAbility(); - LOG_INFO(LogDev, "Finding CantBuild"); - - Addresses::CantBuild = FindCantBuild(); - LOG_INFO(LogDev, "Finding ReplaceBuildingActor"); - - Addresses::ReplaceBuildingActor = FindReplaceBuildingActor(); - LOG_INFO(LogDev, "Finding GiveAbilityAndActivateOnce"); - - Addresses::GiveAbilityAndActivateOnce = FindGiveAbilityAndActivateOnce(); - LOG_INFO(LogDev, "Finding OnDamageServer"); - - Addresses::OnDamageServer = FindOnDamageServer(); - LOG_INFO(LogDev, "Finding StaticLoadObject"); - - Addresses::StaticLoadObject = FindStaticLoadObject(); - LOG_INFO(LogDev, "Finding ActorGetNetMode"); - - Addresses::ActorGetNetMode = FindActorGetNetMode(); - LOG_INFO(LogDev, "Finding ChangeGameSessionId"); - - Addresses::ChangeGameSessionId = FindChangeGameSessionId(); - LOG_INFO(LogDev, "Finding DispatchRequest"); - - Addresses::DispatchRequest = FindDispatchRequest(); - LOG_INFO(LogDev, "Finding AddNavigationSystemToWorld"); - - Addresses::AddNavigationSystemToWorld = FindAddNavigationSystemToWorld(); - LOG_INFO(LogDev, "Finding NavSystemCleanUp"); - - Addresses::NavSystemCleanUp = FindNavSystemCleanUp(); - LOG_INFO(LogDev, "Finding LoadPlayset"); - - Addresses::LoadPlayset = FindLoadPlayset(); - LOG_INFO(LogDev, "Finding SetZoneToIndex"); - - Addresses::SetZoneToIndex = FindSetZoneToIndex(); - LOG_INFO(LogDev, "Finding CompletePickupAnimation"); - - Addresses::CompletePickupAnimation = FindCompletePickupAnimation(); - LOG_INFO(LogDev, "Finding CanActivateAbility"); - - Addresses::CanActivateAbility = FindCanActivateAbility(); - LOG_INFO(LogDev, "Finding SpecConstructor"); - - Addresses::SpecConstructor = FindSpecConstructor(); - LOG_INFO(LogDev, "Finding FrameStep"); - - Addresses::FrameStep = FindFrameStep(); - LOG_INFO(LogDev, "Finding ObjectArray"); - - Addresses::ObjectArray = FindObjectArray(); - LOG_INFO(LogDev, "Finding ReplicateActor"); - - Addresses::ReplicateActor = FindReplicateActor(); - LOG_INFO(LogDev, "Finding SetChannelActor"); - - Addresses::SetChannelActor = FindSetChannelActor(); - LOG_INFO(LogDev, "Finding SendClientAdjustment"); - - Addresses::SendClientAdjustment = FindSendClientAdjustment(); - LOG_INFO(LogDev, "Finding CreateChannel"); - - Addresses::CreateChannel = FindCreateChannel(); - LOG_INFO(LogDev, "Finding CallPreReplication"); - - Addresses::CallPreReplication = FindCallPreReplication(); - LOG_INFO(LogDev, "Finding OnRep_ZiplineState"); - - Addresses::OnRep_ZiplineState = FindOnRep_ZiplineState(); - LOG_INFO(LogDev, "Finding GetMaxTickRate"); - - Addresses::GetMaxTickRate = FindGetMaxTickRate(); - - LOG_INFO(LogDev, "Finding RemoveFromAlivePlayers"); - Addresses::RemoveFromAlivePlayers = FindRemoveFromAlivePlayers(); - - LOG_INFO(LogDev, "Finding ActorChannelClose"); - Addresses::ActorChannelClose = FindActorChannelClose(); - - LOG_INFO(LogDev, "Finding StepExplicitProperty"); - Addresses::FrameStepExplicitProperty = FindStepExplicitProperty(); - - LOG_INFO(LogDev, "Finding Free"); - Addresses::Free = FindFree(); - - LOG_INFO(LogDev, "Finding ClearAbility"); - Addresses::ClearAbility = FindClearAbility(); - - LOG_INFO(LogDev, "Finding ApplyGadgetData"); - Addresses::ApplyGadgetData = FindApplyGadgetData(); - - LOG_INFO(LogDev, "Finding RemoveGadgetData"); - Addresses::RemoveGadgetData = FindRemoveGadgetData(); - - LOG_INFO(LogDev, "Finding GetInterfaceAddress"); - Addresses::GetInterfaceAddress = FindGetInterfaceAddress(); - - LOG_INFO(LogDev, "Finding ApplyCharacterCustomization"); - Addresses::ApplyCharacterCustomization = FindApplyCharacterCustomization(); - - LOG_INFO(LogDev, "Finding EnterAircraft"); - Addresses::EnterAircraft = FindEnterAircraft(); - - LOG_INFO(LogDev, "Finding SetTimer"); - Addresses::SetTimer = FindSetTimer(); - - LOG_INFO(LogDev, "Finding PickupInitialize"); - Addresses::PickupInitialize = FindPickupInitialize(); - - LOG_INFO(LogDev, "Finding FreeEntry"); - Addresses::FreeEntry = FindFreeEntry(); - - LOG_INFO(LogDev, "Finding FreeArrayOfEntries"); - Addresses::FreeArrayOfEntries = FindFreeArrayOfEntries(); - - LOG_INFO(LogDev, "Finding UpdateTrackedAttributesLea"); - Addresses::UpdateTrackedAttributesLea = FindUpdateTrackedAttributesLea(); - - LOG_INFO(LogDev, "Finding CombinePickupLea"); - Addresses::CombinePickupLea = FindCombinePickupLea(); - - LOG_INFO(LogDev, "Finding CreateBuildingActorCallForDeco"); - Addresses::CreateBuildingActorCallForDeco = FindCreateBuildingActorCallForDeco(); - - LOG_INFO(LogDev, "Finding PickSupplyDropLocation"); - Addresses::PickSupplyDropLocation = FindPickSupplyDropLocation(); - - LOG_INFO(LogDev, "Finding LoadAsset"); - Addresses::LoadAsset = FindLoadAsset(); - - LOG_INFO(LogDev, "Finding RebootingDelegate"); - Addresses::RebootingDelegate = FindRebootingDelegate(); - - LOG_INFO(LogDev, "Finding GetSquadIdForCurrentPlayer"); - Addresses::GetSquadIdForCurrentPlayer = FindGetSquadIdForCurrentPlayer(); - - LOG_INFO(LogDev, "Finding FinishResurrection"); - Addresses::FinishResurrection = FindFinishResurrection(); - - LOG_INFO(LogDev, "Finding AddToAlivePlayers"); - Addresses::AddToAlivePlayers = FindAddToAlivePlayers(); - - LOG_INFO(LogDev, "Finding StartAircraftPhase"); - Addresses::StartAircraftPhase = FindStartAircraftPhase(); - - // LOG_INFO(LogDev, "Finding GetSessionInterface"); - // Addresses::GetSessionInterface = FindGetSessionInterface(); - - LOG_INFO(LogDev, "Applying GameSessionPatch"); - ApplyGameSessionPatch(); - - LOG_INFO(LogDev, "Finished finding!"); -} - -void Addresses::Print() -{ - auto Base = __int64(GetModuleHandleW(0)); - - LOG_INFO(LogDev, "Base: 0x{:x}", Base); - LOG_INFO(LogDev, "ProcessEvent: 0x{:x}", ProcessEvent - Base); - LOG_INFO(LogDev, "StaticFindObject: 0x{:x}", StaticFindObject - Base); - LOG_INFO(LogDev, "GetPlayerViewpoint: 0x{:x}", GetPlayerViewpoint - Base); - LOG_INFO(LogDev, "CreateNetDriver: 0x{:x}", CreateNetDriver - Base); - LOG_INFO(LogDev, "InitHost: 0x{:x}", InitHost - Base); - LOG_INFO(LogDev, "PauseBeaconRequests: 0x{:x}", PauseBeaconRequests - Base); - LOG_INFO(LogDev, "SpawnActor: 0x{:x}", SpawnActor - Base); - LOG_INFO(LogDev, "InitListen: 0x{:x}", InitListen - Base); - LOG_INFO(LogDev, "SetWorld: 0x{:x}", SetWorld - Base); - LOG_INFO(LogDev, "KickPlayer: 0x{:x}", KickPlayer - Base); - LOG_INFO(LogDev, "TickFlush: 0x{:x}", TickFlush - Base); - LOG_INFO(LogDev, "GetNetMode: 0x{:x}", GetNetMode - Base); - LOG_INFO(LogDev, "Realloc: 0x{:x}", Realloc - Base); - LOG_INFO(LogDev, "CollectGarbage: 0x{:x}", CollectGarbage - Base); - LOG_INFO(LogDev, "NoMCP: 0x{:x}", NoMCP - Base); - LOG_INFO(LogDev, "PickTeam: 0x{:x}", PickTeam - Base); - LOG_INFO(LogDev, "InternalTryActivateAbility: 0x{:x}", InternalTryActivateAbility - Base); - LOG_INFO(LogDev, "GiveAbility: 0x{:x}", GiveAbility - Base); - LOG_INFO(LogDev, "CantBuild: 0x{:x}", CantBuild - Base); - LOG_INFO(LogDev, "ReplaceBuildingActor: 0x{:x}", ReplaceBuildingActor - Base); - LOG_INFO(LogDev, "GiveAbilityAndActivateOnce: 0x{:x}", GiveAbilityAndActivateOnce - Base); - LOG_INFO(LogDev, "OnDamageServer: 0x{:x}", OnDamageServer - Base); - LOG_INFO(LogDev, "StaticLoadObject: 0x{:x}", StaticLoadObject - Base); - LOG_INFO(LogDev, "ActorGetNetMode: 0x{:x}", ActorGetNetMode - Base); - LOG_INFO(LogDev, "ChangeGameSessionId: 0x{:x}", ChangeGameSessionId - Base); - LOG_INFO(LogDev, "DispatchRequest: 0x{:x}", DispatchRequest - Base); - LOG_INFO(LogDev, "AddNavigationSystemToWorld: 0x{:x}", AddNavigationSystemToWorld - Base); - LOG_INFO(LogDev, "NavSystemCleanUp: 0x{:x}", NavSystemCleanUp - Base); - LOG_INFO(LogDev, "LoadPlayset: 0x{:x}", LoadPlayset - Base); - LOG_INFO(LogDev, "SetZoneToIndex: 0x{:x}", SetZoneToIndex - Base); - LOG_INFO(LogDev, "CompletePickupAnimation: 0x{:x}", CompletePickupAnimation - Base); - LOG_INFO(LogDev, "CanActivateAbility: 0x{:x}", CanActivateAbility - Base); - LOG_INFO(LogDev, "SpecConstructor: 0x{:x}", SpecConstructor - Base); - LOG_INFO(LogDev, "FrameStep: 0x{:x}", FrameStep - Base); - LOG_INFO(LogDev, "ObjectArray: 0x{:x}", ObjectArray - Base); - LOG_INFO(LogDev, "ReplicateActor: 0x{:x}", ReplicateActor - Base); - LOG_INFO(LogDev, "SetChannelActor: 0x{:x}", SetChannelActor - Base); - LOG_INFO(LogDev, "SendClientAdjustment: 0x{:x}", SendClientAdjustment - Base); - LOG_INFO(LogDev, "CreateChannel: 0x{:x}", CreateChannel - Base); - LOG_INFO(LogDev, "CallPreReplication: 0x{:x}", CallPreReplication - Base); - LOG_INFO(LogDev, "OnRep_ZiplineState: 0x{:x}", OnRep_ZiplineState - Base); - LOG_INFO(LogDev, "GetMaxTickRate: 0x{:x}", GetMaxTickRate - Base); - LOG_INFO(LogDev, "RemoveFromAlivePlayers: 0x{:x}", RemoveFromAlivePlayers - Base); - LOG_INFO(LogDev, "ActorChannelClose: 0x{:x}", ActorChannelClose - Base); - LOG_INFO(LogDev, "FrameStepExplicitProperty: 0x{:x}", FrameStepExplicitProperty - Base); - LOG_INFO(LogDev, "Free: 0x{:x}", Free - Base); - LOG_INFO(LogDev, "ClearAbility: 0x{:x}", ClearAbility - Base); - LOG_INFO(LogDev, "ApplyGadgetData: 0x{:x}", ApplyGadgetData - Base); - LOG_INFO(LogDev, "RemoveGadgetData: 0x{:x}", RemoveGadgetData - Base); - LOG_INFO(LogDev, "GetInterfaceAddress: 0x{:x}", GetInterfaceAddress - Base); - LOG_INFO(LogDev, "ApplyCharacterCustomization: 0x{:x}", ApplyCharacterCustomization - Base); - LOG_INFO(LogDev, "EnterAircraft: 0x{:x}", EnterAircraft - Base); - LOG_INFO(LogDev, "SetTimer: 0x{:x}", SetTimer - Base); - LOG_INFO(LogDev, "PickupInitialize: 0x{:x}", PickupInitialize - Base); - LOG_INFO(LogDev, "FreeEntry: 0x{:x}", FreeEntry - Base); - LOG_INFO(LogDev, "FreeArrayOfEntries: 0x{:x}", FreeArrayOfEntries - Base); - LOG_INFO(LogDev, "UpdateTrackedAttributesLea: 0x{:x}", UpdateTrackedAttributesLea - Base); - LOG_INFO(LogDev, "CombinePickupLea: 0x{:x}", CombinePickupLea - Base); - LOG_INFO(LogDev, "CreateBuildingActorCallForDeco: 0x{:x}", CreateBuildingActorCallForDeco - Base); - LOG_INFO(LogDev, "PickSupplyDropLocation: 0x{:x}", PickSupplyDropLocation - Base); - LOG_INFO(LogDev, "LoadAsset: 0x{:x}", LoadAsset - Base); - LOG_INFO(LogDev, "RebootingDelegate: 0x{:x}", RebootingDelegate - Base); - LOG_INFO(LogDev, "GetSquadIdForCurrentPlayer: 0x{:x}", GetSquadIdForCurrentPlayer - Base); - LOG_INFO(LogDev, "FinishResurrection: 0x{:x}", FinishResurrection - Base); - LOG_INFO(LogDev, "AddToAlivePlayers: 0x{:x}", AddToAlivePlayers - Base); - LOG_INFO(LogDev, "GetSessionInterface: 0x{:x}", GetSessionInterface - Base); - LOG_INFO(LogDev, "StartAircraftPhase: 0x{:x}", StartAircraftPhase - Base); -} - -void Offsets::FindAll() -{ - Offsets::Offset_Internal = Fortnite_Version >= 12.10 && std::floor(Fortnite_Version) < 20 ? 0x4C : 0x44; - Offsets::SuperStruct = Engine_Version >= 422 ? 0x40 : 0x30; - Offsets::Children = Fortnite_Version >= 12.10 ? 0x50 : Offsets::SuperStruct + 8; - Offsets::PropertiesSize = Offsets::Children + 8; - - if (Engine_Version >= 416 && Engine_Version <= 421) - Offsets::Func = 0xB0; - else if (Engine_Version >= 422 && Engine_Version <= 424) - Offsets::Func = 0xC0; - else if (Fortnite_Version >= 12.00 && Fortnite_Version < 12.10) - Offsets::Func = 0xC8; - else if (Engine_Version == 425) - Offsets::Func = 0xF0; - else if (Engine_Version >= 426) - Offsets::Func = 0xD8; - - if (Engine_Version == 420) - Offsets::ServerReplicateActors = 0x53; - else if (Engine_Version == 421) - Offsets::ServerReplicateActors = std::floor(Fortnite_Version) == 5 ? 0x54 : 0x56; - else if (Engine_Version >= 422 && Engine_Version <= 424) - Offsets::ServerReplicateActors = Fortnite_Version >= 7.40 && Fortnite_Version < 8.40 ? 0x57 : - Engine_Version == 424 ? (Fortnite_Version >= 11.00 && Fortnite_Version <= 11.10 ? 0x57 : - (Fortnite_Version == 11.30 || Fortnite_Version == 11.31 ? 0x59 : 0x5A)) : 0x56; - - // ^ I know this makes no sense, 7.40-8.40 is 0x57, other 7-10 is 0x56, 11.00-11.10 = 0x57, 11.30-11.31 = 0x59, other S11 is 0x5A - - else if (std::floor(Fortnite_Version) == 12 || std::floor(Fortnite_Version) == 13) - Offsets::ServerReplicateActors = 0x5D; - else if (std::floor(Fortnite_Version) == 14 || Fortnite_Version <= 15.2) // never tested 15.2 - Offsets::ServerReplicateActors = 0x5E; - else if (Fortnite_Version >= 15.3 && Engine_Version < 500) // 15.3-18 = 0x5F - Offsets::ServerReplicateActors = 0x5F; - else if (std::floor(Fortnite_Version) >= 19 && std::floor(Fortnite_Version) <= 20) - Offsets::ServerReplicateActors = 0x66; - else if (std::floor(Fortnite_Version) >= 21) - Offsets::ServerReplicateActors = 0x67; // checked onb 22.30 - - if (Engine_Version == 416) // checked on 1.7.2 & 1.8 & 1.9 - { - Offsets::NetworkObjectList = 0x3F8; - Offsets::ReplicationFrame = 0x288; - } - if (Fortnite_Version == 1.72) - { - Offsets::ClientWorldPackageName = 0x336A8; - } - if (Fortnite_Version == 1.8 || Fortnite_Version == 1.9) - { - Offsets::ClientWorldPackageName = 0x33788; - } - if (Fortnite_Version == 1.11) - { - Offsets::ClientWorldPackageName = 0x337B8; - } - if (Fortnite_Version >= 2.2 && Fortnite_Version <= 2.4) // 2.2 & 2.4 - { - Offsets::ClientWorldPackageName = 0xA17A8; - } - if (Fortnite_Version == 2.42 || Fortnite_Version == 2.5) - { - Offsets::ClientWorldPackageName = 0x17F8; - } - if (Fortnite_Version >= 2.5 && Fortnite_Version <= 3.1) // checked 2.5, 3.0, 3.1 - { - Offsets::NetworkObjectList = 0x4F0; - Offsets::ReplicationFrame = 0x328; - } - if (Fortnite_Version == 3.1 || Fortnite_Version == 3.2) - { - Offsets::NetworkObjectList = 0x4F8; - Offsets::ClientWorldPackageName = 0x1818; - } - if (Engine_Version == 419) // checked 2.4.2 & 2.2 & 1.11 - { - Offsets::NetworkObjectList = 0x490; - Offsets::ReplicationFrame = 0x2C8; - } - if (Fortnite_Version >= 20 && Fortnite_Version < 22) - { - Offsets::ReplicationFrame = 0x3D8; - } - - Offsets::IsNetRelevantFor = FindIsNetRelevantForOffset(); - Offsets::Script = Offsets::Children + 8 + 4 + 4; -} - -void Offsets::Print() -{ - LOG_INFO(LogDev, "Offset_Internal: 0x{:x}", Offset_Internal); - LOG_INFO(LogDev, "SuperStruct: 0x{:x}", SuperStruct); - LOG_INFO(LogDev, "Children: 0x{:x}", Children); - LOG_INFO(LogDev, "PropertiesSize: 0x{:x}", PropertiesSize); - LOG_INFO(LogDev, "Func: 0x{:x}", Func); - LOG_INFO(LogDev, "ServerReplicateActors: 0x{:x}", ServerReplicateActors); - LOG_INFO(LogDev, "ReplicationFrame: 0x{:x}", ReplicationFrame); - LOG_INFO(LogDev, "Script: 0x{:x}", Script); - LOG_INFO(LogDev, "PropertyClass: 0x{:x}", PropertyClass); -} - -void Addresses::Init() -{ - // UObject::ProcessEventOriginal = decltype(UObject::ProcessEventOriginal)(ProcessEvent); // we do this in Addresses::FindAll() - // StaticFindObjectOriginal = decltype(StaticFindObjectOriginal)(StaticFindObject); // we do this in Addresses::FindAll() - UWorld::SpawnActorOriginal = decltype(UWorld::SpawnActorOriginal)(SpawnActor); - UNetDriver::InitListenOriginal = decltype(UNetDriver::InitListenOriginal)(InitListen); - AGameSession::KickPlayerOriginal = decltype(AGameSession::KickPlayerOriginal)(KickPlayer); - UNetDriver::TickFlushOriginal = decltype(UNetDriver::TickFlushOriginal)(TickFlush); - FMemory::Realloc = decltype(FMemory::Realloc)(Realloc); - UAbilitySystemComponent::GiveAbilityOriginal = decltype(UAbilitySystemComponent::GiveAbilityOriginal)(GiveAbility); - UAbilitySystemComponent::InternalTryActivateAbilityOriginal = decltype(UAbilitySystemComponent::InternalTryActivateAbilityOriginal)(InternalTryActivateAbility); - UAbilitySystemComponent::InternalTryActivateAbilityOriginal2 = decltype(UAbilitySystemComponent::InternalTryActivateAbilityOriginal2)(InternalTryActivateAbility); - ABuildingActor::OnDamageServerOriginal = decltype(ABuildingActor::OnDamageServerOriginal)(OnDamageServer); - StaticLoadObjectOriginal = decltype(StaticLoadObjectOriginal)(StaticLoadObject); - - static auto DefaultNetDriver = FindObject(L"/Script/Engine.Default__NetDriver"); - Addresses::SetWorld = Engine_Version < 426 ? Addresses::SetWorld : __int64(DefaultNetDriver->VFTable[Addresses::SetWorld]); - UNetDriver::SetWorldOriginal = decltype(UNetDriver::SetWorldOriginal)(SetWorld); - - NavSystemCleanUpOriginal = decltype(NavSystemCleanUpOriginal)(Addresses::NavSystemCleanUp); - LoadPlaysetOriginal = decltype(LoadPlaysetOriginal)(Addresses::LoadPlayset); - AFortGameModeAthena::SetZoneToIndexOriginal = decltype(AFortGameModeAthena::SetZoneToIndexOriginal)(Addresses::SetZoneToIndex); - - if (Engine_Version >= 421) ChunkedObjects = decltype(ChunkedObjects)(ObjectArray); - else UnchunkedObjects = decltype(UnchunkedObjects)(ObjectArray); -} - -std::vector Addresses::GetFunctionsToReturnTrue() -{ - std::vector toReturnTrue; - - if (Fortnite_Version == 1.11 || Fortnite_Version >= 2.2 && Fortnite_Version <= 2.4) - { - toReturnTrue.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 57 41 56 41 57 48 81 EC ? ? ? ? 48 8B 01 49 8B E9 45 0F B6 F8").Get()); // No Reserve - } - - if (std::floor(Fortnite_Version) == 17) - { - toReturnTrue.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 4C 89 60 20 55 41 56 41 57 48 8B EC 48 83 EC 60 4D 8B F9 41 8A F0 4C 8B F2 48 8B F9 45 32 E4").Get()); // No Reserve - } - - if (Fortnite_Version >= 19) - { - // toReturnTrue.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 8B 01 49 8B F0 33 DB FF 50 20 48 8B F8").Get()); // funny session thingy - } - - if (Engine_Version >= 426) - { - toReturnTrue.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 4C 89 60 20 55 41 56 41 57 48 8B EC 48 83 EC 60 49 8B D9 45 8A").Get()); // No reserve - } - - return toReturnTrue; -} - -std::vector Addresses::GetFunctionsToNull() -{ - std::vector toNull; - - if (Engine_Version == 416) - { - toNull.push_back(Memcury::Scanner::FindPattern("48 89 54 24 ? 48 89 4C 24 ? 55 53 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 8B 41 08 C1 E8 05").Get()); // Widget class - } - - if (Fortnite_Version > 3.2 && Engine_Version == 420) - { - toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 57 48 81 EC ? ? ? ? 4C 8B 82 ? ? ? ? 48 8B F9 0F 29 70 E8 0F 29 78 D8").Get()); // Pawn Overlap - // toNull.push_back(Memcury::Scanner::FindPattern("E8 ? ? ? ? EB 26 40 38 3D ? ? ? ?").RelativeOffset(1).Get()); // collectgarbage - } - - if (Fortnite_Version == 4.1) - { - toNull.push_back(Memcury::Scanner::FindPattern("4C 8B DC 55 49 8D AB ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 49 89 5B 10 48 8D 05 ? ? ? ? 48 8B 1D ? ? ? ? 49 89 73 18 33 F6 40").Get()); // grassupdate - } - - if (Engine_Version == 421) - { - toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 48 89 70 10 57 48 81 EC ? ? ? ? 48 8B BA ? ? ? ? 48 8B DA 0F 29").Get()); // Pawn Overlap - toNull.push_back(Memcury::Scanner::FindStringRef(L"Widget Class %s - Running Initialize On Archetype, %s.").ScanFor({ 0x40, 0x55 }, false).Get()); // Widget class - } - - if (Engine_Version == 422) - { - toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 30 48 8B 41 28 48 8B DA 48 8B F9 48 85 C0 74 34 48 8B 4B 08 48 8D").Get()); // widget class - } - - if (Engine_Version == 425) - { - toNull.push_back(Memcury::Scanner::FindPattern("40 57 41 56 48 81 EC ? ? ? ? 80 3D ? ? ? ? ? 0F B6 FA 44 8B F1 74 3A 80 3D ? ? ? ? ? 0F 82").Get()); // collect garbage - } - - if (Fortnite_Version == 12.41) - { - toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 54 41 56 41 57 48 83 EC 70 48 8B 35").Get()); // random travis crash - toNull.push_back(Memcury::Scanner::FindPattern("40 57 41 56 48 81 EC ? ? ? ? 80 3D ? ? ? ? ? 0F B6 FA 44 8B F1 74 3A 80 3D ? ? ? ? ? 0F").Get()); // collect garbage - } - - if (Fortnite_Version == 12.61) - { - toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 57 41 54 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 20 4C 8B A5").Get()); // idfk - // toNull.push_back(Memcury::Scanner::FindPattern("48 89 4C 24 ? 55 56 57 41 56 48 81 EC ? ? ? ? 4C 8B B1 ? ? ? ? 33 F6 4C 89 B4 24 ? ? ? ? 48 8B").Get()); // fritter crash - } - - if (Fortnite_Version == 14.60) - { - toNull.push_back(Memcury::Scanner::FindPattern("40 55 57 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 80 3D ? ? ? ? ? 0F B6 FA 44 8B F9 74 3B 80 3D ? ? ? ? ? 0F").Get()); - } - - if (std::floor(Fortnite_Version) == 17) - { - toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 70 08 48 89 78 10 55 41 54 41 55 41 56 41 57 48 8D 68 A1 48 81 EC ? ? ? ? 45 33 ED").Get()); // collectgarbage - } - - if (Engine_Version == 500) - { - // toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 68 A1 48 81 EC ? ? ? ? 45 33 F6 0F 29 70 A8 44 38 35").Get()); // zone - // toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 55 56 57 41 54 41 55 41 56 41 57 48 8D 68 A8 48 81 EC ? ? ? ? 45").Get()); // GC - // toNull.push_back(Memcury::Scanner::FindPattern("40 53 48 83 EC 20 8B D9 E8 ? ? ? ? B2 01 8B CB E8").Get()); // GC Caller 1 - toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 55 41 56 48 8B EC 48 83 EC 50 83 65 28 00 40 B6 05 40 38 35 ? ? ? ? 4C").Get()); // InitializeUI - } - - toNull.push_back(Addresses::ChangeGameSessionId); - - return toNull; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/addresses.h b/dependencies/reboot/Project Reboot 3.0/addresses.h deleted file mode 100644 index d5b6879..0000000 --- a/dependencies/reboot/Project Reboot 3.0/addresses.h +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once - -// #include "finder.h" -#include "log.h" -#include "inc.h" - -namespace Addresses -{ - extern inline uint64 StaticFindObject = 0; - extern inline uint64 StaticLoadObject = 0; - extern inline uint64 ObjectArray = 0; - extern inline uint64 InitListen = 0; - extern inline uint64 CreateNetDriver = 0; - extern inline uint64 SetWorld = 0; - extern inline uint64 ProcessEvent = 0; - extern inline uint64 PickupDelay = 0; - extern inline uint64 GetMaxTickRate = 0; - extern inline uint64 GetPlayerViewpoint = 0; - extern inline uint64 InitHost = 0; - extern inline uint64 PauseBeaconRequests = 0; - extern inline uint64 SpawnActor = 0; - extern inline uint64 KickPlayer = 0; - extern inline uint64 TickFlush = 0; - extern inline uint64 GetNetMode = 0; - extern inline uint64 Realloc = 0; - extern inline uint64 CollectGarbage = 0; - extern inline uint64 NoMCP = 0; - extern inline uint64 PickTeam = 0; - extern inline uint64 InternalTryActivateAbility = 0; - extern inline uint64 GiveAbility = 0; - extern inline uint64 CantBuild = 0; - extern inline uint64 ReplaceBuildingActor = 0; - extern inline uint64 GiveAbilityAndActivateOnce = 0; - extern inline uint64 OnDamageServer = 0; - extern inline uint64 GIsServer = 0; - extern inline uint64 GIsClient = 0; - extern inline uint64 ActorGetNetMode = 0; - extern inline uint64 ChangeGameSessionId = 0; - extern inline uint64 DispatchRequest = 0; - extern inline uint64 AddNavigationSystemToWorld = 0; - extern inline uint64 NavSystemCleanUp = 0; - extern inline uint64 LoadPlayset = 0; - extern inline uint64 SetZoneToIndex = 0; - extern inline uint64 CompletePickupAnimation = 0; - extern inline uint64 CanActivateAbility = 0; - extern inline uint64 SpecConstructor = 0; - extern inline uint64 ReplicateActor = 0; - extern inline uint64 CallPreReplication = 0; - extern inline uint64 CreateChannel = 0; - extern inline uint64 SetChannelActor = 0; - extern inline uint64 SendClientAdjustment = 0; - extern inline uint64 FrameStep = 0; - extern inline uint64 OnRep_ZiplineState = 0; - extern inline uint64 RemoveFromAlivePlayers = 0; - extern inline uint64 ActorChannelClose = 0; - extern inline uint64 FrameStepExplicitProperty = 0; - extern inline uint64 Free = 0; - extern inline uint64 ClearAbility = 0; - extern inline uint64 ApplyGadgetData = 0; - extern inline uint64 RemoveGadgetData = 0; - extern inline uint64 ApplyCharacterCustomization = 0; - extern inline uint64 GetInterfaceAddress = 0; - extern inline uint64 EnterAircraft = 0; - extern inline uint64 SetTimer = 0; - extern inline uint64 PickupInitialize = 0; - extern inline uint64 FreeEntry = 0; - extern inline uint64 FreeArrayOfEntries = 0; - extern inline uint64 UpdateTrackedAttributesLea = 0; - extern inline uint64 CombinePickupLea = 0; - extern inline uint64 CreateBuildingActorCallForDeco = 0; - extern inline uint64 PickSupplyDropLocation = 0; - extern inline uint64 LoadAsset = 0; - extern inline uint64 RebootingDelegate = 0; - extern inline uint64 GetSquadIdForCurrentPlayer = 0; - extern inline uint64 FinishResurrection = 0; - extern inline uint64 AddToAlivePlayers = 0; - extern inline uint64 GameSessionPatch = 0; - extern inline uint64 GetSessionInterface = 0; // Matchmaking - extern inline uint64 StartAircraftPhase = 0; - - void SetupVersion(); // Finds Engine Version - void FindAll(); - void Print(); - void Init(); - - std::vector GetFunctionsToReturnTrue(); - std::vector GetFunctionsToNull(); -} - -namespace Offsets -{ - extern inline uint64 Func = 0; - extern inline uint64 PropertiesSize = 0; - extern inline uint64 Children = 0; - extern inline uint64 SuperStruct = 0; - extern inline uint64 Offset_Internal = 0; - extern inline uint64 ServerReplicateActors = 0; - extern inline uint64 ReplicationFrame = 0; - extern inline uint64 IsNetRelevantFor = 0; - extern inline uint64 NetworkObjectList = 0; - extern inline uint64 ClientWorldPackageName = 0; - extern inline uint64 Script = 0; - extern inline uint64 PropertyClass = 0; - - void FindAll(); - void Print(); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/ai.h b/dependencies/reboot/Project Reboot 3.0/ai.h deleted file mode 100644 index 739b672..0000000 --- a/dependencies/reboot/Project Reboot 3.0/ai.h +++ /dev/null @@ -1,368 +0,0 @@ -#pragma once - -#include "reboot.h" -#include "Actor.h" -#include "SoftObjectPath.h" -#include "KismetStringLibrary.h" -#include "GameplayStatics.h" -#include "FortPlayerPawn.h" -#include "FortAthenaMutator.h" -#include "FortPlayerController.h" -#include "FortGameModeAthena.h" -#include "FortGameStateAthena.h" -#include "FortPlayerControllerAthena.h" -#include "FortBotNameSettings.h" -#include "KismetTextLibrary.h" -#include "FortAthenaAIBotCustomizationData.h" - -using UNavigationSystemV1 = UObject; -using UNavigationSystemConfig = UObject; -using AAthenaNavSystemConfigOverride = UObject; -using UAthenaNavSystem = UObject; -using UAthenaNavSystemConfig = UObject; - -enum class EFNavigationSystemRunMode : uint8_t -{ - InvalidMode = 0, - GameMode = 1, - EditorMode = 2, - SimulationMode = 3, - PIEMode = 4, - FNavigationSystemRunMode_MAX = 5 -}; - -enum class ENavSystemOverridePolicy : uint8_t -{ - Override = 0, - Append = 1, - Skip = 2, - ENavSystemOverridePolicy_MAX = 3 -}; - -extern inline void (*NavSystemCleanUpOriginal)(UNavigationSystemV1*, uint8) = nullptr; - -static bool SetNavigationSystem(AAthenaNavSystemConfigOverride* NavSystemOverride) -{ - UAthenaNavSystem*& NavSystem = (UAthenaNavSystem*&)GetWorld()->Get("NavigationSystem"); - - LOG_INFO(LogDev, "NavSystem: {}", NavSystem->IsValidLowLevel() ? NavSystem->GetFullName() : "BadRead"); - - if (NavSystem) - { - return false; - NavSystemCleanUpOriginal(NavSystem, 0); - GetWorld()->Get("NavigationSystem") = nullptr; - } - - auto WorldSettings = GetWorld()->GetWorldSettings(); - - LOG_INFO(LogDev, "WorldSettings: {}", WorldSettings->IsValidLowLevel() ? WorldSettings->GetFullName() : "BadRead"); - - if (!WorldSettings) - return false; - - static auto OverridePolicyOffset = NavSystemOverride->GetOffset("OverridePolicy", false); - - if (OverridePolicyOffset != -1) - NavSystemOverride->Get(OverridePolicyOffset) = ENavSystemOverridePolicy::Append; - - static auto NavSystemOverride_NavigationSystemConfigOffset = NavSystemOverride->GetOffset("NavigationSystemConfig"); - - WorldSettings->Get("NavigationSystemConfigOverride") = NavSystemOverride->Get(NavSystemOverride_NavigationSystemConfigOffset); - - LOG_INFO(LogDev, "WorldSettings_NavigationSystemConfig: {}", __int64(WorldSettings->Get("NavigationSystemConfig"))); - - if (WorldSettings->Get("NavigationSystemConfig")) - WorldSettings->Get("NavigationSystemConfig")->Get("bIsOverriden") = true; - - if (!NavSystemOverride->Get("NavigationSystemConfig")) - { - LOG_ERROR(LogAI, "No NavigationSystemConfig!"); - return false; - } - - auto& ClassPath = NavSystemOverride->Get("NavigationSystemConfig")->Get("NavigationSystemClass"); - - auto NewNavSystemClass = FindObject(ClassPath.AssetPathName.ToString()); - - if (!NewNavSystemClass) - { - LOG_ERROR(LogAI, "No NavigationSystemClass!"); - return false; - } - - LOG_INFO(LogAI, "Setup navigation system."); - - // if (Fortnite_Version >= 10.40) // idk when they added the fifth arg or does it even matter???? - { - static void (*AddNavigationSystemToWorldOriginal)(UWorld * WorldOwner, EFNavigationSystemRunMode RunMode, UNavigationSystemConfig * NavigationSystemConfig, char bInitializeForWorld, char bOverridePreviousNavSys) = - decltype(AddNavigationSystemToWorldOriginal)(Addresses::AddNavigationSystemToWorld); - - AddNavigationSystemToWorldOriginal(GetWorld(), EFNavigationSystemRunMode::GameMode, NavSystemOverride->Get("NavigationSystemConfig"), true, false); - } - - return true; -} - -static void SetupServerBotManager() -{ - auto GameState = Cast(GetWorld()->GetGameState()); - auto GameMode = Cast(GetWorld()->GetGameMode()); - - static auto FortServerBotManagerClass = FindObject(L"/Script/FortniteGame.FortServerBotManagerAthena"); // Is there a BP for this? // GameMode->ServerBotManagerClass - - if (!FortServerBotManagerClass) - return; - - static auto ServerBotManagerOffset = GameMode->GetOffset("ServerBotManager"); - UObject*& ServerBotManager = GameMode->Get(ServerBotManagerOffset); - - if (!ServerBotManager) - ServerBotManager = UGameplayStatics::SpawnObject(FortServerBotManagerClass, GetTransientPackage()); - - if (ServerBotManager) - { - static auto CachedGameModeOffset = ServerBotManager->GetOffset("CachedGameMode"); - ServerBotManager->Get(CachedGameModeOffset) = GameMode; - - static auto CachedGameStateOffset = ServerBotManager->GetOffset("CachedGameState", false); - - if (CachedGameStateOffset != -1) - ServerBotManager->Get(CachedGameStateOffset) = GameState; - - static auto CachedBotMutatorOffset = ServerBotManager->GetOffset("CachedBotMutator"); - ServerBotManager->Get(CachedBotMutatorOffset) = FindFirstMutator(FindObject(L"/Script/FortniteGame.FortAthenaMutator_Bots")); - } -} - -static void SetupAIGoalManager() -{ - // Playlist->AISettings->bAllowAIGoalManager - - // There is some virtual function in the gamemode that calls a spawner for this, it gets the class from GameData, not sure why this doesn't work automatically or if we should even spawn this. - - auto GameMode = Cast(GetWorld()->GetGameMode()); - static auto AIGoalManagerOffset = GameMode->GetOffset("AIGoalManager"); - - static auto AIGoalManagerClass = FindObject(L"/Script.FortniteGame.FortAIGoalManager"); - - if (!AIGoalManagerClass) - return; - - LOG_INFO(LogDev, "AIGoalManager Before: {}", __int64(GameMode->Get(AIGoalManagerOffset))); - - if (!GameMode->Get(AIGoalManagerOffset)) - GameMode->Get(AIGoalManagerOffset) = GetWorld()->SpawnActor(AIGoalManagerClass); - - if (GameMode->Get(AIGoalManagerOffset)) - { - LOG_INFO(LogAI, "Successfully spawned AIGoalManager!"); - } -} - -static void SetupAIDirector() -{ - // Playlist->AISettings->bAllowAIDirector - - auto GameState = Cast(GetWorld()->GetGameState()); - auto GameMode = Cast(GetWorld()->GetGameMode()); - - static auto AIDirectorClass = FindObject(L"/Script/FortniteGame.AthenaAIDirector"); // Probably wrong class - - if (!AIDirectorClass) - return; - - static auto AIDirectorOffset = GameMode->GetOffset("AIDirector"); - - LOG_INFO(LogDev, "AIDirector Before: {}", __int64(GameMode->Get(AIDirectorOffset))); - - if (!GameMode->Get(AIDirectorOffset)) - GameMode->Get(AIDirectorOffset) = GetWorld()->SpawnActor(AIDirectorClass); - - if (GameMode->Get(AIDirectorOffset)) - { - LOG_INFO(LogAI, "Successfully spawned AIDirector!"); - - // we have to set so much more from data tables.. - - static auto OurEncounterClass = FindObject(L"/Script/FortniteGame.FortAIEncounterInfo"); // ??? - static auto BaseEncounterClassOffset = GameMode->Get(AIDirectorOffset)->GetOffset("BaseEncounterClass"); - - GameMode->Get(AIDirectorOffset)->Get(BaseEncounterClassOffset) = OurEncounterClass; - - static auto ActivateFn = FindObject(L"/Script/FortniteGame.FortAIDirector.Activate"); - - if (ActivateFn) // ? - GameMode->Get(AIDirectorOffset)->ProcessEvent(ActivateFn); // ? - } -} - -static void SetupNavConfig(const FName& AgentName) -{ - static auto AthenaNavSystemConfigOverrideClass = FindObject(L"/Script/FortniteGame.AthenaNavSystemConfigOverride"); - auto NavSystemOverride = GetWorld()->SpawnActor(AthenaNavSystemConfigOverrideClass); - - if (!NavSystemOverride) - return; - - static auto AthenaNavSystemConfigClass = FindObject(L"/Script/FortniteGame.AthenaNavSystemConfig"); - auto AthenaNavConfig = (UAthenaNavSystemConfig*)UGameplayStatics::SpawnObject(AthenaNavSystemConfigClass, NavSystemOverride); - AthenaNavConfig->Get("bUseBuildingGridAsNavigableSpace") = false; - - static auto bUsesStreamedInNavLevelOffset = AthenaNavConfig->GetOffset("bUsesStreamedInNavLevel", false); - - if (bUsesStreamedInNavLevelOffset != -1) - AthenaNavConfig->Get(bUsesStreamedInNavLevelOffset) = true; - - AthenaNavConfig->Get("bAllowAutoRebuild") = true; - AthenaNavConfig->Get("bCreateOnClient") = true; // BITFIELD - AthenaNavConfig->Get("bAutoSpawnMissingNavData") = true; // BITFIELD - AthenaNavConfig->Get("bSpawnNavDataInNavBoundsLevel") = true; // BITFIELD - - static auto bUseNavigationInvokersOffset = AthenaNavConfig->GetOffset("bUseNavigationInvokers", false); - - if (bUseNavigationInvokersOffset != -1) - AthenaNavConfig->Get(bUseNavigationInvokersOffset) = false; - - static auto DefaultAgentNameOffset = AthenaNavConfig->GetOffset("DefaultAgentName", false); - - if (DefaultAgentNameOffset != -1) - AthenaNavConfig->Get(DefaultAgentNameOffset) = AgentName; - - // NavSystemOverride->Get("OverridePolicy") = ENavSystemOverridePolicy::Append; - NavSystemOverride->Get("NavigationSystemConfig") = AthenaNavConfig; - - SetNavigationSystem(NavSystemOverride); -} - -static AFortPlayerPawn* SpawnAIFromCustomizationData(const FVector& Location, UFortAthenaAIBotCustomizationData* CustomizationData) -{ - static auto PawnClassOffset = CustomizationData->GetOffset("PawnClass"); - auto PawnClass = CustomizationData->Get(PawnClassOffset); - - if (!PawnClass) - { - LOG_INFO(LogAI, "Invalid PawnClass for AI!"); - return nullptr; - } - - auto Pawn = GetWorld()->SpawnActor(PawnClass, Location); - - if (!Pawn) - { - LOG_INFO(LogAI, "Failed to spawn pawn!"); - return nullptr; - } - - auto Controller = Pawn->GetController(); - - if (!Controller) - { - LOG_INFO(LogAI, "No controller!"); - Pawn->K2_DestroyActor(); - return nullptr; - } - - auto PlayerState = Controller->GetPlayerState(); - - if (!PlayerState) - { - LOG_INFO(LogAI, "No PlayerState!"); - Controller->K2_DestroyActor(); - Pawn->K2_DestroyActor(); - return nullptr; - } - - static auto CharacterCustomizationOffset = CustomizationData->GetOffset("CharacterCustomization"); - auto CharacterCustomization = CustomizationData->Get(CharacterCustomizationOffset); - auto CharacterCustomizationLoadoutOffset = CharacterCustomization->GetOffset("CustomizationLoadout"); - auto CharacterCustomizationLoadout = CharacterCustomization->GetPtr(CharacterCustomizationLoadoutOffset); - auto CharacterToApply = CharacterCustomizationLoadout->GetCharacter(); - - ApplyCID(Pawn, CharacterToApply, true); // bruhh - - struct FItemAndCount - { - int Count; // 0x0000(0x0004) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - unsigned char UnknownData00[0x4]; // 0x0004(0x0004) MISSED OFFSET - UFortItemDefinition* Item; // 0x0008(0x0008) (Edit, BlueprintVisible, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - }; - - static auto StartupInventoryOffset = CustomizationData->GetOffset("StartupInventory"); - auto StartupInventory = CustomizationData->Get(StartupInventoryOffset); - static auto StartupInventoryItemsOffset = StartupInventory->GetOffset("Items"); - - std::vector> ItemsToGrant; - - if (Fortnite_Version < 13) - { - auto& StartupInventoryItems = StartupInventory->Get>(StartupInventoryItemsOffset); - - for (int i = 0; i < StartupInventoryItems.Num(); ++i) - { - ItemsToGrant.push_back({ StartupInventoryItems.at(i), 1 }); - } - } - else - { - auto& StartupInventoryItems = StartupInventory->Get>(StartupInventoryItemsOffset); - - for (int i = 0; i < StartupInventoryItems.Num(); ++i) - { - ItemsToGrant.push_back({ StartupInventoryItems.at(i).Item, StartupInventoryItems.at(i).Count }); - } - } - - static auto InventoryOffset = Controller->GetOffset("Inventory"); - auto Inventory = Controller->Get(InventoryOffset); - - if (Inventory) - { - for (int i = 0; i < ItemsToGrant.size(); ++i) - { - auto pair = Inventory->AddItem(ItemsToGrant.at(i).first, nullptr, ItemsToGrant.at(i).second); - - LOG_INFO(LogDev, "pair.first.size(): {}", pair.first.size()); - - if (pair.first.size() > 0) - { - if (auto weaponDef = Cast(ItemsToGrant.at(i).first)) - Pawn->EquipWeaponDefinition(weaponDef, pair.first.at(0)->GetItemEntry()->GetItemGuid()); - } - } - - Inventory->Update(); - } - - static auto BotNameSettingsOffset = CustomizationData->GetOffset("BotNameSettings"); - auto BotNameSettings = CustomizationData->Get(BotNameSettingsOffset); - - FString Name; - - if (BotNameSettings) - { - static int CurrentId = 0; // scuffed! - static auto DisplayNameOffset = FindOffsetStruct("/Script/FortniteGame.FortItemDefinition", "DisplayName"); - - switch (BotNameSettings->GetNamingMode()) - { - case EBotNamingMode::Custom: - Name = UKismetTextLibrary::Conv_TextToString(BotNameSettings->GetOverrideName()); - break; - case EBotNamingMode::SkinName: - Name = CharacterToApply ? UKismetTextLibrary::Conv_TextToString(*(FText*)(__int64(CharacterCustomizationLoadout->GetCharacter()) + DisplayNameOffset)) : L"InvalidCharacter"; - Name.Set((std::wstring(Name.Data.Data) += std::to_wstring(CurrentId++)).c_str()); - break; - default: - Name = L"Unknown"; - break; - } - } - - if (Name.Data.Data && Name.Data.Num() > 0) - { - Controller->ServerChangeName(Name); - } - - return Pawn; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/anticheat.h b/dependencies/reboot/Project Reboot 3.0/anticheat.h deleted file mode 100644 index 3a5066c..0000000 --- a/dependencies/reboot/Project Reboot 3.0/anticheat.h +++ /dev/null @@ -1,53 +0,0 @@ -// I don't even know what this is. - -#pragma once - -#include "inc.h" -#include -#include "Object.h" - -enum class Severity -{ - LOW, // Could be commonly false, most likely due to lag. - MEDIUM, // Extreme rare cases this is a false. - HIGH // Not possible to be false, only happens with modification of client. -}; - -class AnticheatComponent -{ -public: - UObject* Owner; - int AmountOfLowWarnings; - int AmountOfMediumWarnings; - int AmountOfHighWarnings; - - void Kick() - { - - } - - bool IsCheater() - { - if (AmountOfHighWarnings >= 3) - { - Kick(); - return true; - } - - return false; - } - - bool AddAndCheck(Severity severity) - { - if (severity == Severity::LOW) - AmountOfLowWarnings++; - if (severity == Severity::MEDIUM) - AmountOfMediumWarnings++; - if (severity == Severity::LOW) - AmountOfHighWarnings++; - - return IsCheater(); - } -}; - -// std::unordered_map AnticheatComponents; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/bots.h b/dependencies/reboot/Project Reboot 3.0/bots.h deleted file mode 100644 index fcf9e8a..0000000 --- a/dependencies/reboot/Project Reboot 3.0/bots.h +++ /dev/null @@ -1,397 +0,0 @@ -#pragma once - -#include "FortGameModeAthena.h" -#include "OnlineReplStructs.h" -#include "BuildingContainer.h" - -class BotPOI -{ - FVector CenterLocation; - FVector Range; // this just has to be FVector2D -}; - -class BotPOIEncounter -{ -public: - int NumChestsSearched; - int NumAmmoBoxesSearched; - int NumPlayersEncountered; -}; - -class PlayerBot -{ -public: - AController* Controller = nullptr; - BotPOIEncounter currentBotEncounter; - int TotalPlayersEncountered; - std::vector POIsTraveled; - float NextJumpTime = 1.0f; - - void OnPlayerEncountered() - { - currentBotEncounter.NumPlayersEncountered++; - TotalPlayersEncountered++; - } - - void MoveToNewPOI() - { - - } - - void Initialize(const FTransform& SpawnTransform) - { - auto GameState = Cast(GetWorld()->GetGameState()); - auto GameMode = Cast(GetWorld()->GetGameMode()); - - static UClass* PawnClass = nullptr; - static UClass* ControllerClass = nullptr; - - bool bUsePhoebeClasses = false; - - if (!PawnClass) - { - if (!bUsePhoebeClasses) - PawnClass = FindObject(L"/Game/Athena/PlayerPawn_Athena.PlayerPawn_Athena_C"); - else - PawnClass = FindObject(L"/Game/Athena/AI/Phoebe/BP_PlayerPawn_Athena_Phoebe.BP_PlayerPawn_Athena_Phoebe_C"); - } - - if (!ControllerClass) - { - if (!bUsePhoebeClasses) - ControllerClass = AFortPlayerControllerAthena::StaticClass(); - else - ControllerClass = FindObject(L"/Game/Athena/AI/Phoebe/BP_PhoebePlayerController.BP_PhoebePlayerController_C"); - } - - if (!ControllerClass || !PawnClass) - { - LOG_ERROR(LogBots, "Failed to find a class for the bots!"); - return; - } - - static auto FortAthenaAIBotControllerClass = FindObject(L"/Script/FortniteGame.FortAthenaAIBotController"); - - Controller = GetWorld()->SpawnActor(ControllerClass); - AFortPlayerPawnAthena* Pawn = GetWorld()->SpawnActor(PawnClass, SpawnTransform, CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn)); - AFortPlayerStateAthena* PlayerState = Cast(Controller->GetPlayerState()); - - if (!Pawn || !PlayerState) - return; - - bool bUseOverrideName = false; - - FString NewName; - - if (bUseOverrideName) - { - NewName = L"Override"; - } - else - { - static int CurrentBotNum = 1; - auto BotNumWStr = std::to_wstring(CurrentBotNum++); - NewName = (L"RebootBot" + BotNumWStr).c_str(); - } - - if (auto PlayerController = Cast(Controller)) - PlayerController->ServerChangeName(NewName); - - PlayerState->OnRep_PlayerName(); - - PlayerState->GetTeamIndex() = GameMode->Athena_PickTeamHook(GameMode, 0, Controller); - - static auto SquadIdOffset = PlayerState->GetOffset("SquadId", false); - - if (SquadIdOffset != -1) - PlayerState->GetSquadId() = PlayerState->GetTeamIndex() - NumToSubtractFromSquadId; - - GameState->AddPlayerStateToGameMemberInfo(PlayerState); - - PlayerState->SetIsBot(true); - - /* - - static auto FortRegisteredPlayerInfoClass = FindObject("/Script/FortniteGame.FortRegisteredPlayerInfo"); - static auto MyPlayerInfoOffset = PlayerController->GetOffset("MyPlayerInfo"); - PlayerController->Get(MyPlayerInfoOffset) = UGameplayStatics::SpawnObject(FortRegisteredPlayerInfoClass, PlayerController); - - if (!PlayerController->Get(MyPlayerInfoOffset)) - { - LOG_ERROR(LogBots, "Failed to spawn PlayerInfo!"); - - Pawn->K2_DestroyActor(); - PlayerController->K2_DestroyActor(); - return nullptr; - } - - auto& PlayerInfo = PlayerController->Get(MyPlayerInfoOffset); - - static auto UniqueIdOffset = PlayerState->GetOffset("UniqueId"); - static auto PlayerInfo_PlayerNameOffset = PlayerInfo->GetOffset("PlayerName"); - static auto PlayerIDOffset = PlayerInfo->GetOffset("PlayerID"); - PlayerInfo->GetPtr(PlayerIDOffset)->CopyFromAnotherUniqueId(PlayerState->GetPtr(UniqueIdOffset)); - PlayerInfo->Get(PlayerInfo_PlayerNameOffset) = PlayerState->GetPlayerName(); - - */ - - Controller->Possess(Pawn); - - Pawn->SetHealth(100); - Pawn->SetMaxHealth(100); - - AFortInventory** Inventory = nullptr; - - if (auto FortPlayerController = Cast(Controller)) - { - Inventory = &FortPlayerController->GetWorldInventory(); - } - else - { - if (Controller->IsA(FortAthenaAIBotControllerClass)) - { - static auto InventoryOffset = Controller->GetOffset("Inventory"); - Inventory = Controller->GetPtr(InventoryOffset); - } - } - - if (!Inventory) - { - LOG_ERROR(LogBots, "No inventory pointer!"); - - Pawn->K2_DestroyActor(); - Controller->K2_DestroyActor(); - return; - } - - FTransform InventorySpawnTransform{}; - - static auto FortInventoryClass = FindObject(L"/Script/FortniteGame.FortInventory"); // AFortInventory::StaticClass() - *Inventory = GetWorld()->SpawnActor(FortInventoryClass, InventorySpawnTransform, CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AlwaysSpawn, false, Controller)); - - if (!*Inventory) - { - LOG_ERROR(LogBots, "Failed to spawn Inventory!"); - - Pawn->K2_DestroyActor(); - Controller->K2_DestroyActor(); - return; - } - - (*Inventory)->GetInventoryType() = EFortInventoryType::World; - - if (auto FortPlayerController = Cast(Controller)) - { - static auto bHasInitializedWorldInventoryOffset = FortPlayerController->GetOffset("bHasInitializedWorldInventory"); - FortPlayerController->Get(bHasInitializedWorldInventoryOffset) = true; - } - - // if (false) - { - if (Inventory) - { - auto& StartingItems = GameMode->GetStartingItems(); - - for (int i = 0; i < StartingItems.Num(); ++i) - { - auto& StartingItem = StartingItems.at(i); - - (*Inventory)->AddItem(StartingItem.GetItem(), nullptr, StartingItem.GetCount()); - } - - if (auto FortPlayerController = Cast(Controller)) - { - UFortItem* PickaxeInstance = FortPlayerController->AddPickaxeToInventory(); - - if (PickaxeInstance) - { - FortPlayerController->ServerExecuteInventoryItemHook(FortPlayerController, PickaxeInstance->GetItemEntry()->GetItemGuid()); - } - } - - (*Inventory)->Update(); - } - } - - auto PlayerAbilitySet = GetPlayerAbilitySet(); - auto AbilitySystemComponent = PlayerState->GetAbilitySystemComponent(); - - if (PlayerAbilitySet) - { - PlayerAbilitySet->GiveToAbilitySystem(AbilitySystemComponent); - } - - // PlayerController->GetCosmeticLoadout()->GetCharacter() = FindObject("/Game/Athena/Items/Cosmetics/Characters/CID_263_Athena_Commando_F_MadCommander.CID_263_Athena_Commando_F_MadCommander"); - // Pawn->GetCosmeticLoadout()->GetCharacter() = PlayerController->GetCosmeticLoadout()->GetCharacter(); - - // PlayerController->ApplyCosmeticLoadout(); - - /* - - auto AllHeroTypes = GetAllObjectsOfClass(FindObject(L"/Script/FortniteGame.FortHeroType")); - std::vector AthenaHeroTypes; - - UFortItemDefinition* HeroType = FindObject(L"/Game/Athena/Heroes/HID_030_Athena_Commando_M_Halloween.HID_030_Athena_Commando_M_Halloween"); - - for (int i = 0; i < AllHeroTypes.size(); ++i) - { - auto CurrentHeroType = (UFortItemDefinition*)AllHeroTypes.at(i); - - if (CurrentHeroType->GetPathName().starts_with("/Game/Athena/Heroes/")) - AthenaHeroTypes.push_back(CurrentHeroType); - } - - if (AthenaHeroTypes.size()) - { - HeroType = AthenaHeroTypes.at(std::rand() % AthenaHeroTypes.size()); - } - - static auto HeroTypeOffset = PlayerState->GetOffset("HeroType"); - - if (HeroTypeOffset != -1) - PlayerState->Get(HeroTypeOffset) = HeroType; - - static auto OwningGameInstanceOffset = GetWorld()->GetOffset("OwningGameInstance"); - auto OwningGameInstance = GetWorld()->Get(OwningGameInstanceOffset); - - static auto RegisteredPlayersOffset = OwningGameInstance->GetOffset("RegisteredPlayers"); - auto& RegisteredPlayers = OwningGameInstance->Get>(RegisteredPlayersOffset); - - static auto FortRegisteredPlayerInfoClass = FindObject("/Script/FortniteGame.FortRegisteredPlayerInfo"); - - auto NewPlayerInfo = UGameplayStatics::SpawnObject(FortRegisteredPlayerInfoClass, Controller); - static auto PlayerIDOffset = NewPlayerInfo->GetOffset("PlayerID"); - - static auto UniqueIdOffset = PlayerState->GetOffset("UniqueId"); - auto PlayerStateUniqueId = PlayerState->GetPtr(UniqueIdOffset); - - NewPlayerInfo->GetPtr(PlayerIDOffset)->CopyFromAnotherUniqueId(PlayerStateUniqueId); - - static auto MyPlayerInfoOffset = Controller->GetOffset("MyPlayerInfo"); - Controller->Get(MyPlayerInfoOffset) = NewPlayerInfo; - - RegisteredPlayers.Add(NewPlayerInfo); - - ApplyHID(Pawn, HeroType, true); - - */ - - GameState->GetPlayersLeft()++; - GameState->OnRep_PlayersLeft(); - - if (auto FortPlayerControllerAthena = Cast(Controller)) - GameMode->GetAlivePlayers().Add(FortPlayerControllerAthena); - } -}; - -static inline std::vector AllPlayerBotsToTick; - -namespace Bots -{ - static AController* SpawnBot(FTransform SpawnTransform) - { - auto playerBot = PlayerBot(); - playerBot.Initialize(SpawnTransform); - AllPlayerBotsToTick.push_back(playerBot); - return playerBot.Controller; - } - - static void SpawnBotsAtPlayerStarts(int AmountOfBots) - { - return; - - auto GameState = Cast(GetWorld()->GetGameState()); - auto GameMode = Cast(GetWorld()->GetGameMode()); - - for (int i = 0; i < AmountOfBots; ++i) - { - FTransform SpawnTransform{}; - SpawnTransform.Translation = FVector(1, 1, 10000); - SpawnTransform.Rotation = FQuat(); - SpawnTransform.Scale3D = FVector(1, 1, 1); - - auto NewBot = SpawnBot(SpawnTransform); - auto PlayerStart = GameMode->K2_FindPlayerStart(NewBot, NewBot->GetPlayerState()->GetPlayerName()); // i dont think this works - - if (!PlayerStart) - { - LOG_ERROR(LogBots, "Failed to find PlayerStart for bot!"); - NewBot->GetPawn()->K2_DestroyActor(); - NewBot->K2_DestroyActor(); - continue; - } - - NewBot->TeleportTo(PlayerStart->GetActorLocation(), FRotator()); - NewBot->SetCanBeDamaged(Fortnite_Version < 7); // idk lol for spawn island - } - } - - static void Tick() - { - if (AllPlayerBotsToTick.size() == 0) - return; - - auto GameState = Cast(GetWorld()->GetGameState()); - auto GameMode = Cast(GetWorld()->GetGameMode()); - - // auto AllBuildingContainers = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ABuildingContainer::StaticClass()); - - // for (int i = 0; i < GameMode->GetAlivePlayers().Num(); ++i) - for (auto& PlayerBot : AllPlayerBotsToTick) - { - auto CurrentPlayer = PlayerBot.Controller; - - if (CurrentPlayer->IsActorBeingDestroyed()) - continue; - - auto CurrentPawn = CurrentPlayer->GetPawn(); - - auto CurrentPlayerState = Cast(CurrentPlayer->GetPlayerState()); - - if (!CurrentPlayerState || !CurrentPlayerState->IsBot()) - continue; - - if (GameState->GetGamePhase() == EAthenaGamePhase::Warmup) - { - /* if (!CurrentPlayer->IsPlayingEmote()) - { - static auto AthenaDanceItemDefinitionClass = FindObject("/Script/FortniteGame.AthenaDanceItemDefinition"); - auto RandomDanceID = GetRandomObjectOfClass(AthenaDanceItemDefinitionClass); - - CurrentPlayer->ServerPlayEmoteItemHook(CurrentPlayer, RandomDanceID); - } */ - } - - if (CurrentPlayerState->IsInAircraft() && !CurrentPlayerState->HasThankedBusDriver()) - { - static auto ServerThankBusDriverFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerThankBusDriver"); - CurrentPlayer->ProcessEvent(ServerThankBusDriverFn); - } - - if (CurrentPawn) - { - if (PlayerBot.NextJumpTime <= UGameplayStatics::GetTimeSeconds(GetWorld())) - { - static auto JumpFn = FindObject(L"/Script/Engine.Character.Jump"); - - CurrentPawn->ProcessEvent(JumpFn); - PlayerBot.NextJumpTime = UGameplayStatics::GetTimeSeconds(GetWorld()) + (rand() % 4 + 3); - } - } - - /* bool bShouldJumpFromBus = CurrentPlayerState->IsInAircraft(); // TODO (Milxnor) add a random percent thing - - if (bShouldJumpFromBus) - { - CurrentPlayer->ServerAttemptAircraftJumpHook(CurrentPlayer, FRotator()); - } */ - } - - // AllBuildingContainers.Free(); - } -} - -namespace Bosses -{ - -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/builder.h b/dependencies/reboot/Project Reboot 3.0/builder.h deleted file mode 100644 index ccc31b1..0000000 --- a/dependencies/reboot/Project Reboot 3.0/builder.h +++ /dev/null @@ -1,148 +0,0 @@ -#pragma once - -#include -#include - -#include - -#include "FortVolume.h" -#include "FortGameStateAthena.h" - -namespace fs = std::filesystem; - -namespace Builder -{ - static inline bool LoadSave(const std::string& SaveFileName, const FVector& Location, const FRotator& Rotation) - { - auto GameState = Cast(GetWorld()->GetGameState()); - - std::ifstream fileStream(fs::current_path().string() + "\\Islands\\" + SaveFileName + ".save"); - - if (!fileStream.is_open()) - { - // SendMessageToConsole(PlayerController, L"Failed to open filestream (file may not exist)!\n"); - return false; - } - - nlohmann::json j; - fileStream >> j; - - for (const auto& obj : j) { - for (auto it = obj.begin(); it != obj.end(); ++it) { - auto& ClassName = it.key(); - auto Class = FindObject(ClassName); - - if (!Class) - { - continue; - } - - std::vector stuff; - - auto& value = it.value(); - - std::vector DevicePropertiesStr; - - if (value.is_array()) { - for (const auto& elem : value) { - if (!elem.is_array()) - { - stuff.push_back(elem); - } - else // Device Properties - { - for (const auto& elem2 : elem) { - for (auto it2 = elem2.begin(); it2 != elem2.end(); ++it2) { - auto& value2z = it2.value(); - DevicePropertiesStr.push_back(value2z); - } - } - } - } - } - else - { - - } - - // std::cout << "stuff.size(): " << stuff.size() << '\n'; - - if (stuff.size() >= 8) - { - FRotator rot{}; - rot.Pitch = stuff[3] + Rotation.Pitch; - rot.Roll = stuff[4] + Rotation.Roll; - rot.Yaw = stuff[5] + Rotation.Yaw; - - FVector Scale3D = { 1, 1, 1 }; - - if (stuff.size() >= 11) - { - Scale3D.X = stuff[8]; - Scale3D.Y = stuff[9]; - Scale3D.Z = stuff[10]; - } - - auto NewActor = GetWorld()->SpawnActor(Class, FVector{ stuff[0] + Location.X , stuff[1] + Location.Y, stuff[2] + Location.Z }, - rot.Quaternion(), Scale3D); - - if (!NewActor) - continue; - - // NewActor->bCanBeDamaged = false; - NewActor->InitializeBuildingActor(NewActor, nullptr, false); - // NewActor->GetTeamIndex() = stuff[6]; - // NewActor->SetHealth(stuff[7]); - - static auto FortActorOptionsComponentClass = FindObject(L"/Script/FortniteGame.FortActorOptionsComponent"); - auto ActorOptionsComponent = FortActorOptionsComponentClass ? NewActor->GetComponentByClass(FortActorOptionsComponentClass) : nullptr; - - // continue; - - /* - if (ActorOptionsComponent) - { - // UE::TMap Map{}; - - TArray PropertyNameStrs; - - for (int kl = 0; kl < DevicePropertiesStr.size(); kl += 2) - { - if (kl + 1 >= DevicePropertiesStr.size()) - break; - - auto PropertyName = DevicePropertiesStr[kl]; - auto PropertyData = DevicePropertiesStr[kl + 1]; - - LOG_INFO(LogCreative, "PropertyName: {}", PropertyName); - LOG_INFO(LogCreative, "PropertyData: {}", PropertyData); - - PropertyNameStrs.Add(std::wstring(PropertyName.begin(), PropertyName.end()).c_str()); - } - - for (int jk = 0; jk < PropertyNameStrs.size(); jk++) - { - LOG_INFO(LogCreative, "[{}] PropertyName: {}", jk, PropertyNameStrs.at(jk).ToString()); - } - } - */ - } - } - } - - return true; - } - - static inline bool LoadSave(const std::string& SaveFileName, AFortVolume* LoadIntoVolume) - { - /* auto AllBuildingActors = LoadIntoVolume->GetActorsWithinVolumeByClass(ABuildingActor::StaticClass()); - - for (int i = 0; i < AllBuildingActors.Num(); ++i) - { - auto CurrentBuildingActor = (ABuildingActor*)AllBuildingActors[i]; - CurrentBuildingActor->SilentDie(); - } */ - - return LoadSave(SaveFileName, LoadIntoVolume->GetActorLocation(), LoadIntoVolume->GetActorRotation()); - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/calendar.h b/dependencies/reboot/Project Reboot 3.0/calendar.h deleted file mode 100644 index c5d9065..0000000 --- a/dependencies/reboot/Project Reboot 3.0/calendar.h +++ /dev/null @@ -1,90 +0,0 @@ -#pragma once - -#include "reboot.h" -#include "GameplayStatics.h" -#include "FortGameStateAthena.h" - -namespace Calendar -{ - static inline bool HasSnowModification() - { - return Fortnite_Version == 7.30 || Fortnite_Version == 11.31 || Fortnite_Version == 19.10; - } - - static inline UObject* GetSnowSetup() - { - auto Class = FindObject(L"/Game/Athena/Environments/Landscape/Blueprints/BP_SnowSetup.BP_SnowSetup_C") ? FindObject(L"/Game/Athena/Environments/Landscape/Blueprints/BP_SnowSetup.BP_SnowSetup_C") : - FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C"); - - auto Actors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), Class); - - return Actors.Num() > 0 ? Actors.at(0) : nullptr; - } - - static inline float GetFullSnowMapValue() - { - if (Fortnite_Version == 7.30) - { - std::vector> TimeAndValues = { { 0, 1.2f}, { 0.68104035f, 4.6893263f }, { 0.9632137f, 10.13335f }, { 1.0f, 15.0f } }; - // 1.2 - // 4.6893263 - // 10.13335 - // 15; - return TimeAndValues[3].first; - } - else if (Fortnite_Version == 11.31) - { - return 100; - } - - return -1; - } - - static inline void SetSnow(float NewValue) - { - static auto SetSnowFn = FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.OnReady_0A511B314AE165C51798519FB84738B8") ? FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.OnReady_0A511B314AE165C51798519FB84738B8") : - FindObject(L"/Game/Athena/Environments/Landscape/Blueprints/BP_SnowSetup.BP_SnowSetup_C.SetSnow"); - auto SnowSetup = GetSnowSetup(); - - LOG_INFO(LogDev, "SnowSetup: {}", SnowSetup->IsValidLowLevel() ? SnowSetup->GetFullName() : "BadRead"); - - if (SnowSetup && SetSnowFn) - { - auto GameState = (AFortGameStateAthena*)GetWorld()->GetGameState(); - - GET_PLAYLIST(GameState) - struct { UObject* GameState; UObject* Playlist; FGameplayTagContainer PlaylistContextTags; } OnReadyParams{ GameState, CurrentPlaylist, FGameplayTagContainer()}; - - UFunction* OnReadyFunc = FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.OnReady_0A511B314AE165C51798519FB84738B8"); - - LOG_INFO(LogDev, "Calling OnReady!"); - - if (OnReadyFunc) - { - SnowSetup->ProcessEvent(OnReadyFunc, &OnReadyParams); - } - - LOG_INFO(LogDev, "Called OnReady!"); - - return; - - if (NewValue != -1) - { - static auto SnowAmountOffset = SnowSetup->GetOffset("SnowAmount"); - SnowSetup->Get(SnowAmountOffset) = NewValue; - - static auto OnRep_Snow_AmountFn = FindObject("/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.OnRep_Snow_Amount"); - SnowSetup->ProcessEvent(OnRep_Snow_AmountFn); - - // SnowSetup->ProcessEvent(SetSnowFn, &NewValue); - } - - auto SetFallingSnowFn = FindObject("/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.SetFallingSnow"); - - LOG_INFO(LogDev, "Called SetSnow!"); - - static auto ada = FindObject(L"/Game/Athena/Apollo/Environments/Blueprints/CalendarEvents/BP_ApolloSnowSetup.BP_ApolloSnowSetup_C.SetFullSnowEd"); - SnowSetup->ProcessEvent(ada); - } - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/commands.cpp b/dependencies/reboot/Project Reboot 3.0/commands.cpp deleted file mode 100644 index 89f6fed..0000000 --- a/dependencies/reboot/Project Reboot 3.0/commands.cpp +++ /dev/null @@ -1,952 +0,0 @@ -#include "commands.h" - -void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) -{ - if (!Msg.Data.Data || Msg.Data.Num() <= 0) - return; - - auto PlayerState = Cast(PlayerController->GetPlayerState()); - - // std::cout << "aa!\n"; - - if (!PlayerState || !IsOperator(PlayerState, PlayerController)) - return; - - std::vector Arguments; - auto OldMsg = Msg.ToString(); - - auto ReceivingController = PlayerController; // for now - auto ReceivingPlayerState = PlayerState; // for now - - auto firstBackslash = OldMsg.find_first_of("\\"); - auto lastBackslash = OldMsg.find_last_of("\\"); - - static auto World_NetDriverOffset = GetWorld()->GetOffset("NetDriver"); - auto WorldNetDriver = GetWorld()->Get(World_NetDriverOffset); - auto& ClientConnections = WorldNetDriver->GetClientConnections(); - - if (firstBackslash != std::string::npos && lastBackslash != std::string::npos) - { - if (firstBackslash != lastBackslash) - { - std::string player = OldMsg; - - player = player.substr(firstBackslash + 1, lastBackslash - firstBackslash - 1); - - for (int i = 0; i < ClientConnections.Num(); ++i) - { - static auto PlayerControllerOffset = ClientConnections.at(i)->GetOffset("PlayerController"); - auto CurrentPlayerController = Cast(ClientConnections.at(i)->Get(PlayerControllerOffset)); - - if (!CurrentPlayerController) - continue; - - auto CurrentPlayerState = Cast(CurrentPlayerController->GetPlayerState()); - - if (!CurrentPlayerState) - continue; - - FString PlayerName = CurrentPlayerState->GetPlayerName(); - - if (PlayerName.ToString() == player) // hopefully we arent on adifferent thread - { - ReceivingController = CurrentPlayerController; - ReceivingPlayerState = CurrentPlayerState; - PlayerName.Free(); - break; - } - - PlayerName.Free(); - } - } - else - { - // SendMessageToConsole(PlayerController, L"Warning: You have a backslash but no ending backslash, was this by mistake? Executing on you."); - } - } - - if (!ReceivingController || !ReceivingPlayerState) - { - SendMessageToConsole(PlayerController, L"Unable to find player!"); - return; - } - - { - auto Message = Msg.ToString(); - - size_t start = Message.find('\\'); - - while (start != std::string::npos) // remove the playername - { - size_t end = Message.find('\\', start + 1); - - if (end == std::string::npos) - break; - - Message.replace(start, end - start + 2, ""); - start = Message.find('\\'); - } - - int zz = 0; - - // std::cout << "Message Before: " << Message << '\n'; - - while (Message.find(" ") != std::string::npos) - { - auto arg = Message.substr(0, Message.find(' ')); - Arguments.push_back(arg); - // std::cout << std::format("[{}] {}\n", zz, arg); - Message.erase(0, Message.find(' ') + 1); - zz++; - } - - // if (zz == 0) - { - Arguments.push_back(Message); - // std::cout << std::format("[{}] {}\n", zz, Message); - zz++; - } - - // std::cout << "Message After: " << Message << '\n'; - } - - auto NumArgs = Arguments.size() == 0 ? 0 : Arguments.size() - 1; - - // std::cout << "NumArgs: " << NumArgs << '\n'; - - // return; - - bool bSendHelpMessage = false; - - if (Arguments.size() >= 1) - { - auto& Command = Arguments[0]; - std::transform(Command.begin(), Command.end(), Command.begin(), ::tolower); - - if (Command == "giveitem") - { - if (NumArgs < 1) - { - SendMessageToConsole(PlayerController, L"Please provide a WID!"); - return; - } - - auto WorldInventory = ReceivingController->GetWorldInventory(); - - if (!WorldInventory) - { - SendMessageToConsole(PlayerController, L"No world inventory!"); - return; - } - - auto& weaponName = Arguments[1]; - int count = 1; - - try - { - if (NumArgs >= 2) - count = std::stoi(Arguments[2]); - } - catch (...) - { - } - - // LOG_INFO(LogDev, "weaponName: {}", weaponName); - - auto WID = Cast(FindObject(weaponName, nullptr, ANY_PACKAGE)); - - if (!WID) - { - SendMessageToConsole(PlayerController, L"Invalid WID!"); - return; - } - - bool bShouldUpdate = false; - WorldInventory->AddItem(WID, &bShouldUpdate, count); - - if (bShouldUpdate) - WorldInventory->Update(); - - SendMessageToConsole(PlayerController, L"Granted item!"); - } - else if (Command == "printsimulatelootdrops") - { - if (NumArgs < 1) - { - SendMessageToConsole(PlayerController, L"Please provide a LootTierGroup!"); - return; - } - - auto& lootTierGroup = Arguments[1]; - - auto LootDrops = PickLootDrops(UKismetStringLibrary::Conv_StringToName(std::wstring(lootTierGroup.begin(), lootTierGroup.end()).c_str()), -1, true); - - for (int i = 0; i < LootDrops.size(); ++i) - { - - } - - SendMessageToConsole(PlayerController, L"Printed!"); - } - /* else if (Command == "debugattributes") - { - auto AbilitySystemComponent = ReceivingPlayerState->GetAbilitySystemComponent(); - - if (!AbilitySystemComponent) - { - SendMessageToConsole(PlayerController, L"No AbilitySystemComponent!"); - return; - } - - SendMessageToConsole(PlayerController, (L"AbilitySystemComponent->GetSpawnedAttributes().Num(): " + std::to_wstring(AbilitySystemComponent->GetSpawnedAttributes().Num())).c_str()); - - for (int i = 0; i < AbilitySystemComponent->GetSpawnedAttributes().Num(); ++i) - { - auto CurrentAttributePathName = AbilitySystemComponent->GetSpawnedAttributes().at(i)->GetPathName(); - SendMessageToConsole(PlayerController, (L"SpawnedAttribute Name: " + std::wstring(CurrentAttributePathName.begin(), CurrentAttributePathName.end())).c_str()); - } - } - else if (Command == "debugcurrentitem") - { - auto Pawn = ReceivingController->GetMyFortPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn!"); - return; - } - - auto CurrentWeapon = Pawn->GetCurrentWeapon(); - - if (!CurrentWeapon) - { - SendMessageToConsole(PlayerController, L"No CurrentWeapon!"); - return; - } - - auto WorldInventory = ReceivingController->GetWorldInventory(); - - if (!CurrentWeapon) - { - SendMessageToConsole(PlayerController, L"No WorldInventory!"); - return; - } - - auto ItemInstance = WorldInventory->FindItemInstance(CurrentWeapon->GetItemEntryGuid()); - auto ReplicatedEntry = WorldInventory->FindReplicatedEntry(CurrentWeapon->GetItemEntryGuid()); - - if (!ItemInstance) - { - SendMessageToConsole(PlayerController, L"Failed to find ItemInstance!"); - return; - } - - if (!ReplicatedEntry) - { - SendMessageToConsole(PlayerController, L"Failed to find ReplicatedEntry!"); - return; - } - - SendMessageToConsole(PlayerController, (L"ReplicatedEntry->GetGenericAttributeValues().Num(): " + std::to_wstring(ReplicatedEntry->GetGenericAttributeValues().Num())).c_str()); - SendMessageToConsole(PlayerController, (L"ReplicatedEntry->GetStateValues().Num(): " + std::to_wstring(ReplicatedEntry->GetStateValues().Num())).c_str()); - - for (int i = 0; i < ReplicatedEntry->GetStateValues().Num(); ++i) - { - SendMessageToConsole(PlayerController, (L"[{}] StateValue Type: " - + std::to_wstring((int)ReplicatedEntry->GetStateValues().at(i, FFortItemEntryStateValue::GetStructSize()).GetStateType())).c_str() - ); - } - } */ - else if (Command == "op") - { - if (ReceivingController == PlayerController) - { - SendMessageToConsole(PlayerController, L"You can't op yourself!"); - return; - } - - if (IsOp(ReceivingController)) - { - SendMessageToConsole(PlayerController, L"Player is already operator!"); - return; - } - - Op(ReceivingController); - SendMessageToConsole(PlayerController, L"Granted operator to player!"); - } - else if (Command == "deop") - { - if (!IsOp(ReceivingController)) - { - SendMessageToConsole(PlayerController, L"Player is not operator!"); - return; - } - - Deop(ReceivingController); - SendMessageToConsole(PlayerController, L"Removed operator from player!"); - } - else if (Command == "setpickaxe") - { - if (NumArgs < 1) - { - SendMessageToConsole(PlayerController, L"Please provide a pickaxe!"); - return; - } - - if (Fortnite_Version < 3) // Idk why but emptyslot kicks the player because of the validate. - { - SendMessageToConsole(PlayerController, L"Not supported on this version!"); - return; - } - - auto WorldInventory = ReceivingController->GetWorldInventory(); - - if (!WorldInventory) - { - SendMessageToConsole(PlayerController, L"No world inventory!"); - return; - } - - auto& pickaxeName = Arguments[1]; - static auto AthenaPickaxeItemDefinitionClass = FindObject(L"/Script/FortniteGame.AthenaPickaxeItemDefinition"); - - auto Pickaxe1 = FindObject(pickaxeName + "." + pickaxeName, nullptr, ANY_PACKAGE); - - UFortWeaponMeleeItemDefinition* NewPickaxeItemDefinition = nullptr; - - if (Pickaxe1) - { - if (Pickaxe1->IsA(AthenaPickaxeItemDefinitionClass)) - { - static auto WeaponDefinitionOffset = Pickaxe1->GetOffset("WeaponDefinition"); - NewPickaxeItemDefinition = Pickaxe1->Get(WeaponDefinitionOffset); - } - else - { - NewPickaxeItemDefinition = Cast(Pickaxe1); - } - } - - if (!NewPickaxeItemDefinition) - { - SendMessageToConsole(PlayerController, L"Invalid pickaxe item definition!"); - return; - } - - auto PickaxeInstance = WorldInventory->GetPickaxeInstance(); - - if (PickaxeInstance) - { - WorldInventory->RemoveItem(PickaxeInstance->GetItemEntry()->GetItemGuid(), nullptr, PickaxeInstance->GetItemEntry()->GetCount(), true); - } - - WorldInventory->AddItem(NewPickaxeItemDefinition, nullptr, 1); - WorldInventory->Update(); - - SendMessageToConsole(PlayerController, L"Successfully set pickaxe!"); - } - else if (Command == "load") - { - if (!Globals::bCreative) - { - SendMessageToConsole(PlayerController, L"It is not creative!"); - return; - } - - static auto CreativePlotLinkedVolumeOffset = ReceivingController->GetOffset("CreativePlotLinkedVolume", false); - auto Volume = CreativePlotLinkedVolumeOffset == -1 ? nullptr : ReceivingController->GetCreativePlotLinkedVolume(); - - if (Arguments.size() <= 1) - { - SendMessageToConsole(PlayerController, L"Please provide a filename!\n"); - return; - } - - std::string FileName = "islandSave"; - - try { FileName = Arguments[1]; } - catch (...) {} - - float X{ -1 }, Y{ -1 }, Z{ -1 }; - - if (Arguments.size() >= 4) - { - try { X = std::stof(Arguments[2]); } - catch (...) {} - try { Y = std::stof(Arguments[3]); } - catch (...) {} - try { Z = std::stof(Arguments[4]); } - catch (...) {} - } - else - { - if (!Volume) - { - SendMessageToConsole(PlayerController, L"They do not have an island!"); - return; - } - } - - if (X != -1 && Y != -1 && Z != -1) // omg what if they want to spawn it at -1 -1 -1!!! - Builder::LoadSave(FileName, FVector(X, Y, Z), FRotator()); - else - Builder::LoadSave(FileName, Volume); - - SendMessageToConsole(PlayerController, L"Loaded!"); - } - else if (Command == "spawnpickup") - { - if (NumArgs < 1) - { - SendMessageToConsole(PlayerController, L"Please provide a WID!"); - return; - } - - auto Pawn = ReceivingController->GetMyFortPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn!"); - return; - } - - auto& weaponName = Arguments[1]; - int count = 1; - int amount = 1; - - try - { - if (NumArgs >= 2) - count = std::stoi(Arguments[2]); - if (NumArgs >= 3) - amount = std::stoi(Arguments[3]); - } - catch (...) - { - } - - constexpr int Max = 100; - - if (amount > Max) - { - SendMessageToConsole(PlayerController, (std::wstring(L"You went over the limit! Only spawning ") + std::to_wstring(Max) + L".").c_str()); - amount = Max; - } - - // LOG_INFO(LogDev, "weaponName: {}", weaponName); - - auto WID = Cast(FindObject(weaponName, nullptr, ANY_PACKAGE)); - - if (!WID) - { - SendMessageToConsole(PlayerController, L"Invalid WID!"); - return; - } - - auto Location = Pawn->GetActorLocation(); - - auto GameState = Cast(GetWorld()->GetGameState()); - - PickupCreateData CreateData; - CreateData.ItemEntry = FFortItemEntry::MakeItemEntry(WID, count, -1, MAX_DURABILITY, WID->GetFinalLevel(GameState->GetWorldLevel())); - CreateData.SpawnLocation = Location; - CreateData.bShouldFreeItemEntryWhenDeconstructed = true; - - for (int i = 0; i < amount; i++) - { - AFortPickup::SpawnPickup(CreateData); - } - } - else if (Command == "listplayers") - { - std::string PlayerNames; - - for (int i = 0; i < ClientConnections.Num(); i++) - { - static auto PlayerControllerOffset = ClientConnections.at(i)->GetOffset("PlayerController"); - auto CurrentPlayerController = Cast(ClientConnections.at(i)->Get(PlayerControllerOffset)); - - if (!CurrentPlayerController) - continue; - - auto CurrentPlayerState = Cast(CurrentPlayerController->GetPlayerState()); - - if (!CurrentPlayerState->IsValidLowLevel()) - continue; - - PlayerNames += "\"" + CurrentPlayerState->GetPlayerName().ToString() + "\" "; - } - - SendMessageToConsole(PlayerController, std::wstring(PlayerNames.begin(), PlayerNames.end()).c_str()); - } - else if (Command == "launch") - { - if (Arguments.size() <= 3) - { - SendMessageToConsole(PlayerController, L"Please provide X, Y, and Z!\n"); - return; - } - - float X{}, Y{}, Z{}; - - try { X = std::stof(Arguments[1]); } - catch (...) {} - try { Y = std::stof(Arguments[2]); } - catch (...) {} - try { Z = std::stof(Arguments[3]); } - catch (...) {} - - auto Pawn = ReceivingController->GetMyFortPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn to teleport!"); - return; - } - - static auto LaunchCharacterFn = FindObject(L"/Script/Engine.Character.LaunchCharacter"); - - struct - { - FVector LaunchVelocity; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bXYOverride; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - bool bZOverride; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } ACharacter_LaunchCharacter_Params{ FVector(X, Y, Z), false, false }; - Pawn->ProcessEvent(LaunchCharacterFn, &ACharacter_LaunchCharacter_Params); - - SendMessageToConsole(PlayerController, L"Launched character!"); - } - else if (Command == "setshield") - { - auto Pawn = ReceivingController->GetMyFortPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn!"); - return; - } - - float Shield = 0.f; - - if (NumArgs >= 1) - { - try { Shield = std::stof(Arguments[1]); } - catch (...) {} - } - - Pawn->SetShield(Shield); - SendMessageToConsole(PlayerController, L"Set shield!\n"); - } - else if (Command == "god") - { - auto Pawn = ReceivingController->GetMyFortPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn!"); - return; - } - - Pawn->SetCanBeDamaged(!Pawn->CanBeDamaged()); - SendMessageToConsole(PlayerController, std::wstring(L"God set to " + std::to_wstring(!(bool)Pawn->CanBeDamaged())).c_str()); - } - else if (Command == "applycid") - { - auto PlayerState = Cast(ReceivingController->GetPlayerState()); - - if (!PlayerState) // ??? - { - SendMessageToConsole(PlayerController, L"No playerstate!"); - return; - } - - auto Pawn = Cast(ReceivingController->GetMyFortPawn()); - - std::string CIDStr = Arguments[1]; - auto CIDDef = FindObject(CIDStr, nullptr, ANY_PACKAGE); - // auto CIDDef = UObject::FindObject(CIDStr); - - if (!CIDDef) - { - SendMessageToConsole(PlayerController, L"Invalid character item definition!"); - return; - } - - LOG_INFO(LogDev, "Applying {}", CIDDef->GetFullName()); - - if (!ApplyCID(Pawn, CIDDef)) - { - SendMessageToConsole(PlayerController, L"Failed while applying skin! Please check the server log."); - return; - } - - SendMessageToConsole(PlayerController, L"Applied CID!"); - } - else if (Command == "suicide") - { - static auto ServerSuicideFn = FindObject("/Script/FortniteGame.FortPlayerController.ServerSuicide"); - ReceivingController->ProcessEvent(ServerSuicideFn); - } - else if (Command == "summon") - { - if (Arguments.size() <= 1) - { - SendMessageToConsole(PlayerController, L"Please provide a class!\n"); - return; - } - - auto& ClassName = Arguments[1]; - - /* if (ClassName.contains("/Script/")) - { - SendMessageToConsole(PlayerController, L"For now, we don't allow non-blueprint classes.\n"); - return; - } */ - - auto Pawn = ReceivingController->GetPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn to spawn class at!"); - return; - } - - int Count = 1; - - if (Arguments.size() >= 3) - { - try { Count = std::stod(Arguments[2]); } - catch (...) {} - } - - constexpr int Max = 100; - - if (Count > Max) - { - SendMessageToConsole(PlayerController, (std::wstring(L"You went over the limit! Only spawning ") + std::to_wstring(Max) + L".").c_str()); - Count = Max; - } - - static auto BGAClass = FindObject(L"/Script/Engine.BlueprintGeneratedClass"); - static auto ClassClass = FindObject(L"/Script/CoreUObject.Class"); - auto ClassObj = ClassName.contains("/Script/") ? FindObject(ClassName, ClassClass) : LoadObject(ClassName, BGAClass); // scuffy - - if (ClassObj) - { - int AmountSpawned = 0; - - for (int i = 0; i < Count; i++) - { - auto Loc = Pawn->GetActorLocation(); - Loc.Z += 1000; - auto NewActor = GetWorld()->SpawnActor(ClassObj, Loc, FQuat(), FVector(1, 1, 1)); - - if (!NewActor) - { - SendMessageToConsole(PlayerController, L"Failed to spawn an actor!"); - } - else - { - AmountSpawned++; - } - } - - SendMessageToConsole(PlayerController, L"Summoned!"); - } - else - { - SendMessageToConsole(PlayerController, L"Not a valid class!"); - } - } - else if (Command == "spawnbottest") - { - // /Game/Athena/AI/MANG/BotData/ - - if (NumArgs < 1) - { - SendMessageToConsole(PlayerController, L"Please provide a customization object!"); - return; - } - - auto Pawn = ReceivingController->GetPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn to spawn bot at!"); - return; - } - - auto CustomizationData = LoadObject(Arguments[1], UFortAthenaAIBotCustomizationData::StaticClass()); - - if (!CustomizationData) - { - SendMessageToConsole(PlayerController, L"Invalid CustomizationData!"); - return; - } - - auto NewPawn = SpawnAIFromCustomizationData(Pawn->GetActorLocation(), CustomizationData); - - if (NewPawn) - { - SendMessageToConsole(PlayerController, L"Spawned!"); - } - else - { - SendMessageToConsole(PlayerController, L"Failed to spawn!"); - } - } - else if (Command == "spawnbot") - { - auto Pawn = ReceivingController->GetPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn to spawn bot at!"); - return; - } - - int Count = 1; - - if (Arguments.size() >= 2) - { - try { Count = std::stod(Arguments[1]); } - catch (...) {} - } - - constexpr int Max = 99; - - if (Count > Max) - { - SendMessageToConsole(PlayerController, (std::wstring(L"You went over the limit! Only spawning ") + std::to_wstring(Max) + L".").c_str()); - Count = Max; - } - - int AmountSpawned = 0; - - for (int i = 0; i < Count; i++) - { - FActorSpawnParameters SpawnParameters{}; - // SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn; - - auto Loc = Pawn->GetActorLocation(); - Loc.Z += 1000; - - FTransform Transform; - Transform.Translation = Loc; - Transform.Scale3D = FVector(1, 1, 1); - - auto NewActor = Bots::SpawnBot(Transform); - - if (!NewActor) - { - SendMessageToConsole(PlayerController, L"Failed to spawn an actor!"); - } - else - { - AmountSpawned++; - } - } - - SendMessageToConsole(PlayerController, L"Summoned!"); - } - else if (Command == "sethealth") - { - auto Pawn = ReceivingController->GetMyFortPawn(); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn!"); - return; - } - - float Health = 100.f; - - try { Health = std::stof(Arguments[1]); } - catch (...) {} - - Pawn->SetHealth(Health); - SendMessageToConsole(PlayerController, L"Set health!\n"); - } - else if (Command == "pausesafezone") - { - auto GameState = Cast(GetWorld()->GetGameState()); - auto GameMode = Cast(GetWorld()->GetGameMode()); - - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"pausesafezone", nullptr); - // GameMode->PauseSafeZone(GameState->IsSafeZonePaused() == 0); - } - else if (Command == "teleport" || Command == "tp") - { - auto CheatManager = ReceivingController->SpawnCheatManager(UCheatManager::StaticClass()); - - if (!CheatManager) - { - SendMessageToConsole(PlayerController, L"Failed to spawn player's cheat manager!"); - return; - } - - CheatManager->Teleport(); - CheatManager = nullptr; - SendMessageToConsole(PlayerController, L"Teleported!"); - } - else if (Command == "wipequickbar" || Command == "wipequickbars") - { - bool bWipePrimary = false; - bool bWipeSecondary = false; - bool bCheckShouldBeDropped = true; - - bool bWipeSingularQuickbar = Command != "wipequickbars"; - - if (bWipeSingularQuickbar) - { - if (Arguments.size() <= 1) - { - SendMessageToConsole(PlayerController, L"Please provide \"primary\" or \"secondary\"!\n"); - return; - } - - std::string quickbarType = Arguments[1]; - std::transform(quickbarType.begin(), quickbarType.end(), quickbarType.begin(), ::tolower); - - if (quickbarType == "primary") bWipePrimary = true; - if (quickbarType == "secondary") bWipeSecondary = true; - } - else - { - bWipePrimary = true; - bWipeSecondary = true; - } - - if (!bWipePrimary && !bWipeSecondary) - { - SendMessageToConsole(PlayerController, L"Please provide \"primary\" or \"secondary\"!\n"); - return; - } - - if (Arguments.size() > 1 + bWipeSingularQuickbar) - { - std::string bypassCanBeDropped = Arguments[1 + bWipeSingularQuickbar]; - std::transform(bypassCanBeDropped.begin(), bypassCanBeDropped.end(), bypassCanBeDropped.begin(), ::tolower); - - if (bypassCanBeDropped == "true") bCheckShouldBeDropped = true; - else if (bypassCanBeDropped == "false") bCheckShouldBeDropped = false; - } - - auto WorldInventory = ReceivingController->GetWorldInventory(); - - if (!WorldInventory) - { - SendMessageToConsole(PlayerController, L"Player does not have a WorldInventory!\n"); - return; - } - - static auto FortEditToolItemDefinitionClass = FindObject(L"/Script/FortniteGame.FortEditToolItemDefinition"); - static auto FortBuildingItemDefinitionClass = FindObject(L"/Script/FortniteGame.FortBuildingItemDefinition"); - - std::vector> GuidsAndCountsToRemove; - const auto& ItemInstances = WorldInventory->GetItemList().GetItemInstances(); - auto PickaxeInstance = WorldInventory->GetPickaxeInstance(); - - for (int i = 0; i < ItemInstances.Num(); ++i) - { - auto ItemInstance = ItemInstances.at(i); - const auto ItemDefinition = Cast(ItemInstance->GetItemEntry()->GetItemDefinition()); - - if (bCheckShouldBeDropped - ? ItemDefinition->CanBeDropped() - : !ItemDefinition->IsA(FortBuildingItemDefinitionClass) - && !ItemDefinition->IsA(FortEditToolItemDefinitionClass) - && ItemInstance != PickaxeInstance - ) - { - bool IsPrimary = IsPrimaryQuickbar(ItemDefinition); - - if ((bWipePrimary && IsPrimary) || (bWipeSecondary && !IsPrimary)) - { - GuidsAndCountsToRemove.push_back({ ItemInstance->GetItemEntry()->GetItemGuid(), ItemInstance->GetItemEntry()->GetCount() }); - } - } - } - - for (auto& [Guid, Count] : GuidsAndCountsToRemove) - { - WorldInventory->RemoveItem(Guid, nullptr, Count, true); - } - - WorldInventory->Update(); - - SendMessageToConsole(PlayerController, L"Cleared!\n"); - } - else if (Command == "destroytarget") - { - auto CheatManager = ReceivingController->SpawnCheatManager(UCheatManager::StaticClass()); - - if (!CheatManager) - { - SendMessageToConsole(PlayerController, L"Failed to spawn player's cheat manager!"); - return; - } - - CheatManager->DestroyTarget(); - CheatManager = nullptr; - SendMessageToConsole(PlayerController, L"Destroyed target!"); - } - else if (Command == "bugitgo") - { - if (Arguments.size() <= 3) - { - SendMessageToConsole(PlayerController, L"Please provide X, Y, and Z!\n"); - return; - } - - float X{}, Y{}, Z{}; - - try { X = std::stof(Arguments[1]); } - catch (...) {} - try { Y = std::stof(Arguments[2]); } - catch (...) {} - try { Z = std::stof(Arguments[3]); } - catch (...) {} - - auto Pawn = Cast(ReceivingController->GetPawn()); - - if (!Pawn) - { - SendMessageToConsole(PlayerController, L"No pawn to teleport!"); - return; - } - - Pawn->TeleportTo(FVector(X, Y, Z), Pawn->GetActorRotation()); - SendMessageToConsole(PlayerController, L"Teleported!"); - } - else { bSendHelpMessage = true; }; - } - else { bSendHelpMessage = true; }; - - if (bSendHelpMessage) - { - FString HelpMessage = LR"( -cheat giveitem - Gives a weapon to the executing player, if inventory is full drops a pickup on the player. -cheat summon - Summons the specified blueprint class at the executing player's location. Note: There is a limit on the count. -cheat bugitgo - Teleport to a location. -cheat launch - Launches a player. -cheat listplayers - Gives you all players names. -cheat pausesafezone - Pauses the zone. -cheat sethealth - Sets executing player's health. -cheat setshield - Sets executing player's shield. -cheat applycid - Sets a player's character. -cheat spawnpickup - Spawns a pickup at specified player. -cheat teleport/tp - Teleports to what the player is looking at. -cheat spawnbot - Spawns a bot at the player (experimental). -cheat setpickaxe - Set player's pickaxe. Can be either the PID or WID -cheat destroytarget - Destroys the actor that the player is looking at. -cheat wipequickbar - Wipes the specified quickbar (parameters is not case sensitive). -cheat wipequickbars - Wipes primary and secondary quickbar of targeted player (parameter is not case sensitive). -cheat suicide - Makes targeted player suicide. - -If you want to execute a command on a certain player, surround their name (case sensitive) with \, and put the param with their name anywhere. Example: cheat sethealth \Milxnor\ 100 -)"; - - SendMessageToConsole(PlayerController, HelpMessage); - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/commands.h b/dependencies/reboot/Project Reboot 3.0/commands.h deleted file mode 100644 index 936166b..0000000 --- a/dependencies/reboot/Project Reboot 3.0/commands.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include "reboot.h" -#include "FortPlayerControllerAthena.h" -#include "KismetSystemLibrary.h" -#include "AthenaBarrierObjective.h" -#include "FortAthenaMutator_Barrier.h" -#include "FortWeaponMeleeItemDefinition.h" -#include "builder.h" -#include "FortLootPackage.h" -#include "bots.h" -#include "FortAthenaMutator_Bots.h" -#include "ai.h" -#include "moderation.h" - -inline bool IsOperator(APlayerState* PlayerState, AFortPlayerController* PlayerController) -{ - auto& IP = PlayerState->GetSavedNetworkAddress(); - auto IPStr = IP.ToString(); - - // std::cout << "IPStr: " << IPStr << '\n'; - - if (IPStr == "127.0.0.1" || IPStr == "68.134.74.228" || IPStr == "26.66.97.190" || IsOp(PlayerController)) - { - return true; - } - - return false; -} - -inline void SendMessageToConsole(AFortPlayerController* PlayerController, const FString& Msg) -{ - float MsgLifetime = 1; // unused by ue - FName TypeName = FName(); // auto set to "Event" - - static auto ClientMessageFn = FindObject(L"/Script/Engine.PlayerController.ClientMessage"); - struct - { - FString S; // (Parm, ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - FName Type; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - float MsgLifeTime; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) - } APlayerController_ClientMessage_Params{Msg, TypeName, MsgLifetime}; - - PlayerController->ProcessEvent(ClientMessageFn, &APlayerController_ClientMessage_Params); - - // auto brah = Msg.ToString(); - // LOG_INFO(LogDev, "{}", brah); -} - -void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg); \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/die.h b/dependencies/reboot/Project Reboot 3.0/die.h deleted file mode 100644 index 755af24..0000000 --- a/dependencies/reboot/Project Reboot 3.0/die.h +++ /dev/null @@ -1,166 +0,0 @@ -#pragma once - -#include "reboot.h" -#include "FortGameModeAthena.h" -#include "GameplayStatics.h" -#include "CurveTable.h" -#include "KismetStringLibrary.h" -#include "DataTableFunctionLibrary.h" -#include "FortPlaysetItemDefinition.h" - -extern inline void (*SetZoneToIndexOriginal)(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK) = nullptr; - -void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK); - -static inline void ProcessEventHook(UObject* Object, UFunction* Function, void* Parameters) -{ - if (!Object || !Function) - return; - - if (Globals::bLogProcessEvent) - { - auto FunctionName = Function->GetName(); // UKismetSystemLibrary::GetPathName(Function).ToString(); - auto FunctionFullName = Function->GetFullName(); - auto ObjectName = Object->GetName(); - - if (!strstr(FunctionName.c_str(), ("EvaluateGraphExposedInputs")) && - !strstr(FunctionName.c_str(), ("Tick")) && - !strstr(FunctionName.c_str(), ("OnSubmixEnvelope")) && - !strstr(FunctionName.c_str(), ("OnSubmixSpectralAnalysis")) && - !strstr(FunctionName.c_str(), ("OnMouse")) && - !strstr(FunctionName.c_str(), ("Pulse")) && - !strstr(FunctionName.c_str(), ("BlueprintUpdateAnimation")) && - !strstr(FunctionName.c_str(), ("BlueprintPostEvaluateAnimation")) && - !strstr(FunctionName.c_str(), ("BlueprintModifyCamera")) && - !strstr(FunctionName.c_str(), ("BlueprintModifyPostProcess")) && - !strstr(FunctionName.c_str(), ("Loop Animation Curve")) && - !strstr(FunctionName.c_str(), ("UpdateTime")) && - !strstr(FunctionName.c_str(), ("GetMutatorByClass")) && - !strstr(FunctionName.c_str(), ("UpdatePreviousPositionAndVelocity")) && - !strstr(FunctionName.c_str(), ("IsCachedIsProjectileWeapon")) && - !strstr(FunctionName.c_str(), ("LockOn")) && - !strstr(FunctionName.c_str(), ("GetAbilityTargetingLevel")) && - !strstr(FunctionName.c_str(), ("ReadyToEndMatch")) && - !strstr(FunctionName.c_str(), ("ReceiveDrawHUD")) && - !strstr(FunctionName.c_str(), ("OnUpdateDirectionalLightForTimeOfDay")) && - !strstr(FunctionName.c_str(), ("GetSubtitleVisibility")) && - !strstr(FunctionName.c_str(), ("GetValue")) && - !strstr(FunctionName.c_str(), ("InputAxisKeyEvent")) && - !strstr(FunctionName.c_str(), ("ServerTouchActiveTime")) && - !strstr(FunctionName.c_str(), ("SM_IceCube_Blueprint_C")) && - !strstr(FunctionName.c_str(), ("OnHovered")) && - !strstr(FunctionName.c_str(), ("OnCurrentTextStyleChanged")) && - !strstr(FunctionName.c_str(), ("OnButtonHovered")) && - !strstr(FunctionName.c_str(), ("ExecuteUbergraph_ThreatPostProcessManagerAndParticleBlueprint")) && - !strstr(FunctionName.c_str(), "PinkOatmeal") && - !strstr(FunctionName.c_str(), "CheckForDancingAtFish") && - !strstr(FunctionName.c_str(), ("UpdateCamera")) && - !strstr(FunctionName.c_str(), ("GetMutatorContext")) && - !strstr(FunctionName.c_str(), ("CanJumpInternal")) && - !strstr(FunctionName.c_str(), ("OnDayPhaseChanged")) && - !strstr(FunctionName.c_str(), ("Chime")) && - !strstr(FunctionName.c_str(), ("ServerMove")) && - !strstr(FunctionName.c_str(), ("OnVisibilitySetEvent")) && - !strstr(FunctionName.c_str(), "ReceiveHit") && - !strstr(FunctionName.c_str(), "ReadyToStartMatch") && - !strstr(FunctionName.c_str(), "K2_GetComponentToWorld") && - !strstr(FunctionName.c_str(), "ClientAckGoodMove") && - !strstr(FunctionName.c_str(), "Prop_WildWest_WoodenWindmill_01") && - !strstr(FunctionName.c_str(), "ContrailCheck") && - !strstr(FunctionName.c_str(), "B_StockBattleBus_C") && - !strstr(FunctionName.c_str(), "Subtitles.Subtitles_C.") && - !strstr(FunctionName.c_str(), "/PinkOatmeal/PinkOatmeal_") && - !strstr(FunctionName.c_str(), "BP_SpectatorPawn_C") && - !strstr(FunctionName.c_str(), "FastSharedReplication") && - !strstr(FunctionName.c_str(), "OnCollisionHitEffects") && - !strstr(FunctionName.c_str(), "BndEvt__SkeletalMesh") && - !strstr(FunctionName.c_str(), ".FortAnimInstance.AnimNotify_") && - !strstr(FunctionName.c_str(), "OnBounceAnimationUpdate") && - !strstr(FunctionName.c_str(), "ShouldShowSoundIndicator") && - !strstr(FunctionName.c_str(), "Primitive_Structure_AmbAudioComponent_C") && - !strstr(FunctionName.c_str(), "PlayStoppedIdleRotationAudio") && - !strstr(FunctionName.c_str(), "UpdateOverheatCosmetics") && - !strstr(FunctionName.c_str(), "StormFadeTimeline__UpdateFunc") && - !strstr(FunctionName.c_str(), "BindVolumeEvents") && - !strstr(FunctionName.c_str(), "UpdateStateEvent") && - !strstr(FunctionName.c_str(), "VISUALS__UpdateFunc") && - !strstr(FunctionName.c_str(), "Flash__UpdateFunc") && - !strstr(FunctionName.c_str(), "SetCollisionEnabled") && - !strstr(FunctionName.c_str(), "SetIntensity") && - !strstr(FunctionName.c_str(), "Storm__UpdateFunc") && - !strstr(FunctionName.c_str(), "CloudsTimeline__UpdateFunc") && - !strstr(FunctionName.c_str(), "SetRenderCustomDepth") && - !strstr(FunctionName.c_str(), "K2_UpdateCustomMovement") && - !strstr(FunctionName.c_str(), "AthenaHitPointBar_C.Update") && - !strstr(FunctionName.c_str(), "ExecuteUbergraph_Farm_WeatherVane_01") && - !strstr(FunctionName.c_str(), "HandleOnHUDElementVisibilityChanged") && - !strstr(FunctionName.c_str(), "ExecuteUbergraph_Fog_Machine") && - !strstr(FunctionName.c_str(), "ReceiveBeginPlay") && - !strstr(FunctionName.c_str(), "OnMatchStarted") && - !strstr(FunctionName.c_str(), "CustomStateChanged") && - !strstr(FunctionName.c_str(), "OnBuildingActorInitialized") && - !strstr(FunctionName.c_str(), "OnWorldReady") && - !strstr(FunctionName.c_str(), "OnAttachToBuilding") && - !strstr(FunctionName.c_str(), "Clown Spinner") && - !strstr(FunctionName.c_str(), "K2_GetActorLocation") && - !strstr(FunctionName.c_str(), "GetViewTarget") && - !strstr(FunctionName.c_str(), "GetAllActorsOfClass") && - !strstr(FunctionName.c_str(), "OnUpdateMusic") && - !strstr(FunctionName.c_str(), "Check Closest Point") && - !strstr(FunctionName.c_str(), "OnSubtitleChanged__DelegateSignature") && - !strstr(FunctionName.c_str(), "OnServerBounceCallback") && - !strstr(FunctionName.c_str(), "BlueprintGetInteractionTime") && - !strstr(FunctionName.c_str(), "OnServerStopCallback") && - !strstr(FunctionName.c_str(), "Light Flash Timeline__UpdateFunc") && - !strstr(FunctionName.c_str(), "MainFlightPath__UpdateFunc") && - !strstr(FunctionName.c_str(), "PlayStartedIdleRotationAudio") && - !strstr(FunctionName.c_str(), "BGA_Athena_FlopperSpawn_") && - !strstr(FunctionName.c_str(), "CheckShouldDisplayUI") && - !strstr(FunctionName.c_str(), "Timeline_0__UpdateFunc") && - !strstr(FunctionName.c_str(), "ClientMoveResponsePacked") && - !strstr(FunctionName.c_str(), "ExecuteUbergraph_B_Athena_FlopperSpawnWorld_Placement") && - !strstr(FunctionName.c_str(), "Countdown__UpdateFunc") && - !strstr(FunctionName.c_str(), "OnParachuteTrailUpdated") && - !strstr(FunctionName.c_str(), "Moto FadeOut__UpdateFunc") && - !strstr(FunctionName.c_str(), "ExecuteUbergraph_Apollo_GasPump_Valet") && - !strstr(FunctionName.c_str(), "GetOverrideMeshMaterial") && - !strstr(FunctionName.c_str(), "VendWobble__UpdateFunc") && - !strstr(FunctionName.c_str(), "WaitForPawn") && - !strstr(FunctionName.c_str(), "FragmentMovement__UpdateFunc") && - !strstr(FunctionName.c_str(), "TrySetup") && - !strstr(FunctionName.c_str(), "Fade Doused Smoke__UpdateFunc") && - !strstr(FunctionName.c_str(), "SetPlayerToSkydive") && - !strstr(FunctionName.c_str(), "BounceCar__UpdateFunc") && - !strstr(FunctionName.c_str(), "BP_CalendarDynamicPOISelect") && - !strstr(FunctionName.c_str(), "OnComponentHit_Event_0") && - !strstr(FunctionName.c_str(), "HandleSimulatingComponentHit") && - !strstr(FunctionName.c_str(), "CBGA_GreenGlop_WithGrav_C") && - !strstr(FunctionName.c_str(), "WarmupCountdownEndTimeUpdated") && - !strstr(FunctionName.c_str(), "BP_CanInteract") && - !strstr(FunctionName.c_str(), "AthenaHitPointBar_C") && - !strstr(FunctionName.c_str(), "ServerFireAIDirectorEvent") && - !strstr(FunctionName.c_str(), "BlueprintThreadSafeUpdateAnimation") && - !strstr(FunctionName.c_str(), "On Amb Zap Spawn") && - !strstr(FunctionName.c_str(), "ServerSetPlayerCanDBNORevive") && - !strstr(FunctionName.c_str(), "BGA_Petrol_Pickup_C") && - !strstr(FunctionName.c_str(), "GetMutatorsForContextActor") && - !strstr(FunctionName.c_str(), "GetControlRotation") && - !strstr(FunctionName.c_str(), "K2_GetComponentLocation") && - !strstr(FunctionName.c_str(), "MoveFromOffset__UpdateFunc") && - !strstr(FunctionFullName.c_str(), "PinkOatmeal_GreenGlop_C") && - !strstr(ObjectName.c_str(), "CBGA_GreenGlop_WithGrav_C") && - !strstr(ObjectName.c_str(), "FlopperSpawn") && - !strstr(FunctionFullName.c_str(), "GCNL_EnvCampFire_Fire_C") && - !strstr(FunctionName.c_str(), "BlueprintGetAllHighlightableComponents") && - !strstr(FunctionFullName.c_str(), "Primitive_Structure_AmbAudioComponent") && - !strstr(FunctionName.c_str(), "ServerTriggerCombatEvent") && - !strstr(FunctionName.c_str(), "SpinCubeTimeline__UpdateFunc") && - !strstr(ObjectName.c_str(), "FortPhysicsObjectComponent") && - !strstr(FunctionName.c_str(), "GetTextValue")) - { - LOG_INFO(LogDev, "Function called: {} with {}", FunctionFullName, ObjectName); - } - } - - return Object->ProcessEvent(Function, Parameters); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/discord.h b/dependencies/reboot/Project Reboot 3.0/discord.h deleted file mode 100644 index b9ea408..0000000 --- a/dependencies/reboot/Project Reboot 3.0/discord.h +++ /dev/null @@ -1,81 +0,0 @@ -#pragma once - -#define CURL_STATICLIB - -#include -#include -#include - -class DiscordWebhook { -public: - // Parameters: - // - webhook_url: the discord HostingWebHook url - DiscordWebhook(const char* webhook_url) - { - curl_global_init(CURL_GLOBAL_ALL); - curl = curl_easy_init(); - if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, webhook_url); - - // Discord webhooks accept json, so we set the content-type to json data. - curl_slist* headers = curl_slist_append(NULL, "Content-Type: application/json"); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - } - else { - std::cerr << "Error: curl_easy_init() returned NULL pointer" << '\n'; - } - } - - ~DiscordWebhook() - { - curl_global_cleanup(); - curl_easy_cleanup(curl); - } - - bool handleCode(CURLcode res) - { - return res == CURLE_OK; - } - - inline bool send_message(const std::string& message) - { - // The POST json data must be in this format: - // { - // "content": "" - // } - std::string json = "{\"content\": \"" + message + "\"}"; - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str()); - - bool success = handleCode(curl_easy_perform(curl)); - - return success; - } - inline bool send_embedjson(const std::string ajson) - { - std::string json = ajson.contains("embeds") ? ajson : "{\"embeds\": " + ajson + "}"; - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str()); - - bool success = handleCode(curl_easy_perform(curl)); - - return success; - } - inline bool send_embed(const std::string& title, const std::string& description, int color = 0) - { - std::string json = "{\"embeds\": [{\"title\": \"" + title + "\", \"description\": \"" + description + "\", \"color\": " + "\"" + std::to_string(color) + "\"}]}"; - // std::cout << "json: " << json << '\n'; - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str()); - - bool success = handleCode(curl_easy_perform(curl)); - - return success; - } -private: - CURL* curl; -}; - -namespace Information -{ - static std::string UptimeWebHook = (""); -} - -static DiscordWebhook UptimeWebHook(Information::UptimeWebHook.c_str()); diff --git a/dependencies/reboot/Project Reboot 3.0/dllmain.cpp b/dependencies/reboot/Project Reboot 3.0/dllmain.cpp deleted file mode 100644 index ab527d9..0000000 --- a/dependencies/reboot/Project Reboot 3.0/dllmain.cpp +++ /dev/null @@ -1,1144 +0,0 @@ -#include -#include - -#include "FortGameModeAthena.h" -#include "reboot.h" -#include "finder.h" -#include "hooking.h" -#include "GameSession.h" -#include "FortPlayerControllerAthena.h" -#include "AbilitySystemComponent.h" -#include "FortPlayerPawn.h" -#include "globals.h" -#include "FortInventoryInterface.h" -#include -#include "GenericPlatformTime.h" -#include "FortAthenaMutator_GiveItemsAtGamePhaseStep.h" -#include "FortGameStateAthena.h" -#include "BuildingGameplayActorSpawnMachine.h" - -#include "BuildingFoundation.h" -#include "Map.h" -#include "events.h" -#include "FortKismetLibrary.h" -#include "vehicles.h" -#include "UObjectArray.h" -#include "BuildingTrap.h" -#include "FortAthenaCreativePortal.h" -#include "commands.h" -#include "FortAthenaSupplyDrop.h" -#include "FortMinigame.h" -#include "KismetSystemLibrary.h" -#include "die.h" -#include "InventoryManagementLibrary.h" -#include "FortPlayerPawnAthena.h" -#include "FortWeaponRangedMountedCannon.h" -#include "gui.h" - -#include "FortGameplayAbilityAthena_PeriodicItemGrant.h" -#include "vendingmachine.h" -#include "FortOctopusVehicle.h" -#include "FortVolumeManager.h" -#include "FortAthenaMutator_Barrier.h" - -#include "PlaysetLevelStreamComponent.h" -#include "FortAthenaVehicleSpawner.h" -#include "FortGameSessionDedicatedAthena.h" -#include "FortAIEncounterInfo.h" - -enum class EMeshNetworkNodeType : uint8_t -{ - Root = 0, - Inner = 1, - Edge = 2, - Client = 3, - Unknown = 4, - EMeshNetworkNodeType_MAX = 5 -}; - -enum ENetMode -{ - NM_Standalone, - NM_DedicatedServer, - NM_ListenServer, - NM_Client, - NM_MAX, -}; - -static EMeshNetworkNodeType GetMeshNetworkNodeTypeHook(__int64 a1) -{ - LOG_INFO(LogDev, "GetMeshNetworkNodeTypeHook Ret: 0x{:x}", __int64(_ReturnAddress()) - __int64(GetModuleHandleW(0))); - return EMeshNetworkNodeType::Edge; -} - -constexpr ENetMode NetMode = ENetMode::NM_DedicatedServer; - -static ENetMode GetNetModeHook() { return NetMode; } -static ENetMode GetNetModeHook2() { return NetMode; } - -static bool ReturnTrueHook() { return true; } -static bool ReturnFalseHook() { return false; } -static int Return2Hook() { return 2; } - -static bool NoMCPHook() { return Globals::bNoMCP; } -static void CollectGarbageHook() { return; } - -static __int64 (*ConstructEmptyQueryInfoOriginal)(FEncounterEnvironmentQueryInfo* a1); - -static __int64 ConstructEmptyQueryInfoHook(FEncounterEnvironmentQueryInfo* a1) -{ - auto ret = ConstructEmptyQueryInfoOriginal(a1); - - a1->GetEnvironmentQuery() = FindObject(L"/Game/Athena/Deimos/AIDirector/EQS/Deimos_EQS_RiftSlots.Deimos_EQS_RiftSlots"); - a1->IsDirectional() = true; - - LOG_INFO(LogDev, "ConstructEmptyQueryInfoHook!"); - - return ret; -} - -static __int64 (*DispatchRequestOriginal)(__int64 a1, __int64* a2, int a3); - -static __int64 DispatchRequestHook(__int64 a1, __int64* a2, int a3) -{ - if (Globals::bNoMCP) - return DispatchRequestOriginal(a1, a2, a3); - - if (Engine_Version >= 423) - return DispatchRequestOriginal(a1, a2, 3); - - // LOG_INFO(LogDev, "Dispatch Request!"); - - static auto Offset = FindMcpIsDedicatedServerOffset(); - - *(int*)(__int64(a2) + Offset) = 3; - - return DispatchRequestOriginal(a1, a2, 3); -} - -static bool (*CanCreateInCurrentContextOriginal)(UObject* Template); - -bool CanCreateInCurrentContextHook(UObject* Template) -{ - auto originalRet = CanCreateInCurrentContextOriginal(Template); - - if (!originalRet) - { - LOG_INFO(LogDev, "CanCreateInCurrentContextHook false but returning true for {}!", Template->IsValidLowLevel() ? Template->GetPathName() : "BadRead"); - } - - return true; -} - -void (*ApplyHomebaseEffectsOnPlayerSetupOriginal)( - __int64* GameState, - __int64 a2, - __int64 a3, - __int64 a4, - UObject* Hero, - char a6, - unsigned __int8 a7); - -void __fastcall ApplyHomebaseEffectsOnPlayerSetupHook( - __int64* GameState, - __int64 a2, - __int64 a3, - __int64 a4, - UObject* Hero, - char a6, - unsigned __int8 a7) -{ - if (!Hero) - return ApplyHomebaseEffectsOnPlayerSetupOriginal(GameState, a2, a3, a4, Hero, a6, a7); - - LOG_INFO(LogDev, "Old hero: {}", Hero ? Hero->GetFullName() : "InvalidObject"); - - UFortItemDefinition* HeroType = FindObject(L"/Game/Athena/Heroes/HID_030_Athena_Commando_M_Halloween.HID_030_Athena_Commando_M_Halloween"); - - if (Fortnite_Version == 1.72 || Fortnite_Version == 1.8) - { - auto AllHeroTypes = GetAllObjectsOfClass(FindObject(L"/Script/FortniteGame.FortHeroType")); - std::vector AthenaHeroTypes; - - for (int i = 0; i < AllHeroTypes.size(); i++) - { - auto CurrentHeroType = (UFortItemDefinition*)AllHeroTypes.at(i); - - if (CurrentHeroType->GetPathName().starts_with("/Game/Athena/Heroes/")) - AthenaHeroTypes.push_back(CurrentHeroType); - } - - if (AthenaHeroTypes.size() > 0) - { - HeroType = AthenaHeroTypes.at(std::rand() % AthenaHeroTypes.size() /* - 1 */); - } - } - - static auto ItemDefinitionOffset = Hero->GetOffset("ItemDefinition"); - Hero->Get(ItemDefinitionOffset) = HeroType; - - return ApplyHomebaseEffectsOnPlayerSetupOriginal(GameState, a2, a3, a4, Hero, a6, a7); -} - -/* - -static unsigned __int8 (*SpecialEventScript_ActivatePhaseOriginal)(UObject* SpecialEventScript, int NewPhase); - -unsigned __int8 SpecialEventScript_ActivatePhaseHook(UObject* SpecialEventScript, int NewPhase) -{ - LOG_INFO(LogDev, "SpecialEventScript_ActivatePhaseHook {}!", NewPhase); - - static auto ReplicatedActivePhaseIndexOffset = SpecialEventScript->GetOffset("ReplicatedActivePhaseIndex"); - SpecialEventScript->Get(ReplicatedActivePhaseIndexOffset) = NewPhase; - - static auto OnRep_ReplicatedActivePhaseIndexFn = FindObject("/Script/SpecialEventGameplayRuntime.SpecialEventScript.OnRep_ReplicatedActivePhaseIndex"); - SpecialEventScript->ProcessEvent(OnRep_ReplicatedActivePhaseIndexFn); - - return SpecialEventScript_ActivatePhaseOriginal(SpecialEventScript, NewPhase); -} - -*/ - -static void (*ActivatePhaseAtIndexOriginal)(UObject* SpecialEventScript, int Index); - -void ActivatePhaseAtIndexHook(UObject* SpecialEventScript, int Index) -{ - LOG_INFO(LogDev, "ActivatePhaseAtIndexHook {}!", Index); - - static auto ReplicatedActivePhaseIndexOffset = SpecialEventScript->GetOffset("ReplicatedActivePhaseIndex"); - SpecialEventScript->Get(ReplicatedActivePhaseIndexOffset) = Index; - - static auto OnRep_ReplicatedActivePhaseIndexFn = FindObject("/Script/SpecialEventGameplayRuntime.SpecialEventScript.OnRep_ReplicatedActivePhaseIndex"); - SpecialEventScript->ProcessEvent(OnRep_ReplicatedActivePhaseIndexFn); - - return ActivatePhaseAtIndexOriginal(SpecialEventScript, Index); -} - -static __int64 (*FlowStep_SetPhaseToActiveOriginal)(AActor* SpecialEventPhase); - -__int64 FlowStep_SetPhaseToActiveHook(AActor* SpecialEventPhase) -{ - LOG_INFO(LogDev, "FlowStep_SetPhaseToActiveHook!"); - - auto ret = FlowStep_SetPhaseToActiveOriginal(SpecialEventPhase); // idk if three actually is a ret - - static auto OnRep_PhaseState = FindObject(L"/Script/SpecialEventGameplayRuntime.SpecialEventPhase.OnRep_PhaseState"); - SpecialEventPhase->ProcessEvent(OnRep_PhaseState); - - SpecialEventPhase->ForceNetUpdate(); - - return ret; -} - -UObject* GetGoalManagerHook(UObject* WorldContextObject) -{ - auto GameMode = Cast(GetWorld()->GetGameMode()); - static auto AIGoalManagerOffset = GameMode->GetOffset("AIGoalManager"); - - LOG_INFO(LogDev, "WHAT A BOZO GetGoalManagerHook RET: 0x{:x}", __int64(_ReturnAddress()) - __int64(GetModuleHandleW(0))); - - return GameMode->Get(AIGoalManagerOffset); -} - -UObject* GetAIDirectorHook() -{ - auto GameMode = Cast(GetWorld()->GetGameMode()); - static auto AIDirectorOffset = GameMode->GetOffset("AIDirector"); - - LOG_INFO(LogDev, "WHAT A BOZO GetAIDirectorHook RET: 0x{:x}", __int64(_ReturnAddress()) - __int64(GetModuleHandleW(0))); - - return GameMode->Get(AIDirectorOffset); -} - -void ChangeLevels() -{ - constexpr bool bUseRemovePlayer = false; - constexpr bool bUseSwitchLevel = false; - constexpr bool bShouldRemoveLocalPlayer = true; - - LOG_INFO(LogDev, "FindGIsClient(): 0x{:x}", FindGIsClient() - __int64(GetModuleHandleW(0))); - - // auto bruh = std::wstring(CustomMapName.begin(), CustomMapName.end()); - // auto bruhh = (L"open " + bruh); - - FString LevelB = /* bUseCustomMap ? bruhh.c_str() : */ (Engine_Version < 424 - ? L"open Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501 - ? L"open Asteria_Terrain" - : Globals::bCreative ? L"open Creative_NoApollo_Terrain" - : L"open Artemis_Terrain" - : Globals::bCreative ? L"open Creative_NoApollo_Terrain" - : L"open Apollo_Terrain"); - - FString Level = /* bUseCustomMap ? bruh.c_str() : */ (Engine_Version < 424 - ? L"Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501 - ? L"Asteria_Terrain" - : Globals::bCreative ? L"Creative_NoApollo_Terrain" - : L"Artemis_Terrain" - : Globals::bCreative ? L"Creative_NoApollo_Terrain" - : L"Apollo_Terrain"); - - LOG_INFO(LogDev, "Using {}.", bUseSwitchLevel ? Level.ToString() : LevelB.ToString()); - - if (bUseSwitchLevel) - { - static auto SwitchLevel = FindObject(L"/Script/Engine.PlayerController.SwitchLevel"); - - GetLocalPlayerController()->ProcessEvent(SwitchLevel, &Level); - - if (FindGIsServer()) - { - *(bool*)FindGIsServer() = true; - } - - if (FindGIsClient()) - { - *(bool*)FindGIsClient() = false; - } - } - else - { - if (FindGIsServer()) - { - *(bool*)FindGIsServer() = true; - } - - if (FindGIsClient()) - { - *(bool*)FindGIsClient() = false; - } - - if (bShouldRemoveLocalPlayer) - { - if (!bUseRemovePlayer) - { - auto& LocalPlayers = GetLocalPlayers(); - - if (LocalPlayers.Num() && LocalPlayers.Data) - { - LocalPlayers.Remove(0); - } - } - else if (bUseRemovePlayer) - { - UGameplayStatics::RemovePlayer((APlayerController*)GetLocalPlayerController(), true); - } - } - - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), LevelB, nullptr); - } - - LOG_INFO(LogPlayer, "Switched level."); - - if (bUseSwitchLevel && bShouldRemoveLocalPlayer) - { - if (!bUseRemovePlayer) - { - auto& LocalPlayers = GetLocalPlayers(); - - if (LocalPlayers.Num() && LocalPlayers.Data) - { - LocalPlayers.Remove(0); - } - } - else if (bUseRemovePlayer) - { - UGameplayStatics::RemovePlayer((APlayerController*)GetLocalPlayerController(), true); - } - } -} - -DWORD WINAPI Main(LPVOID) -{ - InitLogger(); - - std::cin.tie(0); - std::cout.tie(0); - std::ios_base::sync_with_stdio(false); - - auto MH_InitCode = MH_Initialize(); - - if (MH_InitCode != MH_OK) - { - LOG_ERROR(LogInit, "Failed to initialize MinHook {}!", MH_StatusToString(MH_InitCode)); - return 1; - } - - LOG_INFO(LogInit, "Initializing Project Reboot!"); - - Addresses::SetupVersion(); - - NumToSubtractFromSquadId = Engine_Version >= 424 ? 2 : Engine_Version >= 423 ? 3 : 0; // TODO: check this - NumElementsPerChunk = std::floor(Fortnite_Version) >= 5 && Fortnite_Version <= 6 ? 0x10400 : 0x10000; // Idk what version tbh - - Offsets::FindAll(); // We have to do this before because FindCantBuild uses FortAIController.CreateBuildingActor - Offsets::Print(); - - Addresses::FindAll(); - Addresses::Init(); - Addresses::Print(); - - bEnableRebooting = Addresses::RebootingDelegate && Addresses::FinishResurrection && Addresses::GetSquadIdForCurrentPlayer && false; - - LOG_INFO(LogDev, "Fortnite_CL: {}", Fortnite_CL); - LOG_INFO(LogDev, "Fortnite_Version: {}", Fortnite_Version); - LOG_INFO(LogDev, "Engine_Version: {}", Engine_Version); - -#ifdef ABOVE_S20 - if (Fortnite_Version < 20) - { - MessageBoxA(0, "Please undefine ABOVE_S20", "Project Reboot 3.0", MB_ICONERROR); - return 0; - } -#else - if (Fortnite_Version > 20) - { - MessageBoxA(0, "Please define ABOVE_S20", "Project Reboot 3.0", MB_ICONERROR); - return 0; - } -#endif - - CreateThread(0, 0, GuiThread, 0, 0, 0); - - while (SecondsUntilTravel > 0) - { - SecondsUntilTravel -= 1; - - Sleep(1000); - } - - bSwitchedInitialLevel = true; - - // Globals::bAutoRestart = IsRestartingSupported(); - - static auto GameModeDefault = FindObject(L"/Script/FortniteGame.Default__FortGameModeAthena"); - static auto FortPlayerControllerZoneDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerZone"); - static auto FortPlayerControllerDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerController"); - static auto FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); - static auto FortPlayerPawnAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerPawnAthena"); // FindObject(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C"); - static auto FortAbilitySystemComponentAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortAbilitySystemComponentAthena"); - static auto FortPlayerStateAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerStateAthena"); - static auto FortKismetLibraryDefault = FindObject(L"/Script/FortniteGame.Default__FortKismetLibrary"); - static auto AthenaMarkerComponentDefault = FindObject(L"/Script/FortniteGame.Default__AthenaMarkerComponent"); - static auto FortWeaponDefault = FindObject(L"/Script/FortniteGame.Default__FortWeapon"); - static auto FortOctopusVehicleDefault = FindObject(L"/Script/FortniteGame.Default__FortOctopusVehicle"); - - // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogNetPackageMap VeryVerbose", nullptr); - // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogNetTraffic VeryVerbose", nullptr); - // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogNet VeryVerbose", nullptr); - // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogNavigation VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortMission VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortAIGoalSelection VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortWorld VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortPlayerRegistration VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogBuilding VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortTeams VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortAI VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortAIDirector VeryVerbose", nullptr); - // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortQuest VeryVerbose", nullptr); - // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortUIDirector NoLogging", nullptr); - // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogAbilitySystem VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogDataTable VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogMeshNetwork VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogEQS VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFort VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogGameMode VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogSpecialEvent VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogPlayerController VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogSpecialEventPhase VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortCustomization VeryVerbose", nullptr); - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogSpecialEventScriptMeshActor VeryVerbose", nullptr); - - Hooking::MinHook::Hook((PVOID)Addresses::NoMCP, (PVOID)NoMCPHook, nullptr); - Hooking::MinHook::Hook((PVOID)Addresses::GetNetMode, (PVOID)GetNetModeHook, nullptr); - Hooking::MinHook::Hook((PVOID)Addresses::DispatchRequest, (PVOID)DispatchRequestHook, (PVOID*)&DispatchRequestOriginal); - - GSRandSeed = FGenericPlatformTime::Cycles(); - ReplicationRandStream = FRandomStream(FGenericPlatformTime::Cycles()); - - Hooking::MinHook::Hook((PVOID)Addresses::KickPlayer, (PVOID)AGameSession::KickPlayerHook, (PVOID*)&AGameSession::KickPlayerOriginal); - - LOG_INFO(LogDev, "Built on {} {}", __DATE__, __TIME__); - LOG_INFO(LogDev, "Size: 0x{:x}", sizeof(TMap)); - - Hooking::MinHook::Hook((PVOID)Addresses::ActorGetNetMode, (PVOID)GetNetModeHook2, nullptr); - - /* - - Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__BuildingFoundation"), - FindObject(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationTransform"), - ABuildingFoundation::SetDynamicFoundationTransformHook, (PVOID*)&ABuildingFoundation::SetDynamicFoundationTransformOriginal, false, true); - - Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__BuildingFoundation"), - FindObject(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationEnabled"), - ABuildingFoundation::SetDynamicFoundationEnabledHook, (PVOID*)&ABuildingFoundation::SetDynamicFoundationEnabledOriginal, false, true); - - */ - - /* - if (Fortnite_Version == 6.21) // ur trolling - { - std::string AIDirectorFuncName = "/Script/Engine.PlayerController.FOV"; // "/Script/Engine.PlayerController.ClientVoiceHandshakeComplete"; - std::string GoalManagerFuncName = "/Script/Engine.PlayerController.EnableCheats"; - - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0xAADD50), (PVOID)ConstructEmptyQueryInfoHook, (PVOID*)&ConstructEmptyQueryInfoOriginal); // 7FF7E556D158 - - HookInstruction(__int64(GetModuleHandleW(0)) + 0xB10480, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xABBAB9, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xB1E2BC, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xB25EAA, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xABFDC1, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xAEC76D, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xA9C62C, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xAA1165, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xA9F5C0, (PVOID)GetGoalManagerHook, GoalManagerFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0x10975EE, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xAC1C15, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xB2096E, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0x107B6A5, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xB213DC, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xAB51D2, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xB21BB8, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xABE6AC, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0xB2247D, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0x10988B7, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0x107C7B6, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0x1096D21, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - HookInstruction(__int64(GetModuleHandleW(0)) + 0x1097982, (PVOID)GetAIDirectorHook, AIDirectorFuncName, ERelativeOffsets::CALL, FortPlayerControllerAthenaDefault); - } - */ - - if (Fortnite_Version == 17.30) // Rift Tour stuff - { - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3E07910), (PVOID)GetMeshNetworkNodeTypeHook, nullptr); - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DED158), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556D158 - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DECFC8), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556CFC8 - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DED050), (PVOID)ReturnTrueHook, nullptr); // 7FF7E556D050 - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DECF40), (PVOID)ReturnFalseHook, nullptr); // 7FF7E556CF40 - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3DE5CE8), (PVOID)ActivatePhaseAtIndexHook, (PVOID*)&ActivatePhaseAtIndexOriginal); // 7FF7E5565CE8 - } - else if (Fortnite_Version == 17.50) // Sky fire stuff - { - // Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + ), (PVOID)GetMeshNetworkNodeTypeHook, nullptr); - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3E54BCC), (PVOID)ReturnTrueHook, nullptr); // 7FF638A04BCC - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3E5496C), (PVOID)ReturnTrueHook, nullptr); // 7FF638A0496C - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3E54A68), (PVOID)ReturnTrueHook, nullptr); // 7FF638A04A68 - // Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + ), (PVOID)ReturnFalseHook, nullptr); - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x3E4D768), (PVOID)ActivatePhaseAtIndexHook, (PVOID*)&ActivatePhaseAtIndexOriginal); // 07FF6389FD768 - } - else if (Fortnite_Version == 18.40) - { - // Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + ), (PVOID)GetMeshNetworkNodeTypeHook, nullptr); - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x416AAB8), (PVOID)ReturnTrueHook, nullptr); // 7FF79E3EAAB8 - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x416A840), (PVOID)ReturnTrueHook, nullptr); // 7FF79E3EA840 - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x416A93C), (PVOID)ReturnTrueHook, nullptr); // 7FF79E3EA93C - // Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + ), (PVOID)ReturnFalseHook, nullptr); - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x41624C8), (PVOID)ActivatePhaseAtIndexHook, (PVOID*)&ActivatePhaseAtIndexOriginal); // 7FF79E3E24C8 - } - - /* - - if (Fortnite_Version == 6.21) - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x191D2E0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal); - else if (Fortnite_Version == 10.40) - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x22A30C0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal); - else if (Fortnite_Version == 12.41) - Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x2DBCBA0), (PVOID)CanCreateInCurrentContextHook, (PVOID*)&CanCreateInCurrentContextOriginal); - - */ - - ChangeLevels(); - - LOG_INFO(LogDev, "Switch levels."); - - auto AddressesToNull = Addresses::GetFunctionsToNull(); - const auto AddressesToReturnTrue = Addresses::GetFunctionsToReturnTrue(); - - auto ServerCheatAllIndex = GetFunctionIdxOrPtr(FindObject(L"/Script/FortniteGame.FortPlayerController.ServerCheatAll")); - - if (ServerCheatAllIndex) - AddressesToNull.push_back(__int64(FortPlayerControllerAthenaDefault->VFTable[ServerCheatAllIndex / 8])); - - for (auto func : AddressesToNull) - { - if (func == 0) - continue; - - LOG_INFO(LogDev, "Nulling 0x{:x}", func - __int64(GetModuleHandleW(0))); - - DWORD dwProtection; - VirtualProtect((PVOID)func, 1, PAGE_EXECUTE_READWRITE, &dwProtection); - - *(uint8_t*)func = 0xC3; - - DWORD dwTemp; - VirtualProtect((PVOID)func, 1, dwProtection, &dwTemp); - } - - for (auto func : AddressesToReturnTrue) - { - if (func == 0) - continue; - - LOG_INFO(LogDev, "Forcing return true on 0x{:x}", func - __int64(GetModuleHandleW(0))); - - MH_CreateHook((PVOID)func, ReturnTrueHook, nullptr); - MH_EnableHook((PVOID)func); - } - - if (Fortnite_Version != 22.4) - { - auto matchmaking = Memcury::Scanner::FindPattern("83 BD ? ? ? ? 01 7F 18 49 8D 4D D8 48 8B D6 E8 ? ? ? ? 48", false).Get(); - - if (!matchmaking) - matchmaking = Memcury::Scanner::FindPattern("83 7D 88 01 7F 0D 48 8B CE E8", false).Get(); - // if (!matchmaking) - // matchmaking = Memcury::Scanner::FindPattern("83 BD ? ? ? ? ? 7F 18 49 8D 4D D8 48 8B D7 E8").Get(); // 4.20 - - bool bMatchmakingSupported = matchmaking && Engine_Version >= 420; - int idx = 0; - - if (bMatchmakingSupported) // now check if it leads to the right place and where the jg is at - { - for (int i = 0; i < 9; i++) - { - auto byte = (uint8_t*)(matchmaking + i); - - if (IsBadReadPtr(byte)) - continue; - - // std::cout << std::format("[{}] 0x{:x}\n", i, (int)*byte); - - if (*byte == 0x7F) // jump if greater - { - bMatchmakingSupported = true; - idx = i; - break; - } - - bMatchmakingSupported = false; - } - } - - LOG_INFO(LogMatchmaker, "Matchmaking will {}", (bMatchmakingSupported ? "be supported" : "not be supported")); - - if (bMatchmakingSupported) - { - std::cout << "idx: " << idx << '\n'; - - auto before = (uint8_t*)(matchmaking + idx); - - std::cout << "before byte: " << (int)*before << '\n'; - - *before = 0x74; // jump if zero - } - } - - // return false; - - // UNetDriver::ReplicationDriverOffset = FindOffsetStruct("/Script/Engine.NetDriver", "ReplicationDriver"); // NetDriver->GetOffset("ReplicationDriver"); - - // Globals::bAbilitiesEnabled = Engine_Version < 500; - - if (Engine_Version < 420) - { - auto ApplyHomebaseEffectsOnPlayerSetupAddr = Memcury::Scanner::FindPattern("40 55 53 57 41 54 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 00 4C 8B").Get(); - - Hooking::MinHook::Hook((PVOID)ApplyHomebaseEffectsOnPlayerSetupAddr, ApplyHomebaseEffectsOnPlayerSetupHook, (PVOID*)&ApplyHomebaseEffectsOnPlayerSetupOriginal); - } - - Hooking::MinHook::Hook(GameModeDefault, FindObject(L"/Script/Engine.GameMode.ReadyToStartMatch"), AFortGameModeAthena::Athena_ReadyToStartMatchHook, - (PVOID*)&AFortGameModeAthena::Athena_ReadyToStartMatchOriginal, false, false, true); - Hooking::MinHook::Hook(GameModeDefault, FindObject(L"/Script/FortniteGame.FortGameModeAthena.OnAircraftEnteredDropZone"), AFortGameModeAthena::OnAircraftEnteredDropZoneHook, - (PVOID*)&AFortGameModeAthena::OnAircraftEnteredDropZoneOriginal, false, false, true, true); - Hooking::MinHook::Hook(GameModeDefault, FindObject(L"/Script/Engine.GameModeBase.SpawnDefaultPawnFor"), - AGameModeBase::SpawnDefaultPawnForHook, nullptr, false); - Hooking::MinHook::Hook(GameModeDefault, FindObject(L"/Script/Engine.GameModeBase.HandleStartingNewPlayer"), AFortGameModeAthena::Athena_HandleStartingNewPlayerHook, - (PVOID*)&AFortGameModeAthena::Athena_HandleStartingNewPlayerOriginal, false); - - static auto ControllerServerAttemptInteractFn = FindObject(L"/Script/FortniteGame.FortPlayerController.ServerAttemptInteract"); - - if (ControllerServerAttemptInteractFn) - { - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, ControllerServerAttemptInteractFn, AFortPlayerController::ServerAttemptInteractHook, - (PVOID*)&AFortPlayerController::ServerAttemptInteractOriginal, false, true); - } - else - { - Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__FortControllerComponent_Interaction"), - FindObject(L"/Script/FortniteGame.FortControllerComponent_Interaction.ServerAttemptInteract"), - AFortPlayerController::ServerAttemptInteractHook, (PVOID*)&AFortPlayerController::ServerAttemptInteractOriginal, false, true); - } - - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/Engine.PlayerController.ServerAcknowledgePossession"), - AFortPlayerControllerAthena::ServerAcknowledgePossessionHook, nullptr, false); - - if (Engine_Version >= 424) - { - static auto ServerRestartPlayerFn = FindObject(L"/Script/Engine.PlayerController.ServerRestartPlayer"); - auto ZoneServerRestartPlayer = FortPlayerControllerZoneDefault->VFTable[GetFunctionIdxOrPtr(ServerRestartPlayerFn) / 8]; - - LOG_INFO(LogDev, "ZoneServerRestartPlayer: 0x{:x}", __int64(ZoneServerRestartPlayer) - __int64(GetModuleHandleW(0))); - - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, ServerRestartPlayerFn, - // ZoneServerRestartPlayer, - AFortPlayerControllerAthena::ServerRestartPlayerHook, - nullptr, false); - } - - static auto ServerReturnToMainMenuFn = FindObject(L"/Script/FortniteGame.FortPlayerController.ServerReturnToMainMenu"); - static auto ServerReturnToMainMenuIdx = GetFunctionIdxOrPtr(ServerReturnToMainMenuFn) / 8; - auto FortServerRestartPlayer = FortPlayerControllerDefault->VFTable[ServerReturnToMainMenuIdx]; - VirtualSwap(FortPlayerControllerAthenaDefault->VFTable, ServerReturnToMainMenuIdx, FortServerRestartPlayer); - - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerSuicide"), - AFortPlayerController::ServerSuicideHook, nullptr, false); - - // HookInstruction(Addresses::UpdateTrackedAttributesLea, (PVOID)AFortPlayerControllerAthena::UpdateTrackedAttributesHook, "/Script/Engine.PlayerController.EnableCheats", ERelativeOffsets::LEA, FortPlayerControllerAthenaDefault); - // HookInstruction(Addresses::CombinePickupLea, (PVOID)AFortPickup::CombinePickupHook, "/Script/Engine.PlayerController.SetVirtualJoystickVisibility", ERelativeOffsets::LEA, FortPlayerControllerAthenaDefault); - - - if (Fortnite_Version == 13.40) - { - // HookInstruction(__int64(GetModuleHandleW(0)) + 0x1FC835D, (PVOID)UFortAthenaAIBotCustomizationData::ApplyOverrideCharacterCustomizationHook, "/Script/Engine.PlayerController.SetVirtualJoystickVisibility", ERelativeOffsets::CALL, nullptr); - } - - Hooking::MinHook::Hook(FortWeaponDefault, FindObject(L"/Script/FortniteGame.FortWeapon.ServerReleaseWeaponAbility"), - AFortWeapon::ServerReleaseWeaponAbilityHook, (PVOID*)&AFortWeapon::ServerReleaseWeaponAbilityOriginal, false, true); - - Hooking::MinHook::Hook(FindObject(L"/Script/Engine.Default__KismetSystemLibrary"), FindObject(L"/Script/Engine.KismetSystemLibrary.PrintString"), - UKismetSystemLibrary::PrintStringHook, (PVOID*)&UKismetSystemLibrary::PrintStringOriginal, false, true); - - Hooking::MinHook::Hook((PVOID)Addresses::GetSquadIdForCurrentPlayer, (PVOID)AFortGameSessionDedicatedAthena::GetSquadIdForCurrentPlayerHook); - - auto OnPlayImpactFXStringRef = Memcury::Scanner::FindStringRef(L"OnPlayImpactFX", true, 0); - __int64 OnPlayImpactFXAddr = 0; - - if (OnPlayImpactFXStringRef.Get()) - { - auto OnPlayImpactFXFunctionPtr = OnPlayImpactFXStringRef.ScanFor({ 0x48, 0x8D, 0x0D }).RelativeOffset(3).GetAs(); - auto OnPlayImpactFXPtrRef = Memcury::Scanner::FindPointerRef(OnPlayImpactFXFunctionPtr).Get(); - - for (int i = 0; i < 2000; i++) - { - if (*(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i) == 0x48 && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 2) == 0x5C) - { - OnPlayImpactFXAddr = OnPlayImpactFXPtrRef - i; - break; - } - - if (*(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i) == 0x4C && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 2) == 0xDC) - { - OnPlayImpactFXAddr = OnPlayImpactFXPtrRef - i; - break; - } - } - } - - LOG_INFO(LogDev, "OnPlayImpactFX: 0x{:x}", OnPlayImpactFXAddr - __int64(GetModuleHandleW(0))); - Hooking::MinHook::Hook((PVOID)OnPlayImpactFXAddr, AFortWeapon::OnPlayImpactFXHook, (PVOID*)&AFortWeapon::OnPlayImpactFXOriginal); - - /* Hooking::MinHook::Hook(FindObject("/Script/FortniteGame.Default__FortVolumeManager"), FindObject(L"/Script/FortniteGame.FortVolumeManager.SpawnVolume"), - AFortVolumeManager::SpawnVolumeHook, (PVOID*)&AFortVolumeManager::SpawnVolumeOriginal, false); - Hooking::MinHook::Hook((PVOID)GetFunctionIdxOrPtr(FindObject("/Script/FortniteGame.PlaysetLevelStreamComponent.SetPlayset"), true), - UPlaysetLevelStreamComponent::SetPlaysetHook, (PVOID*)&UPlaysetLevelStreamComponent::SetPlaysetOriginal); */ - - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerDropAllItems"), - AFortPlayerController::ServerDropAllItemsHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, - FindObject(L"/Script/FortniteGame.FortPlayerController.ServerSpawnInventoryDrop") - ? FindObject(L"/Script/FortniteGame.FortPlayerController.ServerSpawnInventoryDrop") : FindObject(L"/Script/FortniteGame.FortPlayerController.ServerAttemptInventoryDrop"), - AFortPlayerController::ServerAttemptInventoryDropHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerCheat"), - ServerCheatHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerExecuteInventoryItem"), - AFortPlayerController::ServerExecuteInventoryItemHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerPlayEmoteItem"), - AFortPlayerController::ServerPlayEmoteItemHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerRepairBuildingActor"), - AFortPlayerController::ServerRepairBuildingActorHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerCreateBuildingActor"), - AFortPlayerController::ServerCreateBuildingActorHook, (PVOID*)&AFortPlayerController::ServerCreateBuildingActorOriginal, false, true); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerBeginEditingBuildingActor"), - AFortPlayerController::ServerBeginEditingBuildingActorHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerEditBuildingActor"), - AFortPlayerController::ServerEditBuildingActorHook, (PVOID*)&AFortPlayerController::ServerEditBuildingActorOriginal, false, true); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerEndEditingBuildingActor"), - AFortPlayerController::ServerEndEditingBuildingActorHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerLoadingScreenDropped"), - AFortPlayerController::ServerLoadingScreenDroppedHook, (PVOID*)&AFortPlayerController::ServerLoadingScreenDroppedOriginal, false, true); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerReadyToStartMatch"), - AFortPlayerControllerAthena::ServerReadyToStartMatchHook, (PVOID*)&AFortPlayerControllerAthena::ServerReadyToStartMatchOriginal, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerControllerZone.ServerRequestSeatChange"), - AFortPlayerControllerAthena::ServerRequestSeatChangeHook, (PVOID*)&AFortPlayerControllerAthena::ServerRequestSeatChangeOriginal, false); - - // if (false) - if (Fortnite_Version > 6.10) // so on 6.10 there isa param and our little finder dont work for that so - { - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerControllerGameplay.StartGhostMode"), // (Milxnor) TODO: This changes to a component in later seasons. - AFortPlayerControllerAthena::StartGhostModeHook, (PVOID*)&AFortPlayerControllerAthena::StartGhostModeOriginal, false, true); // We can exec hook since it only gets called via blueprint. - - auto EndGhostModeFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerGameplay.EndGhostMode"); - - if (EndGhostModeFn) - { - auto EndGhostModeExec = (uint64)EndGhostModeFn->GetFunc(); - - for (int i = 0; i < 400; i++) - { - if (*(uint8_t*)(EndGhostModeExec + i) == 0xE9 // thanks 6.21 - || *(uint8_t*)(EndGhostModeExec + i) == 0xE8) - { - Hooking::MinHook::Hook((PVOID)Memcury::Scanner(EndGhostModeExec + i).RelativeOffset(1).Get(), AFortPlayerControllerAthena::EndGhostModeHook, (PVOID*)&AFortPlayerControllerAthena::EndGhostModeOriginal); - break; - } - } - } - } - - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerGiveCreativeItem"), - AFortPlayerControllerAthena::ServerGiveCreativeItemHook, nullptr, true); - - if (Fortnite_Version < 19) // its all screwed up idk - { - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerPlaySquadQuickChatMessage"), - AFortPlayerControllerAthena::ServerPlaySquadQuickChatMessageHook, nullptr, false); - } - - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerTeleportToPlaygroundLobbyIsland"), - AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook, nullptr, false); - - // Hooking::MinHook::Hook(FortPlayerStateAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.ServerSetInAircraft"), - // AFortPlayerStateAthena::ServerSetInAircraftHook, (PVOID*)&AFortPlayerStateAthena::ServerSetInAircraftOriginal, false, true); // We could use second method but eh - - if (false && FortOctopusVehicleDefault) // hooking broken on 19.10 i cant figure it out for the life of me - { - static auto ServerUpdateTowhookFn = FindObject(L"/Script/FortniteGame.FortOctopusVehicle.ServerUpdateTowhook"); - Hooking::MinHook::Hook(FortOctopusVehicleDefault, ServerUpdateTowhookFn, AFortOctopusVehicle::ServerUpdateTowhookHook, nullptr, false); - } - - Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__FortWeaponRangedMountedCannon"), - FindObject(L"/Script/FortniteGame.FortWeaponRangedMountedCannon.ServerFireActorInCannon"), AFortWeaponRangedMountedCannon::ServerFireActorInCannonHook, nullptr, false); - - static auto NetMulticast_Athena_BatchedDamageCuesFn = FindObject(L"/Script/FortniteGame.FortPawn.NetMulticast_Athena_BatchedDamageCues") ? FindObject(L"/Script/FortniteGame.FortPawn.NetMulticast_Athena_BatchedDamageCues") : FindObject(L"/Script/FortniteGame.FortPlayerPawnAthena.NetMulticast_Athena_BatchedDamageCues"); - - Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerPawn.ServerSendZiplineState"), - AFortPlayerPawn::ServerSendZiplineStateHook, nullptr, false); - - Hooking::MinHook::Hook((PVOID)GetFunctionIdxOrPtr(FindObject(L"/Script/FortniteGame.FortPlayerPawn.ServerOnExitVehicle"), true), AFortPlayerPawn::ServerOnExitVehicleHook, (PVOID*)&AFortPlayerPawn::ServerOnExitVehicleOriginal); - - if (Fortnite_Version == 1.11 || Fortnite_Version > 1.8) - { - Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerPawn.ServerReviveFromDBNO"), - AFortPlayerPawn::ServerReviveFromDBNOHook, nullptr, false); - } - - static auto FortGameplayAbilityAthena_PeriodicItemGrantDefault = FindObject(L"/Script/FortniteGame.Default__FortGameplayAbilityAthena_PeriodicItemGrant"); - - if (FortGameplayAbilityAthena_PeriodicItemGrantDefault) - { - Hooking::MinHook::Hook(FortGameplayAbilityAthena_PeriodicItemGrantDefault, FindObject(L"/Script/FortniteGame.FortGameplayAbilityAthena_PeriodicItemGrant.StopItemAwardTimers"), - UFortGameplayAbilityAthena_PeriodicItemGrant::StopItemAwardTimersHook, (PVOID*)&UFortGameplayAbilityAthena_PeriodicItemGrant::StopItemAwardTimersOriginal, false, true); - Hooking::MinHook::Hook(FortGameplayAbilityAthena_PeriodicItemGrantDefault, FindObject(L"/Script/FortniteGame.FortGameplayAbilityAthena_PeriodicItemGrant.StartItemAwardTimers"), - UFortGameplayAbilityAthena_PeriodicItemGrant::StartItemAwardTimersHook, (PVOID*)&UFortGameplayAbilityAthena_PeriodicItemGrant::StartItemAwardTimersOriginal, false, true); - } - - Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__FortAthenaMutator_Barrier"), FindObject(L"/Script/FortniteGame.FortAthenaMutator_Barrier.OnGamePhaseStepChanged"), - AFortAthenaMutator_Barrier::OnGamePhaseStepChangedHook, (PVOID*)&AFortAthenaMutator_Barrier::OnGamePhaseStepChangedOriginal, false, true); - Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__FortAthenaMutator_Disco"), FindObject(L"/Script/FortniteGame.FortAthenaMutator_Disco.OnGamePhaseStepChanged"), - AFortAthenaMutator_Disco::OnGamePhaseStepChangedHook, (PVOID*)&AFortAthenaMutator_Disco::OnGamePhaseStepChangedOriginal, false, true); - Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__FortAthenaMutator_GiveItemsAtGamePhaseStep"), FindObject(L"/Script/FortniteGame.FortAthenaMutator_GiveItemsAtGamePhaseStep.OnGamePhaseStepChanged"), - AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedHook, (PVOID*)&AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedOriginal, false, true); - - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.GetAIDirector"), - UFortKismetLibrary::GetAIDirectorHook, (PVOID*)&UFortKismetLibrary::GetAIDirectorOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.GetAIGoalManager"), - UFortKismetLibrary::GetAIGoalManagerHook, (PVOID*)&UFortKismetLibrary::GetAIGoalManagerOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_GiveItemToPlayer"), - UFortKismetLibrary::K2_GiveItemToPlayerHook, (PVOID*)&UFortKismetLibrary::K2_GiveItemToPlayerOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_GiveBuildingResource"), - UFortKismetLibrary::K2_GiveBuildingResourceHook, (PVOID*)&UFortKismetLibrary::K2_GiveBuildingResourceOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.GiveItemToInventoryOwner"), - UFortKismetLibrary::GiveItemToInventoryOwnerHook, (PVOID*)&UFortKismetLibrary::GiveItemToInventoryOwnerOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_RemoveItemFromPlayerByGuid"), - UFortKismetLibrary::K2_RemoveItemFromPlayerByGuidHook, (PVOID*)&UFortKismetLibrary::K2_RemoveItemFromPlayerByGuidOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_RemoveItemFromPlayer"), - UFortKismetLibrary::K2_RemoveItemFromPlayerHook, (PVOID*)&UFortKismetLibrary::K2_RemoveItemFromPlayerOriginal, false, true); - - Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, NetMulticast_Athena_BatchedDamageCuesFn, - AFortPawn::NetMulticast_Athena_BatchedDamageCuesHook, (PVOID*)&AFortPawn::NetMulticast_Athena_BatchedDamageCuesOriginal, false, true); - Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPawn.MovingEmoteStopped"), - AFortPawn::MovingEmoteStoppedHook, (PVOID*)&AFortPawn::MovingEmoteStoppedOriginal, false, true); - // Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerPawnAthena.OnCapsuleBeginOverlap") ? FindObject(L"/Script/FortniteGame.FortPlayerPawnAthena.OnCapsuleBeginOverlap") : FindObject(L"/Script/FortniteGame.FortPlayerPawn.OnCapsuleBeginOverlap"), - // AFortPlayerPawnAthena::OnCapsuleBeginOverlapHook, (PVOID*)&AFortPlayerPawnAthena::OnCapsuleBeginOverlapOriginal, false, true); - - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_RemoveFortItemFromPlayer"), - UFortKismetLibrary::K2_RemoveFortItemFromPlayerHook, (PVOID*)&UFortKismetLibrary::K2_RemoveFortItemFromPlayerOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_SpawnPickupInWorld"), - UFortKismetLibrary::K2_SpawnPickupInWorldHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_SpawnPickupInWorldWithLootTier"), - UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_SpawnPickupInWorldWithClass"), - UFortKismetLibrary::K2_SpawnPickupInWorldWithClassHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithClassOriginal, false, true); - - // if (Addresses::FreeArrayOfEntries || Addresses::FreeEntry) - { - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.PickLootDrops"), - UFortKismetLibrary::PickLootDropsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsOriginal, false, true); - } - - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.CreateTossAmmoPickupForWeaponItemDefinitionAtLocation"), - UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHook, (PVOID*)&UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.SpawnInstancedPickupInWorld"), - UFortKismetLibrary::SpawnInstancedPickupInWorldHook, (PVOID*)&UFortKismetLibrary::SpawnInstancedPickupInWorldOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.SpawnItemVariantPickupInWorld"), - UFortKismetLibrary::SpawnItemVariantPickupInWorldHook, (PVOID*)&UFortKismetLibrary::SpawnItemVariantPickupInWorldOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.PickLootDropsWithNamedWeights"), - UFortKismetLibrary::PickLootDropsWithNamedWeightsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsWithNamedWeightsOriginal, false, true); - - // TODO Add RemoveItemFromInventoryOwner - - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.SpawnToyInstance"), - AFortPlayerController::SpawnToyInstanceHook, (PVOID*)&AFortPlayerController::SpawnToyInstanceOriginal, false, true); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.DropSpecificItem"), - AFortPlayerController::DropSpecificItemHook, (PVOID*)&AFortPlayerController::DropSpecificItemOriginal, false, true); - - static auto FortAthenaSupplyDropDefault = FindObject(L"/Script/FortniteGame.Default__FortAthenaSupplyDrop"); - - Hooking::MinHook::Hook(FortAthenaSupplyDropDefault, FindObject(L"/Script/FortniteGame.FortAthenaSupplyDrop.SpawnPickup"), - AFortAthenaSupplyDrop::SpawnPickupHook, (PVOID*)&AFortAthenaSupplyDrop::SpawnPickupOriginal, false, true); - Hooking::MinHook::Hook(FortAthenaSupplyDropDefault, FindObject(L"/Script/FortniteGame.FortAthenaSupplyDrop.SpawnGameModePickup"), - AFortAthenaSupplyDrop::SpawnGameModePickupHook, (PVOID*)&AFortAthenaSupplyDrop::SpawnGameModePickupOriginal, false, true); - Hooking::MinHook::Hook(FortAthenaSupplyDropDefault, FindObject(L"/Script/FortniteGame.FortAthenaSupplyDrop.SpawnPickupFromItemEntry"), - AFortAthenaSupplyDrop::SpawnPickupFromItemEntryHook, (PVOID*)&AFortAthenaSupplyDrop::SpawnPickupFromItemEntryOriginal, false, true); - - static auto FortAthenaCreativePortalDefault = FindObject(L"/Script/FortniteGame.Default__FortAthenaCreativePortal"); - - Hooking::MinHook::Hook(FortAthenaCreativePortalDefault, FindObject(L"/Script/FortniteGame.FortAthenaCreativePortal.TeleportPlayerToLinkedVolume"), - AFortAthenaCreativePortal::TeleportPlayerToLinkedVolumeHook, (PVOID*)&AFortAthenaCreativePortal::TeleportPlayerToLinkedVolumeOriginal, false, true); - Hooking::MinHook::Hook(FortAthenaCreativePortalDefault, FindObject(L"/Script/FortniteGame.FortAthenaCreativePortal.TeleportPlayer"), - AFortAthenaCreativePortal::TeleportPlayerHook, (PVOID*)&AFortAthenaCreativePortal::TeleportPlayerOriginal, false, true); - - static auto FortMinigameDefault = FindObject(L"/Script/FortniteGame.Default__FortMinigame"); - - Hooking::MinHook::Hook(FortMinigameDefault, FindObject(L"/Script/FortniteGame.FortMinigame.ClearPlayerInventory"), - AFortMinigame::ClearPlayerInventoryHook, (PVOID*)&AFortMinigame::ClearPlayerInventoryOriginal, false, true); - - static auto InventoryManagementLibraryDefault = FindObject(L"/Script/FortniteGame.Default__InventoryManagementLibrary"); - - Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject(L"/Script/FortniteGame.InventoryManagementLibrary.AddItem"), - UInventoryManagementLibrary::AddItemHook, (PVOID*)&UInventoryManagementLibrary::AddItemOriginal, false, true); - Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject(L"/Script/FortniteGame.InventoryManagementLibrary.AddItems"), - UInventoryManagementLibrary::AddItemsHook, (PVOID*)&UInventoryManagementLibrary::AddItemsOriginal, false, true); - Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject(L"/Script/FortniteGame.InventoryManagementLibrary.GiveItemEntryToInventoryOwner"), - UInventoryManagementLibrary::GiveItemEntryToInventoryOwnerHook, (PVOID*)&UInventoryManagementLibrary::GiveItemEntryToInventoryOwnerOriginal, false, true); - Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject(L"/Script/FortniteGame.InventoryManagementLibrary.RemoveItem"), - UInventoryManagementLibrary::RemoveItemHook, (PVOID*)&UInventoryManagementLibrary::RemoveItemOriginal, false, true); - Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject(L"/Script/FortniteGame.InventoryManagementLibrary.RemoveItems"), - UInventoryManagementLibrary::RemoveItemsHook, (PVOID*)&UInventoryManagementLibrary::RemoveItemsOriginal, false, true); - Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject(L"/Script/FortniteGame.InventoryManagementLibrary.SwapItem"), - UInventoryManagementLibrary::SwapItemHook, (PVOID*)&UInventoryManagementLibrary::SwapItemOriginal, false, true); - Hooking::MinHook::Hook(InventoryManagementLibraryDefault, FindObject(L"/Script/FortniteGame.InventoryManagementLibrary.SwapItems"), - UInventoryManagementLibrary::SwapItemsHook, (PVOID*)&UInventoryManagementLibrary::SwapItemsOriginal, false, true); - - Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__FortAthenaVehicleSpawner"), FindObject(L"/Script/FortniteGame.FortAthenaVehicleSpawner.SpawnVehicle"), - AFortAthenaVehicleSpawner::SpawnVehicleHook, nullptr, false); - - static auto ServerHandlePickupInfoFn = FindObject(L"/Script/FortniteGame.FortPlayerPawn.ServerHandlePickupInfo"); - - if (ServerHandlePickupInfoFn) - { - Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, ServerHandlePickupInfoFn, AFortPlayerPawn::ServerHandlePickupInfoHook, nullptr, false); - } - else - { - Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerPawn.ServerHandlePickup"), - AFortPlayerPawn::ServerHandlePickupHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerPawn.ServerHandlePickupWithRequestedSwap"), - AFortPlayerPawn::ServerHandlePickupWithRequestedSwapHook, (PVOID*)&AFortPlayerPawn::ServerHandlePickupWithRequestedSwapOriginal, false, true); - } - - static auto PredictionKeyStruct = FindObject(L"/Script/GameplayAbilities.PredictionKey"); - static auto PredictionKeySize = PredictionKeyStruct->GetPropertiesSize(); - - { - int InternalServerTryActivateAbilityIndex = 0; - - if (Engine_Version > 420) - { - static auto OnRep_ReplicatedAnimMontageFn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.OnRep_ReplicatedAnimMontage"); - InternalServerTryActivateAbilityIndex = (GetFunctionIdxOrPtr(OnRep_ReplicatedAnimMontageFn) - 8) / 8; - } - else - { - static auto ServerTryActivateAbilityWithEventDataFn = FindObject(L"/Script/GameplayAbilities.AbilitySystemComponent.ServerTryActivateAbilityWithEventData"); - auto ServerTryActivateAbilityWithEventDataNativeAddr = __int64(FortAbilitySystemComponentAthenaDefault->VFTable[GetFunctionIdxOrPtr(ServerTryActivateAbilityWithEventDataFn) / 8]); - - for (int i = 0; i < 400; i++) - { - if ((*(uint8_t*)(ServerTryActivateAbilityWithEventDataNativeAddr + i) == 0xFF && *(uint8_t*)(ServerTryActivateAbilityWithEventDataNativeAddr + i + 1) == 0x90) || // call qword ptr - (*(uint8_t*)(ServerTryActivateAbilityWithEventDataNativeAddr + i) == 0xFF && *(uint8_t*)(ServerTryActivateAbilityWithEventDataNativeAddr + i + 1) == 0x93)) // call qword ptr - { - InternalServerTryActivateAbilityIndex = GetIndexFromVirtualFunctionCall(ServerTryActivateAbilityWithEventDataNativeAddr + i) / 8; - break; - } - } - } - - LOG_INFO(LogDev, "InternalServerTryActivateAbilityIndex: 0x{:x}", InternalServerTryActivateAbilityIndex); - - VirtualSwap(FortAbilitySystemComponentAthenaDefault->VFTable, InternalServerTryActivateAbilityIndex, UAbilitySystemComponent::InternalServerTryActivateAbilityHook); - } - - // if (Engine_Version >= 424) - { - static auto FortControllerComponent_AircraftDefault = FindObject(L"/Script/FortniteGame.Default__FortControllerComponent_Aircraft"); - static auto ServerAttemptAircraftJumpFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerAttemptAircraftJump") ? FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerAttemptAircraftJump") - : FindObject(L"/Script/FortniteGame.FortControllerComponent_Aircraft.ServerAttemptAircraftJump"); - - Hooking::MinHook::Hook(FortControllerComponent_AircraftDefault ? FortControllerComponent_AircraftDefault : FortPlayerControllerAthenaDefault, ServerAttemptAircraftJumpFn, - AFortPlayerController::ServerAttemptAircraftJumpHook, (PVOID*)&AFortPlayerController::ServerAttemptAircraftJumpOriginal, false); - } - - // if (false) - { - if (Fortnite_Version >= 8.3 && Engine_Version < 424) // I can't remember, so ServerAddMapMarker existed on like 8.0 or 8.1 or 8.2 but it didn't have the same params. - { - Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ServerAddMapMarker"), - UAthenaMarkerComponent::ServerAddMapMarkerHook, nullptr, false); - Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ServerRemoveMapMarker"), - UAthenaMarkerComponent::ServerRemoveMapMarkerHook, nullptr, false); - } - } - - Hooking::MinHook::Hook((PVOID)Addresses::GetPlayerViewpoint, (PVOID)AFortPlayerControllerAthena::GetPlayerViewPointHook, (PVOID*)&AFortPlayerControllerAthena::GetPlayerViewPointOriginal); - - Hooking::MinHook::Hook((PVOID)Addresses::TickFlush, (PVOID)UNetDriver::TickFlushHook, (PVOID*)&UNetDriver::TickFlushOriginal); - Hooking::MinHook::Hook((PVOID)Addresses::OnDamageServer, (PVOID)ABuildingActor::OnDamageServerHook, (PVOID*)&ABuildingActor::OnDamageServerOriginal); - - Hooking::MinHook::Hook((PVOID)Addresses::GetMaxTickRate, GetMaxTickRateHook); - // Hooking::MinHook::Hook((PVOID)Addresses::CollectGarbage, (PVOID)CollectGarbageHook, nullptr); - Hooking::MinHook::Hook((PVOID)Addresses::PickTeam, (PVOID)AFortGameModeAthena::Athena_PickTeamHook); - Hooking::MinHook::Hook((PVOID)Addresses::CompletePickupAnimation, (PVOID)AFortPickup::CompletePickupAnimationHook, (PVOID*)&AFortPickup::CompletePickupAnimationOriginal); - Hooking::MinHook::Hook((PVOID)Addresses::CanActivateAbility, ReturnTrueHook); // ahhh wtf - - uint64 ServerRemoveInventoryItemFunctionCallBeginFunctionAddr = 0; - - // if (Engine_Version >= 419) - if (Fortnite_Version < 20) - { - std::vector ServerRemoveInventoryItemCallFunctionStarts = Engine_Version == 416 - ? std::vector{ 0x44, 0x88, 0x4C } - : Fortnite_Version >= 16 - ? std::vector{ 0x48, 0x8B, 0xC4 } - : std::vector{ 0x48, 0x89, 0x5C }; - - auto ServerRemoveInventoryItemCallFunctionCall = FindFunctionCall(L"ServerRemoveInventoryItem", ServerRemoveInventoryItemCallFunctionStarts); - auto ServerRemoveInventoryItemFunctionCallRef = Memcury::Scanner::FindPointerRef((PVOID)ServerRemoveInventoryItemCallFunctionCall, 0, true); - - LOG_INFO(LogDev, "ServerRemoveInventoryItemFunctionCallRef: 0x{:x}", ServerRemoveInventoryItemFunctionCallRef.Get() - __int64(GetModuleHandleW(0))); - - for (int i = 0; i < 400; i++) - { - // LOG_INFO(LogDev, "[{}] Bugha: 0x{:x}", i, (int)(*(uint8_t*)ServerRemoveInventoryItemFunctionCallRef.Get() - i)); - if (*(uint8_t*)(uint8_t*)(ServerRemoveInventoryItemFunctionCallRef.Get() - i) == 0x48 && *(uint8_t*)(uint8_t*)(ServerRemoveInventoryItemFunctionCallRef.Get() - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(ServerRemoveInventoryItemFunctionCallRef.Get() - i + 2) == 0x5C) - { - ServerRemoveInventoryItemFunctionCallBeginFunctionAddr = ServerRemoveInventoryItemFunctionCallRef.Get() - i; - break; - } - - if (*(uint8_t*)(uint8_t*)(ServerRemoveInventoryItemFunctionCallRef.Get() - i) == 0x48 && *(uint8_t*)(uint8_t*)(ServerRemoveInventoryItemFunctionCallRef.Get() - i + 1) == 0x83 && *(uint8_t*)(uint8_t*)(ServerRemoveInventoryItemFunctionCallRef.Get() - i + 2) == 0xEC) - { - ServerRemoveInventoryItemFunctionCallBeginFunctionAddr = ServerRemoveInventoryItemFunctionCallRef.Get() - i; - break; - } - } - } - - Hooking::MinHook::Hook(Memcury::Scanner(ServerRemoveInventoryItemFunctionCallBeginFunctionAddr).GetAs(), UFortInventoryInterface::RemoveInventoryItemHook); - - // if (Fortnite_Version >= 13) - Hooking::MinHook::Hook((PVOID)Addresses::SetZoneToIndex, (PVOID)SetZoneToIndexHook, (PVOID*)&SetZoneToIndexOriginal); - Hooking::MinHook::Hook((PVOID)Addresses::EnterAircraft, (PVOID)AFortPlayerControllerAthena::EnterAircraftHook, (PVOID*)&AFortPlayerControllerAthena::EnterAircraftOriginal); - -#ifndef PROD - Hooking::MinHook::Hook((PVOID)Addresses::ProcessEvent, ProcessEventHook, (PVOID*)&UObject::ProcessEventOriginal); -#endif - - AddVehicleHook(); - - auto ClientOnPawnDiedCallAddr = FindFunctionCall(L"ClientOnPawnDied", Engine_Version == 416 ? std::vector{ 0x48, 0x89, 0x54 } : std::vector{ 0x48, 0x89, 0x5C }); - LOG_INFO(LogDev, "ClientOnPawnDiedCallAddr: 0x{:x}", ClientOnPawnDiedCallAddr - __int64(GetModuleHandleW(0))); - Hooking::MinHook::Hook((PVOID)ClientOnPawnDiedCallAddr, AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal); - - auto OnSafeZoneStateChangeAddr = FindFunctionCall(L"OnSafeZoneStateChange", Engine_Version == 416 ? std::vector{ 0x48, 0x89, 0x54 } : std::vector{ 0x48, 0x89, 0x5C }); - LOG_INFO(LogDev, "OnSafeZoneStateChangeAddr: 0x{:x}", OnSafeZoneStateChangeAddr - __int64(GetModuleHandleW(0))); - Hooking::MinHook::Hook((PVOID)OnSafeZoneStateChangeAddr, AFortSafeZoneIndicator::OnSafeZoneStateChangeHook, (PVOID*)&AFortSafeZoneIndicator::OnSafeZoneStateChangeOriginal); - - LOG_INFO(LogDev, "PredictionKeySize: 0x{:x} {}", PredictionKeySize, PredictionKeySize); - - static auto GameplayEventDataSize = FindObject(L"/Script/GameplayAbilities.GameplayEventData")->GetPropertiesSize(); - LOG_INFO(LogDev, "GameplayEventDataSize: 0x{:x} {}", GameplayEventDataSize, GameplayEventDataSize); - - { - int increaseOffset = 0x10; - - if (Engine_Version >= 424 && std::floor(Fortnite_Version) < 18) // checked on 11.31, 12.41, 14.60, 15.10, 16.40, 17.30 and 18.40 - increaseOffset += 0x8; - - auto MoveSoundStimulusBroadcastIntervalOffset = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawn", "MoveSoundStimulusBroadcastInterval"); - MemberOffsets::FortPlayerPawn::CorrectTags = MoveSoundStimulusBroadcastIntervalOffset + increaseOffset; - LOG_INFO(LogDev, "CorrectTags: 0x{:x}", MemberOffsets::FortPlayerPawn::CorrectTags); - MemberOffsets::FortPlayerState::PawnDeathLocation = FindOffsetStruct("/Script/FortniteGame.FortPlayerState", "PawnDeathLocation", false); - - MemberOffsets::FortPlayerPawnAthena::LastFallDistance = FindOffsetStruct("/Script/FortniteGame.FortPlayerPawnAthena", "LastFallDistance", false); - - MemberOffsets::FortPlayerStateAthena::DeathInfo = FindOffsetStruct("/Script/FortniteGame.FortPlayerStateAthena", "DeathInfo"); - MemberOffsets::FortPlayerStateAthena::KillScore = FindOffsetStruct("/Script/FortniteGame.FortPlayerStateAthena", "KillScore", false); - MemberOffsets::FortPlayerStateAthena::TeamKillScore = FindOffsetStruct("/Script/FortniteGame.FortPlayerStateAthena", "TeamKillScore", false); - - MemberOffsets::DeathInfo::bDBNO = FindOffsetStruct("/Script/FortniteGame.DeathInfo", "bDBNO"); - MemberOffsets::DeathInfo::DeathCause = FindOffsetStruct("/Script/FortniteGame.DeathInfo", "DeathCause"); - MemberOffsets::DeathInfo::bInitialized = FindOffsetStruct("/Script/FortniteGame.DeathInfo", "bInitialized", false); - MemberOffsets::DeathInfo::Distance = FindOffsetStruct("/Script/FortniteGame.DeathInfo", "Distance", false); - MemberOffsets::DeathInfo::DeathTags = FindOffsetStruct("/Script/FortniteGame.DeathInfo", "DeathTags", false); - MemberOffsets::DeathInfo::DeathLocation = FindOffsetStruct("/Script/FortniteGame.DeathInfo", "DeathLocation", false); - - MemberOffsets::DeathReport::Tags = FindOffsetStruct("/Script/FortniteGame.FortPlayerDeathReport", "Tags"); - MemberOffsets::DeathReport::KillerPawn = FindOffsetStruct("/Script/FortniteGame.FortPlayerDeathReport", "KillerPawn"); - MemberOffsets::DeathReport::KillerPlayerState = FindOffsetStruct("/Script/FortniteGame.FortPlayerDeathReport", "KillerPlayerState"); - MemberOffsets::DeathReport::DamageCauser = FindOffsetStruct("/Script/FortniteGame.FortPlayerDeathReport", "DamageCauser"); - } - - srand(time(0)); - - LOG_INFO(LogHook, "Finished!"); - - if (false) - { - while (true) - { - Sleep(10000); - } - } - else - { - Sleep(-1); - } - - return 0; -} - -BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) -{ - switch (reason) - { - case DLL_PROCESS_ATTACH: - CreateThread(0, 0, Main, 0, 0, 0); - break; - case DLL_PROCESS_DETACH: - break; - } - - return TRUE; -} - diff --git a/dependencies/reboot/Project Reboot 3.0/events.h b/dependencies/reboot/Project Reboot 3.0/events.h deleted file mode 100644 index 0068514..0000000 --- a/dependencies/reboot/Project Reboot 3.0/events.h +++ /dev/null @@ -1,827 +0,0 @@ -#pragma once - -#include - -#include "Object.h" -#include "reboot.h" -#include "GameplayStatics.h" -#include "FortPlaylistAthena.h" - -struct Event -{ - std::string EventDisplayName; - std::string LoaderClass; - std::string LoaderFunction; - __int64 AdditionalLoaderParams; - std::vector> OnReadyFunctions; - std::vector, __int64>> StartEventFunctions; - std::string ScriptingClass; - std::string PlaylistName; - double Version; - bool RequiredPlaylist = true; -}; - -static inline std::vector Events = -{ - Event - ( - "Rocket", - "", - "", - 0, - { - - }, - { - { - { - false, - // "/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C.startevent" - "/Game/Athena/Maps/Test/Events/BP_GeodeScripting.BP_GeodeScripting_C.LaunchSequence" - }, - - 0 - } - }, - - "/Game/Athena/Maps/Test/Events/BP_GeodeScripting.BP_GeodeScripting_C", - "/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo", - 4.5, - false - ), - Event - ( - "Crack Closure", - "/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C", - "", - 0, - { - - }, - { - { - { - false, - "/Game/Athena/Events/BP_Athena_Event_Components.BP_Athena_Event_Components_C.Final" - }, - - 0 - }, - { - { - true, - "/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C.Final" - }, - - 0 - }, - }, - - "/Game/Athena/Events/BP_Athena_Event_Components.BP_Athena_Event_Components_C", - "/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo", - 5.30, - false - ), - /* Event - ( - "Impact Lake", - "/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C", - "", - 0, - { - - }, - { - { - { - true, - "/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C.PlayFinalSink" - }, - - 0 - }, - }, - - "/Game/Athena/Events/BP_Athena_Event_Components.BP_Athena_Event_Components_C", - "/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo", - 5.41, - false - ), */ - Event - ( - "Butterfly", - "/Game/Athena/Prototype/Blueprints/Island/BP_Butterfly.BP_Butterfly_C", - "/Game/Athena/Prototype/Blueprints/Island/BP_Butterfly.BP_Butterfly_C.LoadButterflySublevel", - 1, - { - }, - { - { - { - true, - "/Game/Athena/Prototype/Blueprints/Island/BP_Butterfly.BP_Butterfly_C.ButterflySequence" // StartButterflyOnPlaylistLoaded calls this - }, - - 0 - } - }, - - "/Game/Athena/Prototype/Blueprints/Island/BP_Butterfly.BP_Butterfly_C", - "/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo", - 6.21, - false - ), - Event - ( - "The End Event Chapter 2", - "", - "", - 0, - { - - }, - { - { - { - false, - // "/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C.startevent" - "/Script/SpecialEventGameplayRuntime.SpecialEventScript.StartEventAtIndex" - }, - - 0 - } - }, - - "/Guava/Gameplay/BP_Guava_SpecialEventScript.BP_Guava_SpecialEventScript_C", // what - "/GuavaPlaylist/Playlist/Playlist_Guava.Playlist_Guava", - 18.40 - ), - Event - ( - "The Showdown", - "/Game/Athena/Prototype/Blueprints/Cattus/BP_CattusDoggus_Scripting.BP_CattusDoggus_Scripting_C", - "/Game/Athena/Prototype/Blueprints/Cattus/BP_CattusDoggus_Scripting.BP_CattusDoggus_Scripting_C.LoadCattusLevel", - 1, - { - { - true, - "/Game/Athena/Prototype/Blueprints/Cattus/BP_CattusDoggus_Scripting.BP_CattusDoggus_Scripting_C.OnReady_C11CA7624A74FBAEC54753A3C2BD4506" - } - }, - { - { - { - true, - "/Game/Athena/Prototype/Blueprints/Cattus/BP_CattusDoggus_Scripting.BP_CattusDoggus_Scripting_C.startevent" - }, - - 0 - } - }, - - "/Game/Athena/Prototype/Blueprints/Cattus/BP_CattusDoggus_Scripting.BP_CattusDoggus_Scripting_C", - "/Game/Athena/Playlists/Music/Playlist_Music_High.Playlist_Music_High", - 9.40, // also 9.41 - false - ), - Event - ( - "The Unvaulting", - "/Game/Athena/Prototype/Blueprints/White/BP_SnowScripting.BP_SnowScripting_C", - "/Game/Athena/Prototype/Blueprints/White/BP_SnowScripting.BP_SnowScripting_C.LoadSnowLevel", - 1, - { - // todo? - }, - { - { - { - true, - "/Game/Athena/Prototype/Blueprints/White/BP_SnowScripting.BP_SnowScripting_C.FinalSequence" - }, - - 0 - } - }, - - "/Game/Athena/Prototype/Blueprints/White/BP_SnowScripting.BP_SnowScripting_C", - "/Game/Athena/Playlists/Music/Playlist_Music_High.Playlist_Music_High", - 8.51 - // Probably requires playlist - ), - Event - ( - "Astronomical", - "/CycloneJerky/Gameplay/BP_Jerky_Loader.BP_Jerky_Loader_C", - // "/CycloneJerky/Gameplay/BP_Jerky_Loader.BP_Jerky_Loader_C.LoadJerkyLevel", - "", - 1, - { - { - false, - "/CycloneJerky/Gameplay/BP_Jerky_Scripting.BP_Jerky_Scripting_C.OnReady_093B6E664C060611B28F79B5E7052A39" - }, - { - true, - "/CycloneJerky/Gameplay/BP_Jerky_Loader.BP_Jerky_Loader_C.OnReady_7FE9744D479411040654F5886C078D08" - } - }, - { - { - /* { - false, - "/CycloneJerky/Gameplay/BP_Jerky_Scripting.BP_Jerky_Scripting_C.startevent" - }, */ - { - true, - "/CycloneJerky/Gameplay/BP_Jerky_Loader.BP_Jerky_Loader_C.startevent" - }, - - 0 - } - }, - - "/CycloneJerky/Gameplay/BP_Jerky_Scripting.BP_Jerky_Scripting_C", - "/Game/Athena/Playlists/Music/Playlist_Music_High.Playlist_Music_High", - 12.41 - ), - Event - ( - "Devourer of Worlds", - "/Junior/Blueprints/BP_Junior_Loader.BP_Junior_Loader_C", - "/Junior/Blueprints/BP_Junior_Loader.BP_Junior_Loader_C.LoadJuniorLevel", - 1, - { - { - false, - "/Junior/Blueprints/BP_Event_Master_Scripting.BP_Event_Master_Scripting_C.OnReady_872E6C4042121944B78EC9AC2797B053" - } - }, - { - { - { - false, - "/Junior/Blueprints/BP_Junior_Scripting.BP_Junior_Scripting_C.startevent" - }, - - 0 - } - }, - - "/Junior/Blueprints/BP_Junior_Scripting.BP_Junior_Scripting_C", - "/Game/Athena/Playlists/Music/Playlist_Junior_32.Playlist_Junior_32", - 14.60 - ), - Event( - "The End", - "", - "", - 1, - { - { - false, - "/Game/Athena/Prototype/Blueprints/NightNight/BP_NightNight_Scripting.BP_NightNight_Scripting_C.LoadNightNightLevel" // skunked - }, - { - false, - "/Game/Athena/Prototype/Blueprints/NightNight/BP_NightNight_Scripting.BP_NightNight_Scripting_C.OnReady_D0847F7B4E80F01E77156AA4E7131AF6" - } - }, - { - { - { - false, - "/Game/Athena/Prototype/Blueprints/NightNight/BP_NightNight_Scripting.BP_NightNight_Scripting_C.startevent" - }, - - 0 - } - }, - - "/Game/Athena/Prototype/Blueprints/NightNight/BP_NightNight_Scripting.BP_NightNight_Scripting_C", - "/Game/Athena/Playlists/Music/Playlist_Music_High.Playlist_Music_High", - 10.40, - false - ), - Event - ( - "Device", - "/Fritter/BP_Fritter_Loader.BP_Fritter_Loader_C", - // "/CycloneJerky/Gameplay/BP_Jerky_Loader.BP_Jerky_Loader_C.LoadJerkyLevel", - "", - 1, - { - { - false, - "/Fritter/BP_Fritter_Script.BP_Fritter_Script_C.OnReady_ACE66C28499BF8A59B3D88A981DDEF41" - }, - { - true, - "/Fritter/BP_Fritter_Loader.BP_Fritter_Loader_C.OnReady_1216203B4B63E3DFA03042A62380A674" - } - }, - { - { - /* { - false, - "/Fritter/BP_Fritter_Loader.BP_Fritter_Loader_C.startevent" - }, */ - { - true, - "/Fritter/BP_Fritter_Loader.BP_Fritter_Loader_C.startevent" - }, - - 0 - } - }, - - "/Fritter/BP_Fritter_Script.BP_Fritter_Script_C", - "/Game/Athena/Playlists/Fritter/Playlist_Fritter_High.Playlist_Fritter_High", - //"/Game/Athena/Playlists/Fritter/Playlist_Fritter_Lowest.Playlist_Fritter_Lowest", - 12.61 - ), - Event - ( - "Marshmello", - "", - "", - 1, - { - { - false, - "/Game/Athena/Environments/Festivus/Blueprints/BP_FestivusManager.BP_FestivusManager_C.OnReady_EE7676604ADFD92D7B2972AC0ABD4BB8" - } - }, - { - { - { - false, - // "/Game/Athena/Environments/Festivus/Blueprints/BP_FestivusManager.BP_FestivusManager_C.PlayConcert" - "/Game/Athena/Environments/Festivus/Blueprints/BP_FestivusManager.BP_FestivusManager_C.ServerPlayFestivus" // StartEventFromCalendarAsBackup calls this - }, - - 0 - } - }, - - "/Game/Athena/Environments/Festivus/Blueprints/BP_FestivusManager.BP_FestivusManager_C", - "/Game/Athena/Playlists/Music/Playlist_Music_High.Playlist_Music_High", - 7.30 - // Not sure if this requires playlist. - ), - Event - ( - "Rift Tour", - "", - "", - 0, - { - - }, - { - { - { - false, - // "/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C.startevent" - "/Script/SpecialEventGameplayRuntime.SpecialEventScript.StartEventAtIndex" - }, - - 0 - } - }, - - "/Buffet/Gameplay/Blueprints/Buffet_SpecialEventScript.Buffet_SpecialEventScript_C", - // "/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C", - "/BuffetPlaylist/Playlist/Playlist_Buffet.Playlist_Buffet", - 17.30 - ), - Event - ( - "Operation: Sky Fire", - "", - "", - 0, - { - - }, - { - { - { - false, - // "/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C.startevent" - "/Script/SpecialEventGameplayRuntime.SpecialEventScript.StartEventAtIndex" - }, - - 0 - } - }, - - "/Kiwi/Gameplay/Kiwi_EventScript.Kiwi_EventScript_C", - // "/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C", - "/KiwiPlaylist/Playlists/Playlist_Kiwi.Playlist_Kiwi", - 17.50 - ), - Event - ( - "Ice King Event", - "/Game/Athena/Prototype/Blueprints/Mooney/BP_MooneyLoader.BP_MooneyLoader_C", - "/Game/Athena/Prototype/Blueprints/Mooney/BP_MooneyLoader.BP_MooneyLoader_C.LoadMap", - 0, - { - { - false, - "/Game/Athena/Prototype/Blueprints/Mooney/BP_MooneyScripting.BP_MooneyScripting_C.OnReady_9968C1F648044523426FE198948B0CC9" - } - }, - { - { - { - false, - "/Game/Athena/Prototype/Blueprints/Mooney/BP_MooneyScripting.BP_MooneyScripting_C.BeginIceKingEvent" - }, - - 0 - } - }, - - "/Game/Athena/Prototype/Blueprints/Mooney/BP_MooneyScripting.BP_MooneyScripting_C", - "/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo", - 7.20 - ) -}; - -static inline UFortPlaylistAthena* GetEventPlaylist() -{ - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - return FindObject(CurrentEvent.PlaylistName, nullptr, ANY_PACKAGE); - } - - return nullptr; -} - -static inline Event GetOurEvent() -{ - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - { - return CurrentEvent; - } - } - - return Event(); -} - -static inline bool HasEvent() -{ - return GetOurEvent().Version == Fortnite_Version; -} - -static inline bool RequiresEventPlaylist() -{ - return false; // todo - // return GetOurEvent().PlaylistName != "/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo"; -} - -static inline UObject* GetEventScripting() -{ - Event OurEvent; - - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - { - OurEvent = CurrentEvent; - break; - } - } - - if (!OurEvent.Version) - return nullptr; - - auto ScriptingClass = FindObject(OurEvent.ScriptingClass); - - if (!ScriptingClass) - { - LOG_ERROR(LogEvent, "Failed to find ScriptingClass!"); - return nullptr; - } - - auto AllScripters = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ScriptingClass); - - if (AllScripters.size() <= 0) - { - LOG_ERROR(LogEvent, "Failed to find any scripters!"); - return nullptr; - } - - return AllScripters.at(0); -} - -static inline UObject* GetEventLoader(const std::string& OverrideLoaderName = "NULL") -{ - Event OurEvent; - - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - { - OurEvent = CurrentEvent; - break; - } - } - - if (!OurEvent.Version) - return nullptr; - - auto LoaderClass = FindObject(OverrideLoaderName == "NULL" ? OurEvent.LoaderClass : OverrideLoaderName); - - if (!LoaderClass) - { - LOG_ERROR(LogEvent, "Failed to find LoaderClass!"); - return nullptr; - } - - auto AllLoaders = UGameplayStatics::GetAllActorsOfClass(GetWorld(), LoaderClass); - - if (AllLoaders.size() <= 0) - { - // LOG_ERROR(LogEvent, "Failed to find any loaders!"); - return nullptr; - } - - return AllLoaders.at(0); -} - -static inline std::string GetEventName() -{ - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - return CurrentEvent.EventDisplayName; - } - - return ""; -} - -static inline void LoadEvent(bool* bWereAllSuccessful = nullptr) -{ - if (bWereAllSuccessful) - *bWereAllSuccessful = false; - - Event OurEvent; - - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - { - OurEvent = CurrentEvent; - break; - } - } - - if (!OurEvent.Version) - return; - - if (bWereAllSuccessful) - *bWereAllSuccessful = true; - - auto LoaderFunction = FindObject(OurEvent.LoaderFunction); - - if (!LoaderFunction) - { - LOG_ERROR(LogEvent, "Failed to find any loader function!"); - - if (bWereAllSuccessful) - *bWereAllSuccessful = false; - - return; - } - - auto Loader = GetEventLoader(); - - if (!Loader) - { - if (bWereAllSuccessful) - *bWereAllSuccessful = false; - - return; // GetEventLoader handles the printing - } - - Loader->ProcessEvent(LoaderFunction, &OurEvent.AdditionalLoaderParams); -} - -static inline bool CallOnReadys(bool* bWereAllSuccessful = nullptr) -{ - if (bWereAllSuccessful) - *bWereAllSuccessful = false; - - Event OurEvent; - - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - { - OurEvent = CurrentEvent; - break; - } - } - - if (!OurEvent.Version) - return false; - - auto EventScripting = GetEventScripting(); - - if (!EventScripting) - return false; // GetEventScripting handles the printing - - if (bWereAllSuccessful) - *bWereAllSuccessful = true; - - auto EventPlaylist = GetEventPlaylist(); - - struct { UObject* GameState; UObject* Playlist; FGameplayTagContainer PlaylistContextTags; } OnReadyParams{ Cast(GetWorld()->GetGameState()), EventPlaylist }; - - if (EventPlaylist) - { - static auto GameplayTagContainerOffset = EventPlaylist->GetOffset("GameplayTagContainer"); - OnReadyParams.PlaylistContextTags = EventPlaylist->Get(GameplayTagContainerOffset); - } - else - { - OnReadyParams.PlaylistContextTags = FGameplayTagContainer(); - } - - for (auto& OnReadyFunc : OurEvent.OnReadyFunctions) - { - if (OnReadyFunc.first) // func is in loader - { - auto EventLoader = GetEventLoader(); - - if (!EventLoader) - { - // if (bWereAllSuccessful) - // *bWereAllSuccessful = false; - - continue; // uhh?? - } - - auto OnReadyUFunc = FindObject(OnReadyFunc.second); - - if (!OnReadyUFunc) - { - LOG_ERROR(LogEvent, "Failed to find OnReady: {}", OnReadyFunc.second); - - if (bWereAllSuccessful) - *bWereAllSuccessful = false; - - continue; - } - - EventLoader->ProcessEvent(OnReadyUFunc, &OnReadyParams); - } - else // func is in scripting - { - auto OnReadyUFunc = FindObject(OnReadyFunc.second); - - if (!OnReadyUFunc) - { - LOG_ERROR(LogEvent, "Failed to find OnReady: {}", OnReadyFunc.second); - - if (bWereAllSuccessful) - *bWereAllSuccessful = false; - - continue; - } - - EventScripting->ProcessEvent(OnReadyUFunc, &OnReadyParams); - } - } - - /* if (Fortnite_Version == 17.30) - { - static auto onready = FindObject("/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C.OnReady_C6091CF24046D602CBB778A594DB5BA8"); - auto script = FindObject("/Buffet/Levels/Buffet_P.Buffet_P.PersistentLevel.BP_Event_Master_Scripting_2"); - - if (!script) - { - LOG_ERROR(LogEvent, "Failed to find MasterScripting"); - - if (bWereAllSuccessful) - *bWereAllSuccessful = false; - - return false; - } - - script->ProcessEvent(onready, &OnReadyParams); - } */ - - return true; -} - -static inline void StartEvent() -{ - Event OurEvent; - - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - { - OurEvent = CurrentEvent; - break; - } - } - - if (!OurEvent.Version) - return; - - auto EventScripting = GetEventScripting(); - - LOG_INFO(LogDev, "EventScripting {}", __int64(EventScripting)); - - if (EventScripting) - LOG_INFO(LogDev, "EventScripting Name {}", EventScripting->GetFullName()); - - // if (!EventScripting) - // return; // GetEventScripting handles the printing - - CallOnReadys(); - - if (Fortnite_Version >= 17.30) - { - static auto OnRep_RootStartTimeFn = FindObject("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.OnRep_RootStartTime"); - static auto MeshRootStartEventFn = FindObject("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.MeshRootStartEvent"); - auto SpecialEventScriptMeshActorClass = FindObject("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor"); - auto AllSpecialEventScriptMeshActors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), SpecialEventScriptMeshActorClass); - - if (AllSpecialEventScriptMeshActors.Num() > 0) - { - auto SpecialEventScriptMeshActor = AllSpecialEventScriptMeshActors.at(0); - - if (SpecialEventScriptMeshActor) - { - // if (false) - { - LOG_INFO(LogDev, "MeshRootStartEventFn!"); - SpecialEventScriptMeshActor->ProcessEvent(MeshRootStartEventFn); - SpecialEventScriptMeshActor->ProcessEvent(OnRep_RootStartTimeFn); - - return; - } - } - else - { - LOG_ERROR(LogEvent, "Failed to find SpecialEventScriptMeshActor"); - } - } - else - { - LOG_ERROR(LogEvent, "AllSpecialEventScriptMeshActors.Num() == 0"); - } - } - - for (auto& StartEventFunc : OurEvent.StartEventFunctions) - { - LOG_INFO(LogDev, "Finding {}", StartEventFunc.first.second); - - auto StartEventUFunc = FindObject(StartEventFunc.first.second); - - if (!StartEventUFunc) - { - LOG_ERROR(LogEvent, "Failed to find StartEvent: {}", StartEventFunc.first.second); - continue; - } - - if (StartEventFunc.first.first) // func is in loader - { - auto EventLoader = GetEventLoader(); - - if (!EventLoader) - continue; // uhh?? - - EventLoader->ProcessEvent(StartEventUFunc, &StartEventFunc.second); - } - else // func is in scripting - { - if (!EventScripting) - continue; - - EventScripting->ProcessEvent(StartEventUFunc, &StartEventFunc.second); - } - } -} - -static inline bool DoesEventRequireLoading() -{ - for (auto& CurrentEvent : Events) - { - if (CurrentEvent.Version == Fortnite_Version) - { - return !CurrentEvent.LoaderClass.empty() && !CurrentEvent.LoaderFunction.empty(); - } - } - - return false; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/extra.cpp b/dependencies/reboot/Project Reboot 3.0/extra.cpp deleted file mode 100644 index 0929dde..0000000 --- a/dependencies/reboot/Project Reboot 3.0/extra.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#include "die.h" - -#include "gui.h" - -void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int OverridePhaseMaybeIDFK) -{ - static auto ZoneDurationsOffset = Fortnite_Version >= 15 && Fortnite_Version < 18 ? 0x258 - : std::floor(Fortnite_Version) >= 18 ? 0x248 - : 0x1F8; // S13-S14 - - static auto GameMode_SafeZonePhaseOffset = GameModeAthena->GetOffset("SafeZonePhase"); - auto GameState = Cast(GameModeAthena->GetGameState()); - - if (!GameState) - return SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); - - auto SafeZoneIndicator = GameModeAthena->GetSafeZoneIndicator(); - - static auto GameState_SafeZonePhaseOffset = GameState->GetOffset("SafeZonePhase"); - - static int NewLateGameSafeZonePhase = 2; - - LOG_INFO(LogDev, "NewLateGameSafeZonePhase: {}", NewLateGameSafeZonePhase); - - if (Fortnite_Version < 13) - { - if (Globals::bLateGame.load()) - { - GameModeAthena->Get(GameMode_SafeZonePhaseOffset) = NewLateGameSafeZonePhase; - GameState->Get(GameState_SafeZonePhaseOffset) = NewLateGameSafeZonePhase; - SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); - - if (NewLateGameSafeZonePhase == EndReverseZonePhase) - { - bZoneReversing = false; - } - - if (NewLateGameSafeZonePhase == 2 || NewLateGameSafeZonePhase == 3) - { - if (SafeZoneIndicator) - SafeZoneIndicator->SkipShrinkSafeZone(); - else - LOG_WARN(LogZone, "Invalid SafeZoneIndicator!"); - } - - if (NewLateGameSafeZonePhase >= StartReverseZonePhase) // This means instead of going to the 8th phase its gonna go down. - { - bZoneReversing = true; - } - - if (bZoneReversing && bEnableReverseZone) NewLateGameSafeZonePhase--; - else NewLateGameSafeZonePhase++; - - return; - } - - return SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); - } - - if (!SafeZoneIndicator) - { - LOG_WARN(LogZone, "Invalid SafeZoneIndicator!"); - return SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); - } - - static auto SafeZoneFinishShrinkTimeOffset = SafeZoneIndicator->GetOffset("SafeZoneFinishShrinkTime"); - static auto SafeZoneStartShrinkTimeOffset = SafeZoneIndicator->GetOffset("SafeZoneStartShrinkTime"); - static auto RadiusOffset = SafeZoneIndicator->GetOffset("Radius"); - - static auto SafeZonePhaseOffset = GameModeAthena->GetOffset("SafeZonePhase"); - - static auto MapInfoOffset = GameState->GetOffset("MapInfo"); - auto MapInfo = GameState->Get(MapInfoOffset); - - if (!MapInfo) - { - LOG_WARN(LogZone, "Invalid MapInfo!") - return SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); - } - - static auto SafeZoneDefinitionOffset = MapInfo->GetOffset("SafeZoneDefinition"); - auto SafeZoneDefinition = MapInfo->GetPtr<__int64>(SafeZoneDefinitionOffset); - - LOG_INFO(LogDev, "SafeZoneDefinitionOffset: 0x{:x}", SafeZoneDefinitionOffset); - - static auto ZoneHoldDurationsOffset = ZoneDurationsOffset - 0x10; // fr - - auto& ZoneDurations = *(TArray*)(__int64(SafeZoneDefinition) + ZoneDurationsOffset); - auto& ZoneHoldDurations = *(TArray*)(__int64(SafeZoneDefinition) + ZoneHoldDurationsOffset); - - static bool bFilledDurations = false; - - if (!bFilledDurations) - { - bFilledDurations = true; - - auto CurrentPlaylist = GameState->GetCurrentPlaylist(); - UCurveTable* FortGameData = nullptr; - - static auto GameDataOffset = CurrentPlaylist->GetOffset("GameData"); - FortGameData = CurrentPlaylist ? CurrentPlaylist->Get>(GameDataOffset).Get() : nullptr; - - if (!FortGameData) - FortGameData = FindObject(L"/Game/Balance/AthenaGameData.AthenaGameData"); - - auto ShrinkTimeFName = UKismetStringLibrary::Conv_StringToName(L"Default.SafeZone.ShrinkTime"); - auto HoldTimeFName = UKismetStringLibrary::Conv_StringToName(L"Default.SafeZone.WaitTime"); - - for (int i = 0; i < ZoneDurations.Num(); i++) - { - ZoneDurations.at(i) = FortGameData->GetValueOfKey(FortGameData->GetKey(ShrinkTimeFName, i)); - } - for (int i = 0; i < ZoneHoldDurations.Num(); i++) - { - ZoneHoldDurations.at(i) = FortGameData->GetValueOfKey(FortGameData->GetKey(HoldTimeFName, i)); - } - } - - LOG_INFO(LogZone, "SafeZonePhase: {}", GameModeAthena->Get(SafeZonePhaseOffset)); - LOG_INFO(LogZone, "OverridePhaseMaybeIDFK: {}", OverridePhaseMaybeIDFK); - LOG_INFO(LogZone, "TimeSeconds: {}", UGameplayStatics::GetTimeSeconds(GetWorld())); - - if (Globals::bLateGame.load()) - { - GameModeAthena->Get(GameMode_SafeZonePhaseOffset) = NewLateGameSafeZonePhase; - GameState->Get(GameState_SafeZonePhaseOffset) = NewLateGameSafeZonePhase; - SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); - - if (NewLateGameSafeZonePhase == EndReverseZonePhase) - { - bZoneReversing = false; - } - - if (NewLateGameSafeZonePhase >= StartReverseZonePhase) // This means instead of going to the 8th phase its gonna go down. - { - bZoneReversing = true; - } - - if (bZoneReversing && bEnableReverseZone) NewLateGameSafeZonePhase--; - else NewLateGameSafeZonePhase++; - } - else - { - SetZoneToIndexOriginal(GameModeAthena, OverridePhaseMaybeIDFK); - } - - LOG_INFO(LogZone, "SafeZonePhase After: {}", GameModeAthena->Get(SafeZonePhaseOffset)); - - float ZoneHoldDuration = 0; - - if (GameModeAthena->Get(SafeZonePhaseOffset) >= 0 && GameModeAthena->Get(SafeZonePhaseOffset) < ZoneHoldDurations.Num()) - ZoneHoldDuration = ZoneHoldDurations.at(GameModeAthena->Get(SafeZonePhaseOffset)); - - SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset) = GameState->GetServerWorldTimeSeconds() + ZoneHoldDuration; - - float ZoneDuration = 0; - - if (GameModeAthena->Get(SafeZonePhaseOffset) >= 0 && GameModeAthena->Get(SafeZonePhaseOffset) < ZoneDurations.Num()) - ZoneDuration = ZoneDurations.at(GameModeAthena->Get(SafeZonePhaseOffset)); - - LOG_INFO(LogZone, "ZoneDuration: {}", ZoneDuration); - LOG_INFO(LogZone, "Duration: {}", SafeZoneIndicator->Get(RadiusOffset)); - - SafeZoneIndicator->Get(SafeZoneFinishShrinkTimeOffset) = SafeZoneIndicator->Get(SafeZoneStartShrinkTimeOffset) + ZoneDuration; - - if (NewLateGameSafeZonePhase == 3 || NewLateGameSafeZonePhase == 4) - { - if (SafeZoneIndicator) - SafeZoneIndicator->SkipShrinkSafeZone(); - else - LOG_WARN(LogZone, "Invalid SafeZoneIndicator!"); - } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/finder.cpp b/dependencies/reboot/Project Reboot 3.0/finder.cpp deleted file mode 100644 index ac42fd7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/finder.cpp +++ /dev/null @@ -1,205 +0,0 @@ -#include "finder.h" - -#include "reboot.h" -#include "FortPlayerControllerAthena.h" - -uint64 FindStartAircraftPhase() -{ - if (Engine_Version < 427) // they scuf it - { - auto strRef = Memcury::Scanner::FindStringRef(L"STARTAIRCRAFT").Get(); - - if (!strRef) - return 0; - - int NumCalls = 0; - - for (int i = 0; i < 150; i++) - { - if (*(uint8_t*)(strRef + i) == 0xE8) - { - LOG_INFO(LogDev, "Found call 0x{:x}", __int64(strRef + i) - __int64(GetModuleHandleW(0))); - NumCalls++; - - if (NumCalls == 2) // First is the str compare ig - { - return Memcury::Scanner(strRef + i).RelativeOffset(1).Get(); - } - } - } - } - else - { - auto StatAddress = Memcury::Scanner::FindStringRef(L"STAT_StartAircraftPhase").Get(); - - for (int i = 0; i < 1000; i++) - { - if (*(uint8_t*)(uint8_t*)(StatAddress - i) == 0x48 && *(uint8_t*)(uint8_t*)(StatAddress - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(StatAddress - i + 2) == 0xC4) - { - return StatAddress - i; - } - } - } - - return 0; -} - -uint64 FindGetSessionInterface() -{ - auto strRef = Memcury::Scanner::FindStringRef(L"OnDestroyReservedSessionComplete %s bSuccess: %d", true, 0, Fortnite_Version >= 19).Get(); - - LOG_INFO(LogDev, "strRef: 0x{:x}", strRef - __int64(GetModuleHandleW(0))); - - int NumCalls = 0; - NumCalls -= Fortnite_Version >= 19; - - for (int i = 0; i < 2000; i++) - { - if (*(uint8_t*)(strRef + i) == 0xE8) - { - LOG_INFO(LogDev, "Found call 0x{:x}", __int64(strRef + i) - __int64(GetModuleHandleW(0))); - NumCalls++; - - if (NumCalls == 2) // First is a FMemory::Free - { - return Memcury::Scanner(strRef + i).RelativeOffset(1).Get(); - } - } - } - - return 0; -} - -uint64 FindGetPlayerViewpoint() -{ - // We find FailedToSpawnPawn and then go back on VFT by 1. - - uint64 FailedToSpawnPawnAddr = 0; - - auto FailedToSpawnPawnStrRefAddr = Memcury::Scanner::FindStringRef(L"%s failed to spawn a pawn", true, 0, Fortnite_Version >= 19).Get(); - - for (int i = 0; i < 1000; i++) - { - if (*(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i) == 0x40 && *(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i + 1) == 0x53) - { - FailedToSpawnPawnAddr = FailedToSpawnPawnStrRefAddr - i; - break; - } - - if (*(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i) == 0x48 && *(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i + 2) == 0x5C) - { - FailedToSpawnPawnAddr = FailedToSpawnPawnStrRefAddr - i; - break; - } - } - - if (!FailedToSpawnPawnAddr) - { - LOG_ERROR(LogFinder, "Failed to find FailedToSpawnPawn! Report to Milxnor immediately."); - return 0; - } - - static auto FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); - void** const PlayerControllerVFT = FortPlayerControllerAthenaDefault->VFTable; - - int FailedToSpawnPawnIdx = 0; - - for (int i = 0; i < 500; i++) - { - if (PlayerControllerVFT[i] == (void*)FailedToSpawnPawnAddr) - { - FailedToSpawnPawnIdx = i; - break; - } - } - - if (FailedToSpawnPawnIdx == 0) - { - LOG_ERROR(LogFinder, "Failed to find FailedToSpawnPawn in virtual function table! Report to Milxnor immediately."); - return 0; - } - - return __int64(PlayerControllerVFT[FailedToSpawnPawnIdx - 1]); -} - -uint64 ApplyGameSessionPatch() -{ - auto GamePhaseStepStringAddr = Memcury::Scanner::FindStringRef(L"Gamephase Step: %s", false).Get(); - - uint64 BeginningOfGamePhaseStepFn = 0; - uint8_t* ByteToPatch = 0; - - if (!GamePhaseStepStringAddr) - { - LOG_WARN(LogFinder, "Unable to find GamePhaseStepString!"); - // return 0; - - BeginningOfGamePhaseStepFn = Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 E8 ? ? ? ? 48 8B D8 48 85 C0 0F 84 ? ? ? ? E8").Get(); // not actually the func but its fine - - if (!BeginningOfGamePhaseStepFn) - { - LOG_WARN(LogFinder, "Unable to find fallback sig for gamephase step! Report to Milxnor immediately."); - return 0; - } - } - - if (!BeginningOfGamePhaseStepFn && !ByteToPatch) - { - for (int i = 0; i < 3000; i++) - { - if (*(uint8_t*)(uint8_t*)(GamePhaseStepStringAddr - i) == 0x40 && *(uint8_t*)(uint8_t*)(GamePhaseStepStringAddr - i + 1) == 0x55) - { - BeginningOfGamePhaseStepFn = GamePhaseStepStringAddr - i; - break; - } - - if (*(uint8_t*)(uint8_t*)(GamePhaseStepStringAddr - i) == 0x48 && *(uint8_t*)(uint8_t*)(GamePhaseStepStringAddr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(GamePhaseStepStringAddr - i + 2) == 0x5C) - { - BeginningOfGamePhaseStepFn = GamePhaseStepStringAddr - i; - break; - } - - if (*(uint8_t*)(uint8_t*)(GamePhaseStepStringAddr - i) == 0x48 && *(uint8_t*)(uint8_t*)(GamePhaseStepStringAddr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(GamePhaseStepStringAddr - i + 2) == 0xC4) - { - BeginningOfGamePhaseStepFn = GamePhaseStepStringAddr - i; - break; - } - } - } - - if (!BeginningOfGamePhaseStepFn && !ByteToPatch) - { - LOG_WARN(LogFinder, "Unable to find beginning of GamePhaseStep! Report to Milxnor immediately."); - return 0; - } - - if (!ByteToPatch) - { - for (int i = 0; i < 500; i++) - { - if (*(uint8_t*)(uint8_t*)(BeginningOfGamePhaseStepFn + i) == 0x0F && *(uint8_t*)(uint8_t*)(BeginningOfGamePhaseStepFn + i + 1) == 0x84) - { - ByteToPatch = (uint8_t*)(uint8_t*)(BeginningOfGamePhaseStepFn + i + 1); - break; - } - } - } - - if (!ByteToPatch) - { - LOG_WARN(LogFinder, "Unable to find byte to patch for GamePhaseStep!"); - return 0; - } - - LOG_INFO(LogDev, "ByteToPatch: 0x{:x}", __int64(ByteToPatch) - __int64(GetModuleHandleW(0))); - - DWORD dwProtection; - VirtualProtect((PVOID)ByteToPatch, 1, PAGE_EXECUTE_READWRITE, &dwProtection); - - *ByteToPatch = 0x85; // jz -> jnz - - DWORD dwTemp; - VirtualProtect((PVOID)ByteToPatch, 1, dwProtection, &dwTemp); - - return 0; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/finder.h b/dependencies/reboot/Project Reboot 3.0/finder.h deleted file mode 100644 index d59e684..0000000 --- a/dependencies/reboot/Project Reboot 3.0/finder.h +++ /dev/null @@ -1,1911 +0,0 @@ -#pragma once - -#include "memcury.h" -#include "inc.h" - -#include "hooking.h" - -static inline uintptr_t FindBytes(Memcury::Scanner& Scanner, const std::vector& Bytes, int Count = 255, int SkipBytes = 0, bool bGoUp = false, int Skip = 0, const bool bPrint = false) -{ - if (!Scanner.Get()) - { - return 0; - } - - auto Base = __int64(GetModuleHandleW(0)); - - for (int i = 0 + SkipBytes; i < Count + SkipBytes; i++) // we should subtract from skip if goup - { - auto CurrentByte = *(Memcury::ASM::MNEMONIC*)(bGoUp ? Scanner.Get() - i : Scanner.Get() + i); - - if (bPrint) - LOG_INFO(LogFinder, "[{}] CurrentByte: 0x{:x} (0x{:x})", i, (int)CurrentByte, (bGoUp ? Scanner.Get() - i : Scanner.Get() + i) - Base); - - if (CurrentByte == Bytes[0]) - { - bool Found = true; - for (int j = 1; j < Bytes.size(); j++) - { - if (*(Memcury::ASM::MNEMONIC*)(bGoUp ? Scanner.Get() - i + j : Scanner.Get() + i + j) != Bytes[j]) - { - Found = false; - break; - } - } - if (Found) - { - if (Skip > 0) - { - Skip--; - continue; - } - - return bGoUp ? Scanner.Get() - i : Scanner.Get() + i; - } - } - - // std::cout << std::format("CurrentByte: 0x{:x}\n", (uint8_t)CurrentByte); - } - - return -1;// Scanner.Get(); -} - -/* static inline uintptr_t FindBytesArray(Memcury::Scanner& Scanner, const std::vector>& Bytes, int Count = 255, int SkipBytes = 0, bool bGoUp = false, int Skip = 0, const bool bPrint = false) -{ - for (auto& ByteArray : Bytes) - { - auto Res = FindBytes(Scanner, ByteArray, Count, SkipBytes, false, Skip, bPrint); - - if (Res) - return Res; - } - - return 0; -} */ - -static inline uint64 FindStaticFindObject(int StringSkip = 1) -{ - // ServerStatReplicatorInst then first jmp?? - - if (Engine_Version == 500) - { - auto addr = Memcury::Scanner::FindPattern("40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 45 33 F6 4C 8B E1 45 0F B6 E9 49 8B F8 41 8B C6", false).Get(); - - if (!addr) - addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 4C 89 64 24 ? 55 41 55 41 57 48 8B EC 48 83 EC 60 45 8A E1 4C 8B E9 48 83 FA").Get(); // 20.00 - - return addr; - } - - if (Engine_Version >= 427) // ok so like the func is split up in ida idfk what to do about it - { - if (Fortnite_Version < 18) - { - if (Fortnite_Version == 16.50) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 60 45 33 ED 45 8A F9 44 38 2D ? ? ? ? 49 8B F8 48 8B F2 4C 8B E1").Get(); - - return Memcury::Scanner::FindPattern("40 55 53 57 41 54 41 55 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85").Get(); - } - else - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 60 45 33 ED 45 8A F9 44 38 2D ? ? ? ? 49 8B F8 48 8B").Get(); - } - - if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("4C 8B DC 57 48 81 EC ? ? ? ? 80 3D ? ? ? ? ? 49 89 6B F0 49 89 73 E8").Get(); - - if (Engine_Version == 419) - { - auto iasdfk = Memcury::Scanner::FindPattern("4C 8B DC 49 89 5B 08 49 89 6B 18 49 89 73 20 57 41 56 41 57 48 83 EC 60 80 3D", false).Get(); - - if (!iasdfk) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 54 41 56 41 57 48 8B EC 48 83 EC 60 80 3D ? ? ? ? ? 45 0F B6 F1 49 8B F8").Get(); - - return iasdfk; - } - - auto Addr = Memcury::Scanner::FindStringRef(L"Illegal call to StaticFindObject() while serializing object data!", true, StringSkip, Engine_Version >= 427); - auto Final = FindBytes(Addr, { 0x48, 0x89, 0x5C }, 255, 0, true, 0, false); // Addr.ScanFor(bytes, false).Get(); - - return Final; -} - -static inline uint64 FindProcessEvent() -{ - if (Fortnite_Version < 14) - { - auto Addr = Memcury::Scanner::FindStringRef(L"AccessNoneNoContext"); - return FindBytes(Addr, { 0x40, 0x55 }, 2000); // Addr.ScanFor({ 0x40, 0x55 }).Get(); - } - - auto Addr = Memcury::Scanner::FindStringRef(L"UMeshNetworkComponent::ProcessEvent: Invalid mesh network node type: %s", true, 0, Engine_Version >= 500); - return Memcury::Scanner(FindBytes(Addr, { 0xE8 }, 2000, 0, false, Engine_Version < 500 ? 1 : 3)).RelativeOffset(1).Get(); // Addr.ScanFor({ 0x40, 0x55 }).Get(); -} - -static inline uint64 FindObjectArray() -{ - if (Engine_Version >= 421) - { - if (Fortnite_Version <= 6.02) - return Memcury::Scanner::FindPattern("48 8B 05 ? ? ? ? 48 8B 0C C8 48 8D 04 D1").RelativeOffset(3).Get(); - - return Memcury::Scanner::FindPattern("48 8B 05 ? ? ? ? 48 8B 0C C8 48 8B 04 D1").RelativeOffset(3).Get(); - } - - auto cc = Memcury::Scanner::FindPattern("48 8B 05 ? ? ? ? 48 8D 14 C8 EB 03 49 8B D6 8B 42 08 C1 E8 1D A8 01 0F 85 ? ? ? ? F7 86 ? ? ? ? ? ? ? ?", false); - auto addr = cc.Get() ? cc.RelativeOffset(3).Get() : 0; // 4.16 - - if (!addr) - { - if (Engine_Version >= 416 || Engine_Version <= 420) - { - auto aa = Memcury::Scanner::FindPattern("48 8B 05 ? ? ? ? 48 8D 1C C8 81 4B ? ? ? ? ? 49 63 76 30", false); - addr = aa.Get() ? aa.RelativeOffset(3).Get() : 0; - - if (!addr) - { - addr = Memcury::Scanner::FindPattern("48 8B 05 ? ? ? ? 48 8D 1C C8 81 4B ? ? ? ? ? 49 63 76 30", false).Get() ? Memcury::Scanner::FindPattern("48 8B 05 ? ? ? ? 48 8D 1C C8 81 4B ? ? ? ? ? 49 63 76 30", false).RelativeOffset(3).Get() : 0; - } - } - } - - return addr; -} - -static inline uint64 FindAddToAlivePlayers() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"FortGameModeAthena: Player [%s] doesn't have a valid PvP team, and won't be added to the alive players list.").Get(); - - if (!Addrr) - return 0; - - for (int i = 0; i < 4000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x85 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xD2) - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindFinishResurrection() -{ - uintptr_t Addrr = Engine_Version >= 427 ? FindNameRef(L"OnResurrectionCompleted") : FindFunctionCall(L"OnResurrectionCompleted"); // Call is inlined - - if (!Addrr) - return 0; - - // auto addr = Memcury::Scanner::FindPattern("40 53 48 83 EC 20 0F B6 81 ? ? ? ? 83 C2 03 48 8B D9 3B D0 0F 85").Get(); - // return addr; - - LOG_INFO(LogDev, "WTF: 0x{:x}", Addrr - __int64(GetModuleHandleW(0))); - - for (int i = 0; i < 2000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x53) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindGetSquadIdForCurrentPlayer() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"GetSquadIdForCurrentPlayer failed to find a squad id for player %s", true, 0, Fortnite_Version >= 19).Get(); - - if (!Addrr) - return 0; - - for (int i = 0; i < 2000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindRebootingDelegate() -{ - if (Fortnite_Version < 8.3) - return 0; - - auto ServerOnAttemptInteractAddr = Memcury::Scanner::FindStringRef(L"[SCM] ABuildingGameplayActorSpawnMachine::ServerOnAttemptInteract - Start Rebooting", true, 0, Fortnite_Version >= 16).Get(); - - for (int i = 0; i < 10000; i++) - { - if ((*(uint8_t*)(uint8_t*)(ServerOnAttemptInteractAddr + i) == 0x48 && *(uint8_t*)(uint8_t*)(ServerOnAttemptInteractAddr + i + 1) == 0x8D - && *(uint8_t*)(uint8_t*)(ServerOnAttemptInteractAddr + i + 2) == 0x05)) - { - auto loadAddress = Memcury::Scanner(ServerOnAttemptInteractAddr + i).RelativeOffset(3).Get(); - - if (IsNullSub(loadAddress)) // Safety - return ServerOnAttemptInteractAddr + i; - } - } - - auto addr = 0; // Memcury::Scanner::FindPattern("48 8D 05 ? ? ? ? 33 F6 48 89 44 24 ? 49 8B CE 49 8B 06 89 74 24 60 FF 90 ? ? ? ? 4C 8B A4 24 ? ? ? ? 48 8B 88 ? ? ? ? 48 85 C9").Get(); - - return addr; -} - -static inline uint64 FindPickupInitialize() -{ - if (Engine_Version == 419) - return Memcury::Scanner::FindPattern("48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 80 B9 ? ? ? ? ? 41 0F B6 E9").Get(); // 1.11 - if (Engine_Version == 420) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 41 56 48 83 EC 20 80 B9 ? ? ? ? ? 45 0F B6 F1 49 8B E8").Get(); // 4.1 - if (Engine_Version == 421) - { - auto addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 57 41 57 48 83 EC 30 80 B9 ? ? ? ? ? 41 0F B6", false).Get(); // 6.21 - - if (!addr) - addr = Memcury::Scanner::FindPattern("48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 80 B9 ? ? ? ? ? 41 0F B6 E9").Get(); // 5.41 - - return addr; - } - if (Engine_Version == 422) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 41 56 41 57 48 83 EC 30 80 B9 ? ? ? ? ? 45 0F B6 F1").Get(); // 7.30 - if (Engine_Version == 423) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 41 56 41 57 48 83 EC 30 80 B9 ? ? ? ? ? 45 0F B6 F1 4D").Get(); // 8.51 & 10.40 - - return 0; -} - -static inline uint64 FindCreateNetDriver() -{ - return 0; -} - -static inline uint64 FindLoadAsset() -{ - return 0; - - auto Addrr = Memcury::Scanner::FindStringRef(L"Loaded delay-load asset %s").Get(); - - for (int i = 0; i < 2000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && - (*(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x74 || *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x6C)) - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindKickPlayer() -{ - if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("40 53 56 48 81 EC ? ? ? ? 48 8B DA 48 8B F1 E8 ? ? ? ? 48 8B 06 48 8B CE").Get(); - if (std::floor(Fortnite_Version) == 18) - return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 4C 89 60 20 55 41 56 41 57 48 8B EC 48 83 EC 60 48 83 65 ? ? 4C 8B F2 83 65 E8 00 4C 8B E1 83 65 EC").Get(); - if (std::floor(Fortnite_Version) == 19) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 56 57 48 8B EC 48 83 EC 60 48 8B FA 48 8B F1 E8").Get(); - if (Engine_Version >= 423 || Engine_Version <= 425) // && instead of || ?? - return Memcury::Scanner::FindPattern("48 89 5C 24 08 48 89 74 24 10 57 48 83 EC ? 49 8B F0 48 8B DA 48 85 D2").Get(); - - uint64 Ret = 0; - - auto Addr = Memcury::Scanner::FindStringRef(L"Validation Failure: %s. kicking %s", false, 0, Fortnite_Version >= 19); - - if (Addr.Get()) - { - Ret = Addr.Get() ? FindBytes(Addr, { 0x40, 0x55 }, 1000, 0, true) : Ret; - - if (!Ret) - Ret = Addr.Get() ? FindBytes(Addr, { 0x40, 0x53 }, 2000, 0, true) : Ret; - } - - if (Ret) - return Ret; - - auto Addr2 = Memcury::Scanner::FindStringRef(L"Failed to kick player"); // L"KickPlayer %s Reason %s" - auto Addrr = Addr2.Get(); - - for (int i = 0; i < 3000; i++) - { - /* if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x53) - { - return Addrr - i; - } */ - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - - if (Fortnite_Version >= 17) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) - { - return Addrr - i; - } - } - } - - return Memcury::Scanner::FindPattern("40 53 41 56 48 81 EC ? ? ? ? 48 8B 01 48 8B DA 4C 8B F1 FF 90").Get(); -} - -static inline uint64 FindInitHost() -{ - if (Engine_Version == 427) // idk im dumb - { - auto addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 56 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B F1 4C 8D 05", false).Get(); - - if (!addr) // s18 - addr = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 56 41 57 48 8D 68 A1 48 81 EC ? ? ? ? 48 8B F1 4C 8D 35 ? ? ? ? 4D").Get(); - - return addr; - } - - auto Addr = Memcury::Scanner::FindStringRef(L"BeaconPort="); - return FindBytes(Addr, (Engine_Version == 427 ? std::vector{ 0x48, 0x8B, 0x5C } : std::vector{ 0x48, 0x8B, 0xC4 }), 1000, 0, true); -} - -static inline uint64 FindPickSupplyDropLocation() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"PickSupplyDropLocation: Failed to find valid location using rejection. Using safe zone location.", true, 0).Get(); - - if (!Addrr) - return 0; - - // Newer versions it is "AFortAthenaMapInfo::PickSupplyDropLocation" (no wide str), but they also changed params so ill add later. - - for (int i = 0; i < 1000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindPauseBeaconRequests() -{ - if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 ED 48 8B F1 84 D2 74 27 80 3D").Get(); - - if (Engine_Version == 427) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 30 33 F6 48 8B F9 84 D2 74").Get(); - - // todo try 40 53 48 83 EC 30 48 8B ? 84 D2 74 ? 80 3D for S1-S15 - - if (Engine_Version == 426) - { - auto addr = Memcury::Scanner::FindPattern("40 57 48 83 EC 30 48 8B F9 84 D2 74 62 80 3D", false).Get(); - - if (!addr) - addr = Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 5E 80 3D").Get(); - - return addr; - } - - if (Engine_Version == 420) - return Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 68 80 3D ? ? ? ? ? 72 2C 48 8B 05 ? ? ? ? 4C 8D 44").Get(); - - if (Fortnite_Version == 6.30 || Fortnite_Version == 6.31) // bro for real! (i think its cuz theres like 3 refs to the same string) - return Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 68 80 3D").Get(); - - if (Engine_Version == 419) - { - auto aa = Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 6F 80 3D", false).Get(); - - if (!aa) - return Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 68 80 3D ? ? ? ? ? 72").Get(); // i supposed this is just because its getitng wrong string ref - - return aa; - } - - if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("40 53 48 83 EC 30 48 8B D9 84 D2 74 6F 80 3D ? ? ? ? ? 72 33 48 8B 05").Get(); - - auto Addr = Memcury::Scanner::FindStringRef(L"All Beacon Requests Resumed."); - return FindBytes(Addr, { 0x40, 0x53 }, 1000, 0, true); -} - -static inline uint64 FindOnRep_ZiplineState() -{ - if (Fortnite_Version < 7) - return 0; - - auto Addrr = Memcury::Scanner::FindStringRef(L"ZIPLINES!! Role(%s) AFortPlayerPawn::OnRep_ZiplineState ZiplineState.bIsZiplining=%d", false).Get(); - - if (!Addrr) - Addrr = Memcury::Scanner::FindStringRef(L"ZIPLINES!! GetLocalRole()(%s) AFortPlayerPawn::OnRep_ZiplineState ZiplineState.bIsZiplining=%d", false).Get(); - - if (!Addrr) - Addrr = Memcury::Scanner::FindStringRef("AFortPlayerPawn::HandleZiplineStateChanged").Get(); // L"%s LocalRole[%s] ZiplineState.bIsZiplining[%d]" - - if (!Addrr) - return 0; - - for (int i = 0; i < 400; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x53) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindGetMaxTickRate() // UEngine::getmaxtickrate -{ - // TODO switch to index maybe? - - /* auto GetMaxTickRateIndex = *Memcury::Scanner::FindStringRef(L"GETMAXTICKRATE") - .ScanFor({ 0x4D, 0x8B, 0xC7, 0xE8 }) - .RelativeOffset(4) - .ScanFor({ 0xFF, 0x90 }) - .AbsoluteOffset(2) - .GetAs() / 8; - - LOG_INFO(LogHook, "GetMaxTickRateIndex {}", GetMaxTickRateIndex); */ - - if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("40 53 48 83 EC 50 0F 29 74 24 ? 48 8B D9 0F 29 7C 24 ? 0F 28 F9 44 0F 29").Get(); // the string is in func + it's in function chunks. - - if (Engine_Version == 427) - return Memcury::Scanner::FindPattern("40 53 48 83 EC 60 0F 29 74 24 ? 48 8B D9 0F 29 7C 24 ? 0F 28").Get(); // function chunks woo! - - auto Addrr = Memcury::Scanner::FindStringRef(L"Hitching by request!").Get(); - - if (!Addrr) - return 0; - - for (int i = 0; i < 400; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x53) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - } - - return 0; - // return FindBytes(stringRef, Fortnite_Version <= 4.1 ? std::vector{ 0x40, 0x53 } : std::vector{ 0x48, 0x89, 0x5C }, 1000, 0, true); -} - -uint64 FindStartAircraftPhase(); -uint64 FindGetSessionInterface(); -uint64 FindGetPlayerViewpoint(); -uint64 ApplyGameSessionPatch(); - -static inline uint64 FindFree() -{ - uint64 addr = 0; - - if (Engine_Version >= 420 && Engine_Version <= 426) - addr = Memcury::Scanner::FindPattern("48 85 C9 74 2E 53 48 83 EC 20 48 8B D9").Get(); - else if (Engine_Version >= 427) - addr = Memcury::Scanner::FindPattern("48 85 C9 0F 84 ? ? ? ? 53 48 83 EC 20 48 89 7C 24 ? 48 8B D9 48 8B 3D").Get(); - - return addr; -} - -static inline uint64 FindStepExplicitProperty() -{ - return Memcury::Scanner::FindPattern("41 8B 40 ? 4D 8B C8").Get(); -} - -static inline uint64 FindIsNetRelevantForOffset() -{ - if (Engine_Version == 416) // checked on 1.7.2 & 1.8 - return 0x420 / 8; - if (Fortnite_Version == 1.11 || (Fortnite_Version >= 2.42 && Fortnite_Version <= 3.2)) // checked 1.11, 2.4.2, 2.5, 3.0, 3.1 - return 0x418 / 8; - - return 0; -} - -static inline uint64 FindActorChannelClose() -{ - auto StringRef = Memcury::Scanner::FindStringRef(L"UActorChannel::Close: ChIndex: %d, Actor: %s"); - - return FindBytes(StringRef, { 0x48, 0x89, 0x5C }, 1000, 0, true); -} - -static inline uint64 FindSpawnActor() -{ - if (Engine_Version >= 427) - { - auto stat = Memcury::Scanner::FindStringRef(L"STAT_SpawnActorTime"); - return FindBytes(stat, { 0x48, 0x8B, 0xC4 }, 3000, 0, true); - } - - auto Addr = Memcury::Scanner::FindStringRef(L"SpawnActor failed because no class was specified"); - - if (Engine_Version >= 416 && Fortnite_Version <= 3.2) - return FindBytes(Addr, { 0x40, 0x55 }, 3000, 0, true); - - return FindBytes(Addr, { 0x4C, 0x8B, 0xDC }, 3000, 0, true); -} - -static inline uint64 FindSetWorld() -{ - if (Engine_Version < 426) - return Memcury::Scanner::FindStringRef(L"AOnlineBeaconHost::InitHost failed") - .ScanFor({ 0x48, 0x8B, 0xD0, 0xE8 }, false) - .RelativeOffset(4) - .Get(); // THANKS ENDER - - int SetWorldIndex = 0; - - int Fortnite_Season = std::floor(Fortnite_Version); - - if (Fortnite_Season == 13) - SetWorldIndex = 0x70; - else if (Fortnite_Season == 14 || Fortnite_Version <= 15.2) - SetWorldIndex = 0x71; - else if (Fortnite_Version >= 15.3 && Fortnite_Season < 18) // i havent tested 15.2 - SetWorldIndex = 0x72; - else if (Fortnite_Season == 18) - SetWorldIndex = 0x73; - else if (Fortnite_Season >= 19 && Fortnite_Season < 21) - SetWorldIndex = 0x7A; - if (Fortnite_Version == 20.40) - SetWorldIndex = 0x7B; - - // static auto DefaultNetDriver = FindObject("/Script/Engine.Default__NetDriver"); - return SetWorldIndex; -} - -static inline uint64 FindInitListen() -{ - if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("4C 8B DC 49 89 5B 10 49 89 73 18 57 48 83 EC 50 48 8B BC 24 ?? ?? ?? ?? 49 8B F0 48 8B").Get(); - - if (Engine_Version >= 427) - return Memcury::Scanner::FindPattern("4C 8B DC 49 89 5B 08 49 89 73 10 57 48 83 EC 50 48 8B BC 24 ? ? ? ? 49 8B F0 48 8B 01 48 8B").Get(); - - auto Addr = Memcury::Scanner::FindStringRef(L"%s IpNetDriver listening on port %i"); - return FindBytes(Addr, Engine_Version < 427 ? std::vector{ 0x48, 0x89, 0x5C } : std::vector{ 0x4C, 0x8B, 0xDC }, 2000, 0, true, 1); -} - -static inline uint64 FindOnDamageServer() -{ - auto Addr = FindFunctionCall(L"OnDamageServer", - Engine_Version == 416 ? std::vector{ 0x4C, 0x89, 0x4C } : - Engine_Version == 419 || Engine_Version >= 427 ? std::vector{ 0x48, 0x8B, 0xC4 } : std::vector{ 0x40, 0x55 } - ); - - return Addr; -} - -static inline uint64 FindStaticLoadObject() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"STAT_LoadObject", false).Get(); - - if (!Addrr) - { - auto StrRef2 = Memcury::Scanner::FindStringRef(L"Calling StaticLoadObject during PostLoad may result in hitches during streaming."); - return FindBytes(StrRef2, { 0x40, 0x55 }, 1000, 0, true); - } - - for (int i = 0; i < 400; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x4C && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x4C) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindSpecConstructor() -{ - if (Engine_Version == 420) - return Memcury::Scanner::FindPattern("80 61 29 F8 48 8B 44 24 ?").Get(); // 3.5 - - if (Engine_Version == 421) - return Memcury::Scanner::FindPattern("80 61 29 F8 48 8B 44 24 ?").Get(); // 6.21 - - if (Engine_Version == 422) - return Memcury::Scanner::FindPattern("80 61 29 F8 48 8B 44 24 ?").Get(); // was a guess - - if (Engine_Version == 423) - return Memcury::Scanner::FindPattern("80 61 29 F8 48 8B 44 24 ?").Get(); // was a guess - - if (Engine_Version == 424) - return Memcury::Scanner::FindPattern("80 61 29 F8 48 8B 44 24 ?").Get(); // 11.31 - - if (Engine_Version == 425) - { - auto ba = Memcury::Scanner::FindPattern("48 8B 44 24 ? 80 61 29 F8 80 61 31 FE 48 89 41 20 33 C0 89 41", false).Get(); - - if (!ba) - ba = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 41 56 48 83 EC 20 45 33 F6 48 C7 01 ? ? ? ? 48 C7 41").Get(); // i think this right for 12.00 ?? - - return ba; - } - - if (Engine_Version == 426) - return Memcury::Scanner::FindPattern("80 61 31 FE 0F 57 C0 80 61 29 F0 48 8B 44 24 ? 48").Get(); - - if (Engine_Version == 427) - return Memcury::Scanner::FindPattern("80 61 31 FE 41 83 C9 FF 80 61 29 F0 48 8B 44 24 ? 48 89 41").Get(); - - if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("4C 8B C9 48 8B 44 24 ? 83 C9 FF 41 80 61 ? ? 41 80 61 ? ? 49 89 41 20 33 C0 41 88 41 30 49 89 41").Get(); - - return 0; -} - -static inline uint64 FindCreateBuildingActorCallForDeco() // kill me -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"ServerCreateBuildingAndSpawnDeco called without a valid DecoItemDef").Get(); // honestly L (we should get it from the ufunc not string) - - if (!Addrr) - return 0; - - for (int i = 0; i < 10000; i++) - { - if ((*(uint8_t*)(uint8_t*)(Addrr + i) == 0xC6 && *(uint8_t*)(uint8_t*)(Addrr + i + 6) == 0xE8)) // Checked 10.40 - { - return Addrr - i + 6; - } - } - - return 0; -} - -static inline uint64 FindUpdateTrackedAttributesLea() // kill me -{ - // 10.40 = (__int64(GetModuleHandleW(0)) + 0x19E19A5) - - // So we keep going until we find a lea with nullsub.. - - uint64 ApplyGadgetAttributesAddr = Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 55 41 54 41 55 41 57 48 8D 6C 24").Get(); - - if (!ApplyGadgetAttributesAddr) - return 0; - - for (int i = 0; i < 10000; i++) - { - if ((*(uint8_t*)(uint8_t*)(ApplyGadgetAttributesAddr + i) == 0x48 && *(uint8_t*)(uint8_t*)(ApplyGadgetAttributesAddr + i + 1) == 0x8D - && *(uint8_t*)(uint8_t*)(ApplyGadgetAttributesAddr + i + 2) == 0x05)) - { - auto loadAddress = Memcury::Scanner(ApplyGadgetAttributesAddr + i).RelativeOffset(3).Get(); - - if (IsNullSub(loadAddress)) // Safety - return ApplyGadgetAttributesAddr + i; - } - } - - return 0; -} - -static inline uint64 FindCombinePickupLea() // kill me -{ - // return 0; - - /* uint64 OnRep_PickupLocationDataAddr = 0; // TODO (Idea: Find SetupCombinePickupDelegates from this). - - if (!OnRep_PickupLocationDataAddr) - return 0; */ - - uint64 SetupCombinePickupDelegatesAddr = 0; - - bool bShouldCheckSafety = true; - - if (Engine_Version <= 420) - { - SetupCombinePickupDelegatesAddr = Memcury::Scanner::FindPattern("49 89 73 10 49 89 7B 18 4D 89 73 20 4D 89 7B E8 41 0F 29 73 ? 75").Get(); // found on 4.1 - bShouldCheckSafety = false; // it's like "corrupted" and not just return - } - else if (Engine_Version >= 421) - { - SetupCombinePickupDelegatesAddr = Memcury::Scanner::FindPattern("48 89 AC 24 ? ? ? ? 48 89 B4 24 ? ? ? ? 48 89 BC 24 ? ? ? ? 0F 29 B4 24 ? ? ? ? 75").Get(); // Haha so funny thing, this isn't actually the start its the middle because it's in function chunks yay! - } - - if (!SetupCombinePickupDelegatesAddr) - return 0; - - for (int i = 0; i < 1000; i++) - { - if (*(uint8_t*)(uint8_t*)(SetupCombinePickupDelegatesAddr + i) == 0x48 && *(uint8_t*)(uint8_t*)(SetupCombinePickupDelegatesAddr + i + 1) == 0x8D - && *(uint8_t*)(uint8_t*)(SetupCombinePickupDelegatesAddr + i + 2) == 0x05) // Checked on 10.40, it was the first lea. - { - auto loadAddress = Memcury::Scanner(SetupCombinePickupDelegatesAddr + i).RelativeOffset(3).Get(); - - if (!bShouldCheckSafety || IsNullSub(loadAddress)) - return SetupCombinePickupDelegatesAddr + i; - } - } - - return 0; -} - -static inline uint64 FindCompletePickupAnimation() -{ - if (Engine_Version == 416 || Engine_Version == 419) - return Memcury::Scanner::FindPattern("4C 8B DC 53 55 56 48 83 EC 60 48 8B F1 48 8B 89 ? ? ? ? 48 85 C9").Get(); - - if (Engine_Version == 420) - { - auto addy = Memcury::Scanner::FindPattern("4C 8B DC 53 55 56 48 83 EC 60 48 8B F1 48 8B 89", false).Get(); // 3.1 - - if (!addy) - addy = Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 85 C9 74 20 48 8D 44 24").Get(); - - return addy; - } - - if (Engine_Version == 421) - { - auto adda = Memcury::Scanner::FindPattern("40 53 56 48 83 EC 38 4C 89 6C 24 ? 48 8B F1 4C 8B A9", false).Get(); - - if (!adda) - adda = Memcury::Scanner::FindPattern("40 53 56 57 48 83 EC 30 4C 89 6C 24 ? 48 8B F1 4C 8B A9 ? ? ? ? 4D 85 ED 0F 84").Get(); // 6.21 - - return adda; - } - - if (Engine_Version == 422) - return Memcury::Scanner::FindPattern("40 53 56 57 48 83 EC 30 4C 89 6C 24 ? 48 8B F1 4C 8B A9 ? ? ? ? 4D 85 ED 0F 84").Get(); // 7.30 - - if (Engine_Version >= 423 && Engine_Version <= 426) - return Memcury::Scanner::FindPattern("40 53 56 48 83 EC 38 4C 89 6C 24 ? 48 8B F1 4C 8B A9 ? ? ? ? 4D 85 ED").Get(); // 10.40 - - if (Engine_Version == 427) - { - auto sig = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 54 41 56 41 57 48 83 EC 20 48 8B B1 ? ? ? ? 48 8B D9 48 85 F6", false).Get(); // 17.30 - - if (!sig) - sig = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 54 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B B9 ? ? ? ? 48 8B D9 48 85 FF 74 16 48 89", false).Get(); // 18.40 - - if (!sig) - sig = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 68 18 57 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 85").Get(); // 16.50 - - return sig; - } - - if (Engine_Version == 500) - { - auto addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B B9", false).Get(); // 19.10; - - if (!addr) - addr = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B B9 ? ? ? ? 45 33 E4 48 8B D9 48 85 FF 74 0F").Get(); // 20.40 - - return addr; - } - - return 0; -} - -static inline uint64 FindNoMCP() -{ - /* if (Fortnite_Version >= 17) // idk if needed - { - // todo make this relative - // 19.10 - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 20 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 08 8B 04 0A 39 05 ? ? ? ? 7F 23 8A 05 ? ? ? ? 48 8B 5C 24 ? 48 8B 6C 24 ? 48 8B 74 24 ? 48 83 C4 20 41 5F 41 5E 41 5D 41 5C 5F C3 48 8D 0D ? ? ? ? E8 ? ? ? ? 83 3D ? ? ? ? ? 75 C8 E8 ? ? ? ? 45 33").Get(); - } */ - - if (Fortnite_Version == 4.5) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 90 EB EA").RelativeOffset(1).Get(); - - if (std::floor(Fortnite_Version) == 3) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 83 A7 ? ? ? ? ? 48 8D 4C 24 ?").RelativeOffset(1).Get(); - - if (std::floor(Fortnite_Version) == 4) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 83 A7 ? ? ? ? ? 83 E0 01").RelativeOffset(1).Get(); - - if (std::floor(Fortnite_Version) == 5) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get(); - - LOG_INFO(LogDev, "finding it"); - auto fn = FindObject(L"/Script/FortniteGame.FortKismetLibrary.IsRunningNoMCP"); - LOG_INFO(LogDev, "fn: {}", __int64(fn)); - - if (!fn) - return 0; - - auto scanner = Memcury::Scanner(__int64(fn->GetFunc())); - auto noMcpIthink = Memcury::Scanner(FindBytes(scanner, { 0xE8 })).RelativeOffset(1).Get(); // GetFunctionIdxOrPtr(fn); - return noMcpIthink; - - if (Engine_Version == 421 || Engine_Version == 422) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get(); - - if (Engine_Version == 423) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 C0").RelativeOffset(1).Get(); - - if (Engine_Version == 425) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 C1").RelativeOffset(1).Get(); - - if (Engine_Version == 426) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 10 84 DB").RelativeOffset(1).Get(); - - if (Engine_Version == 427) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 74 F0").RelativeOffset(1).Get(); - - // return (uintptr_t)GetModuleHandleW(0) + 0x1791CF0; // 11.01 - return 0; - // return (uintptr_t)GetModuleHandleW(0) + 0x161d600; // 10.40 -} - -static inline uint64 FindSetZoneToIndex() // actually StartNewSafeZonePhase -{ - if (Engine_Version == 419) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 70 48 8B B9 ? ? ? ? 33 DB 0F 29 74 24 ? 48 8B F1 48 85 FF 74 2C E8").Get(); // 1.11 - if (Engine_Version == 420) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? EB 31 80 B9 ? ? ? ? ?").RelativeOffset(1).Get(); // 3.5 - if (Fortnite_Version >= 7 && Fortnite_Version <= 8) // intentional, 8.00 has the same pattern. - return Memcury::Scanner::FindPattern("E9 ? ? ? ? 48 8B C1 40 38 B9").RelativeOffset(1).Get(); // 7.40 - if (Engine_Version == 423) - return Memcury::Scanner::FindPattern("E8 ? ? ? ? EB 42 80 BA").RelativeOffset(1).Get(); // doesnt work - - auto Addr = Memcury::Scanner::FindStringRef(L"FortGameModeAthena: No MegaStorm on SafeZone[%d]. GridCellThickness is less than 1.0.", true, 0, Engine_Version >= 427).Get(); - // return FindBytes(Addr, { 0x40, 0x55 }, 30000, 0, true); - - if (!Addr) - return 0; - - for (int i = 0; i < 100000; i++) - { - if ((*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x53) - || (*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x55)) - { - return Addr - i; - } - - if (Fortnite_Version < 8) - { - if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x5C) - { - return Addr - i; - } - } - - if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0xC4) - { - return Addr - i; - } - } - - return 0; -} - -static inline uint64 FindSetTimer() -{ - auto Addr = Memcury::Scanner::FindStringRef(L"STAT_SetTimer", false).Get(); - - if (!Addr) - return 0; - - for (int i = 0; i < 1000; i++) - { - /* if ((*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x53) - || (*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x55)) - { - return Addr - i; - } - - if (Fortnite_Version < 8) - { - if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x5C) - { - return Addr - i; - } - } */ - - if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0xC4) - { - return Addr - i; - } - } - - return 0; -} - -static inline uint64 FindEnterAircraft() -{ - auto Addr = Memcury::Scanner::FindStringRef(L"EnterAircraft: [%s] is attempting to enter aircraft after having already exited.", true, 0, Engine_Version >= 500).Get(); - - for (int i = 0; i < 1000; i++) - { - if ((*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x53) - || (*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x55)) - { - return Addr - i; - } - - if (Fortnite_Version >= 15) - { - if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x5C && *(uint8_t*)(uint8_t*)(Addr - i + 3) == 0x24) - { - return Addr - i; - } - } - - if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x74) // 4.1 - { - return Addr - i; - } - } - - return 0; -} - -static inline uint64 FindFreeArrayOfEntries() -{ - // horrific way - - if (Engine_Version == 422 || Engine_Version == 423) - return Memcury::Scanner::FindPattern("48 83 EC 38 48 89 6C 24 ? 4C 89 74 24 ? 4C 8B F1 48 8B 09 41 8B 6E 08 85 ED 0F 84 ? ? ? ? 48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 48 8D B9").Get(); // 7.30 & 10.40 - - return 0; -} - -static inline uint64 FindFreeEntry() -{ - // horrific way - - if (Engine_Version == 420) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 8B F1 48 8B 89 ? ? ? ? 48 85 C9 74 05 E8 ? ? ? ? 48 8B 8E ? ? ? ? 48 85 C9 74 05 E8 ? ? ? ? 48 8B 8E ? ? ? ? 48 85 C9 74 05 E8 ? ? ? ? 48 8B 9E ? ? ? ? 48 85").Get(); // 4.1 - - return 0; -} - -static inline uint64 FindBeginningOfFuncEXP(uint64 Addr, int ToSearch = 1000) -{ - for (int i = 0; i < ToSearch; i++) - { - if (Fortnite_Version >= 10) - { - if ((*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x53)) - { - return Addr - i; - } - } - - if ((*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x55)) - { - return Addr - i; - - } - - if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x5C) - { - return Addr - i; - - } - - /* if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0xC4) - { - return Addr - i; - } */ - } - - return 0; -} - -static inline uint64 FindRemoveGadgetData() -{ - uint64 RemoveGadgetDataAddr = 0; - - if (Engine_Version <= 423) - { - auto Addr = Memcury::Scanner::FindStringRef(L"UFortGadgetItemDefinition::RemoveGadgetData - Removing Gadget Data for Gadget Item [%s]!", false).Get(); - - if (!Addr) - Addr = Memcury::Scanner::FindStringRef(L"UFortGadgetItemDefinition::RemoveGadgetData - Removing Gadget Data for Gadet Item [%s]!", false).Get(); - - if (!Addr) - Addr = Memcury::Scanner::FindStringRef(L"UFortGadgetItemDefinition::RemoveGadgetData - Failed to get the Player Controller to cleanup Gadget Item [%s]!").Get(); - - if (!Addr) - return 0; - - RemoveGadgetDataAddr = FindBeginningOfFuncEXP(Addr); - } - else if (Engine_Version == 426) - RemoveGadgetDataAddr = Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 56 41 56 41 57 48 83 EC 30 48 8B 02 48").Get(); // 14.60 - - LOG_INFO(LogDev, "RemoveGadgetData: 0x{:x}", RemoveGadgetDataAddr - __int64(GetModuleHandleW(0))); - - if (!RemoveGadgetDataAddr) - return 0; - - uint64 RemoveGadgetDataCall = Memcury::Scanner::FindPointerRef((PVOID)RemoveGadgetDataAddr, 0, false, false).Get(); - - if (!RemoveGadgetDataCall) - return RemoveGadgetDataAddr; - - uint64 FortGadgetItemDefinition_RemoveGadgetDataAddr = FindBeginningOfFuncEXP(RemoveGadgetDataCall); - - if (!FortGadgetItemDefinition_RemoveGadgetDataAddr) - return RemoveGadgetDataAddr; - - uint64 FortGadgetItemDefinition_RemoveGadgetDataCall = Memcury::Scanner::FindPointerRef((PVOID)FortGadgetItemDefinition_RemoveGadgetDataAddr, 0, false, false).Get(); - - if (!FortGadgetItemDefinition_RemoveGadgetDataCall) - return FortGadgetItemDefinition_RemoveGadgetDataAddr; - - uint64 AthenaGadgetItemDefinition_RemoveGadgetDataAddr = FindBeginningOfFuncEXP(FortGadgetItemDefinition_RemoveGadgetDataCall); - - if (!AthenaGadgetItemDefinition_RemoveGadgetDataAddr) - return FortGadgetItemDefinition_RemoveGadgetDataAddr; - - return AthenaGadgetItemDefinition_RemoveGadgetDataAddr; -} - -static inline uint64 FindApplyGadgetData() -{ - uint64 FortGadgetItemDefinition_ApplyGadgetDataAddr = 0; - - if (Engine_Version >= 420 && Engine_Version <= 422) - FortGadgetItemDefinition_ApplyGadgetDataAddr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 41 0F B6 D9 49 8B").Get(); // 4.1 & 6.21 & 7.40 - if (Engine_Version >= 423 && Engine_Version <= 426) - FortGadgetItemDefinition_ApplyGadgetDataAddr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 7C 24 ? 41 54 41 56 41 57 48 83 EC 20 41 0F").Get(); // 8.51 & 12.41 - - uint64 FortGadgetItemDefinition_ApplyGadgetDataCall = Memcury::Scanner::FindPointerRef((PVOID)FortGadgetItemDefinition_ApplyGadgetDataAddr, 0, false, false).Get(); - - if (!FortGadgetItemDefinition_ApplyGadgetDataCall) - return FortGadgetItemDefinition_ApplyGadgetDataAddr; - - auto AthenaGadgetItemDefinition_ApplyGadgetDataAddr = FindBeginningOfFuncEXP(FortGadgetItemDefinition_ApplyGadgetDataCall); - - if (!AthenaGadgetItemDefinition_ApplyGadgetDataAddr) - return FortGadgetItemDefinition_ApplyGadgetDataAddr; - - return AthenaGadgetItemDefinition_ApplyGadgetDataAddr; -} - -static inline uint64 FindGetInterfaceAddress() -{ - if (Engine_Version <= 421) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 FF 48 8B DA 48 8B F1 48").Get(); // 4.1 & 6.21 - - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 DB 48 8B FA 48 8B F1 48 85 D2 0F 84 ? ? ? ? 8B 82 ? ? ? ? C1 E8").Get(); -} - -static inline uint64 FindCollectGarbage() -{ - // return 0; - - auto Addr = Memcury::Scanner::FindStringRef(L"STAT_CollectGarbageInternal"); - return FindBytes(Addr, { 0x48, 0x89, 0x5C }, 2000, 0, true, 1); -} - -static inline uint64 FindActorGetNetMode() -{ - // return 0; - - if (Engine_Version == 500) // hah well this and 427 does like nothing cuz inline mostly - { - auto addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 F6 41 08 10 48 8B D9 0F 85 ? ? ? ? 48 8B 41 20 48 85 C0 0F 84 ? ? ? ? F7 40", false).Get(); - - if (!addr) - addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 F6 41 08 10 48 8B D9 0F 85").Get(); // 20.40 - - return addr; - } - - if (Engine_Version == 427) - { - auto addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 48 8B D9 E8 ? ? ? ? 48 8B 93 ? ? ? ? 48 8B C8 48 8B F8 E8 ? ? ? ? 48 85 C0 75 29", false).Get(); - - if (!addr) - addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 F6 41 08 10 48 8B D9 0F 85 ? ? ? ? 48 8B 41 20 48 85 C0 0F 84").Get(); // 17.50 & 18.40 - - return addr; - } - - auto AActorGetNetmodeStrRef = Memcury::Scanner::FindStringRef(L"STAT_ServerUpdateCamera", false); - - if (!AActorGetNetmodeStrRef.Get()) - { - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 48 8B 01 48 8B D9 FF 90 ? ? ? ? 4C 8B").Get(); // 2.5 i think - } - - return Memcury::Scanner(FindBytes(AActorGetNetmodeStrRef, { 0xE8 }, 255, 0, true)).RelativeOffset(1).Get(); -} - -static inline uint64 FindRemoveFromAlivePlayers() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"FortGameModeAthena: Player [%s] removed from alive players list (Team [%d]). Player count is now [%d]. Team count is now [%d].", false).Get(); - - if (!Addrr) - Addrr = Memcury::Scanner::FindStringRef(L"FortGameModeAthena: Player [%s] removed from alive players list (Team [%d]). Player count is now [%d]. PlayerBots count is now [%d]. Team count is now [%d].", false).Get(); - - if (!Addrr) - Addrr = Memcury::Scanner::FindStringRef(L"FortGameModeAthena::RemoveFromAlivePlayers: Player [%s] PC [%s] removed from alive players list (Team [%d]). Player count is now [%d]. PlayerBots count is now [%d]. Team count is now [%d].", true, 0, Fortnite_Version >= 16).Get(); // checked on 16.40 - - for (int i = 0; i < 2000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x4C && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x4C) // most common - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x54) // idk what verisont bh - { - for (int z = 3; z < 50; z++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i - z) == 0x4C && *(uint8_t*)(uint8_t*)(Addrr - i - z + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i - z + 2) == 0x4C) - { - return Addrr - i - z; - } - } - - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) // i forgot what version - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindTickFlush() -{ - // auto add = Memcury::Scanner::FindStringRef(L"UDemoNetDriver::TickFlush: ReplayStreamer ERROR: %s"); - // return Memcury::Scanner(FindBytes(add, { 0xE8 }, 500, 0, true, 1)).RelativeOffset(1).Get(); - - if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("4C 8B DC 55 53 56 57 49 8D AB ? ? ? ? 48 81 EC ? ? ? ? 41 0F 29 7B").Get(); // 2.4.2 - - if (Engine_Version == 419) - return Memcury::Scanner::FindPattern("4C 8B DC 55 49 8D AB ? ? ? ? 48 81 EC ? ? ? ? 45 0F 29 43 ? 45 0F 29 4B ? 48 8B 05 ? ? ? ? 48").Get(); // 2.4.2 - - if (Engine_Version == 427) - { - auto addr = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 18 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 B8 0F 29 78 A8 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 8A", false).Get(); - - if (!addr) // s18 - addr = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 18 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 B8 0F 29 78 A8 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 44 0F", false).Get(); - - if (!addr) - addr = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 18 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 B8 0F 29 78 A8 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 48 8B F9 48 89 4D 38 48 8D 4D 40").Get(); // 16.50 - - return addr; - } - - auto Addr = Memcury::Scanner::FindStringRef(L"STAT_NetTickFlush", false); - - if (!Addr.Get()) - { - if (Engine_Version == 420) // 2.5 - { - return Memcury::Scanner::FindPattern("4C 8B DC 55 49 8D AB ? ? ? ? 48 81 EC ? ? ? ? 45 0F 29 43 ? 45 0F 29 4B ? 48 8B 05 ? ? ? ? 48 33").Get(); - } - } - - return FindBytes(Addr, (Fortnite_Version < 18 ? std::vector{ 0x4C, 0x8B } : std::vector{ 0x48, 0x8B, 0xC4 }), 1000, 0, true); -} - -static inline uint64 FindAddNavigationSystemToWorld() -{ - uint64 addr = 0; - - if (Engine_Version == 421) - addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 83 B9 ? ? ? ? ? 41 0F B6 F1 0F B6 FA 48", false).Get(); - else if (Engine_Version == 423) - addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 ED 41", false).Get(); - else if (Engine_Version == 425) - addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 ED 41 0F B6 F1").Get(); - - return addr; -} - -static inline uint64 FindNavSystemCleanUp() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"UNavigationSystemV1::CleanUp", false).Get(); - - if (!Addrr) - return 0; - - for (int i = 0; i < 500; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x53) - { - return Addrr - i; - } - } - - return 0; -} - -static inline uint64 FindLoadPlayset(const std::vector& Bytes = std::vector({ 0x48, 0x89, 0x5C }), int recursive = 0) -{ - if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 4C 8B B1 ? ? ? ? 45").Get(); - - if (recursive >= 2) - return 0; - - auto StringRef = Memcury::Scanner::FindStringRef(L"UPlaysetLevelStreamComponent::LoadPlayset Error: no owner for %s", Fortnite_Version >= 7, 1); - - if (!StringRef.Get()) - return 0; - - for (int i = 0 + 0; i < 400 + 0; i++) // we should subtract from skip if goup - { - auto CurrentByte = *(Memcury::ASM::MNEMONIC*)(true ? StringRef.Get() - i : StringRef.Get() + i); - - if (CurrentByte == Bytes[0]) - { - bool Found = true; - for (int j = 1; j < Bytes.size(); j++) - { - if (*(Memcury::ASM::MNEMONIC*)(true ? StringRef.Get() - i + j : StringRef.Get() + i + j) != Bytes[j]) - { - Found = false; - break; - } - } - if (Found) - { - return true ? StringRef.Get() - i : StringRef.Get() + i; - } - } - - if (CurrentByte == 0xC3) - return FindLoadPlayset({ 0x40, 0x55 }, ++recursive); - - // std::cout << std::format("CurrentByte: 0x{:x}\n", (uint8_t)CurrentByte); - } - - return 0; -} - -static inline uint64 FindGIsServer() -{ - // auto add = Memcury::Scanner::FindStringRef(L"STAT_UpdateLevelStreaming"); - // return Memcury::Scanner(FindBytes(add, { 0x80, 0x3D }, 100, 0, true, 1)).RelativeOffset(2).Get(); - - // if (Fortnite_Version == 19.10) - // return __int64(GetModuleHandleW(0)) + 0xB30CF9D; - - // if (Fortnite_Version == 2.5) - // return __int64(GetModuleHandleW(0)) + 0x46AD735; - - auto Addrr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering").Get(); - - /* int found = 0; - - for (int i = 0; i < 600; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x88 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x1D) - { - for (int z = 0; z < 15; z++) - { - LOG_INFO(LogDev, "[{}] [{}] GIsServerTest: 0x{:x}", found, z, Memcury::Scanner(Addrr - i).RelativeOffset(z).Get() - __int64(GetModuleHandleW(0))); - } - - found++; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0xC6 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x05) - { - for (int z = 0; z < 15; z++) - { - LOG_INFO(LogDev, "[{}] [{}] GIsServerTest: 0x{:x}", found, z, Memcury::Scanner(Addrr - i).RelativeOffset(z).Get() - __int64(GetModuleHandleW(0))); - } - - found++; - } - } */ - - if (Fortnite_Version == 4.1) - return __int64(GetModuleHandleW(0)) + 0x4BF6F18; - if (Fortnite_Version == 10.40) - return __int64(GetModuleHandleW(0)) + 0x637925C; - if (Fortnite_Version == 12.41) - return __int64(GetModuleHandleW(0)) + 0x804B65A; - if (Fortnite_Version == 14.60) - return __int64(GetModuleHandleW(0)) + 0x939930E; - if (Fortnite_Version == 17.30) - return __int64(GetModuleHandleW(0)) + 0x973E499; - - return 0; - - auto Addr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering"); - - std::vector> BytesArray = { { 0xC6, 0x05 }, { 0x88, 0x1D } }; - - int Skip = 1; - - uint64 Addy; - - for (int i = 0; i < 50; i++) // we should subtract from skip if goup - { - auto CurrentByte = *(Memcury::ASM::MNEMONIC*)(Addr.Get() - i); - - // if (bPrint) - // std::cout << "CurrentByte: " << std::hex << (int)CurrentByte << '\n'; - - bool ShouldBreak = false; - - for (auto& Bytes : BytesArray) - { - if (CurrentByte == Bytes[0]) - { - bool Found = true; - for (int j = 1; j < Bytes.size(); j++) - { - if (*(Memcury::ASM::MNEMONIC*)(Addr.Get() - i + j) != Bytes[j]) - { - Found = false; - break; - } - } - if (Found) - { - LOG_INFO(LogDev, "[{}] Skip: 0x{:x}", Skip, Memcury::Scanner(Addr.Get() - i).RelativeOffset(2).Get() - __int64(GetModuleHandleW(0))); - - if (Skip > 0) - { - Skip--; - continue; - } - - Addy = Addr.Get() - i; - ShouldBreak = true; - break; - } - } - } - - if (ShouldBreak) - break; - - // std::cout << std::format("CurrentByte: 0x{:x}\n", (uint8_t)CurrentByte); - } - - /* int Skip = 2; - auto Addy = FindBytes(Addr, { 0xC6, 0x05 }, 50, 0, true, Skip); - Addy = Addy ? Addy : FindBytes(Addr, { 0x44, 0x88 }, 50, 0, true, Skip); - Addy = Addy ? Addy : FindBytes(Addr, { 0x88, 0x1D }, 50, 0, true, Skip); */ - - LOG_INFO(LogDev, "Addy: 0x{:x}", Addy - __int64(GetModuleHandleW(0))); - - return Memcury::Scanner(Addy).RelativeOffset(2).Get(); -} - -static inline uint64 FindChangeGameSessionId() -{ - if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 50 4C 8B FA 48 8B F1 E8").Get(); - - if (Engine_Version >= 427) - { - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 70 4C 8B FA 4C").Get(); // no work on s18 - } - - if (Fortnite_Version == 2.5) - return Memcury::Scanner::FindPattern("40 55 56 41 56 48 8B EC 48 81 EC ? ? ? ? 48 8B 01 4C 8B F2").Get(); - - auto Addr = Memcury::Scanner::FindStringRef(L"Changing GameSessionId from '%s' to '%s'"); - return FindBytes(Addr, { 0x40, 0x55 }, 2000, 0, true); -} - -static inline uint64 FindDispatchRequest() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"MCP-Profile: Dispatching request to %s", false, 0, Fortnite_Version >= 19).Get(); - - if (!Addrr) - { - return 0; - } - - for (int i = 0; i < 1000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) - { - return Addrr - i; - } - } - - return 0; - - // return FindBytes(Addr, std::floor(Fortnite_Version) == 18 ? std::vector{0x48, 0x8B, 0xC4 } : std::vector{ 0x48, 0x89, 0x5C }, 300, 0, true); -} - -static inline uint64 FindMcpIsDedicatedServerOffset() -{ - if (Engine_Version == 421 || Engine_Version == 422) // checked on 5.41 & 6.21 & 7.30 - return 0x28; - - return 0x60; // 1.7.2 & 1.11 & 4.1 -} - -static inline uint64 FindGIsClient() -{ - /* if (Fortnite_Version >= 20) - return 0; */ - - auto Addr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering"); - - std::vector> BytesArray = { {0x88, 0x05}, {0xC6, 0x05}, {0x88, 0x1D}, {0x44, 0x88}}; - - int Skip = Engine_Version <= 420 ? 1 : 2; - - uint64 Addy; - - for (int i = 0; i < 50; i++) // we should subtract from skip if goup - { - auto CurrentByte = *(Memcury::ASM::MNEMONIC*)(Addr.Get() - i); - - // if (bPrint) - // std::cout << "CurrentByte: " << std::hex << (int)CurrentByte << '\n'; - - bool ShouldBreak = false; - - // LOG_INFO(LogDev, "[{}] Byte: 0x{:x}", i, (int)CurrentByte); - - for (auto& Bytes : BytesArray) - { - if (CurrentByte == Bytes[0]) - { - bool Found = true; - for (int j = 1; j < Bytes.size(); j++) - { - if (*(Memcury::ASM::MNEMONIC*)(Addr.Get() - i + j) != Bytes[j]) - { - Found = false; - break; - } - } - if (Found) - { - int Relative = Bytes[0] == 0x44 ? 3 : 2; - // LOG_INFO(LogDev, "[{}] No Rel 0x{:x} Rel: 0x{:x}", Skip, Memcury::Scanner(Addr.Get() - i).Get() - __int64(GetModuleHandleW(0)), Memcury::Scanner(Addr.Get() - i).RelativeOffset(Relative).Get() - __int64(GetModuleHandleW(0))); - - if (Skip > 0) - { - Skip--; - continue; - } - - Addy = Memcury::Scanner(Addr.Get() - i).RelativeOffset(Relative).Get(); - ShouldBreak = true; - break; - } - } - } - - if (ShouldBreak) - break; - - // std::cout << std::format("CurrentByte: 0x{:x}\n", (uint8_t)CurrentByte); - } - - // LOG_INFO(LogDev, "Addy: 0x{:x}", Addy - __int64(GetModuleHandleW(0))); - - return Addy; // 0; // Memcury::Scanner(Addy3).RelativeOffset(2).Get(); - - /* - auto Addr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering"); - int Skip = 1; - auto Addy = FindBytes(Addr, { 0xC6, 0x05 }, 50, 0, true, Skip); - Addy = Addy ? Addy : FindBytes(Addr, { 0x44, 0x88 }, 50, 0, true, Skip); - Addy = Addy ? Addy : FindBytes(Addr, { 0x88, 0x1D }, 50, 0, true, Skip); - - return Memcury::Scanner(Addy).RelativeOffset(2).Get(); - */ -} - -static inline uint64 FindGetNetMode() -{ - if (std::floor(Fortnite_Version) == 18) - return Memcury::Scanner::FindPattern("48 83 EC 28 48 83 79 ? ? 75 20 48 8B 91 ? ? ? ? 48 85 D2 74 1E 48 8B 02 48 8B CA FF 90").Get(); - - auto Addr = Memcury::Scanner::FindStringRef(L"PREPHYSBONES"); - - auto BeginningFunction = FindBytes(Addr, { 0x40, 0x55 }, 1000, 0, true); - - uint64 CallToFunc = 0; - - for (int i = 0; i < 400; i++) - { - if ((*(uint8_t*)(uint8_t*)(BeginningFunction + i) == 0xE8) && (*(uint8_t*)(uint8_t*)(BeginningFunction + i - 1) != 0x8B)) // scuffed but idk how to guarantee its not a register - { - CallToFunc = BeginningFunction + i; - break; - } - } - - if (!CallToFunc) - { - LOG_WARN(LogDev, "Failed to find call for UWorld::GetNetMode! Report this to Milxnor immediately."); - return 0; - } - - LOG_INFO(LogDev, "CallToFunc: 0x{:x}", CallToFunc - __int64(GetModuleHandleW(0))); - - return Memcury::Scanner(CallToFunc).RelativeOffset(1).Get(); - - // return (uintptr_t)GetModuleHandleW(0) + 0x34d2140; -} - -static inline uint64 FindApplyCharacterCustomization() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"AFortPlayerState::ApplyCharacterCustomization - Failed initialization, using default parts. Player Controller: %s PlayerState: %s, HeroId: %s", false, 0, Fortnite_Version >= 20, true).Get(); - - if (!Addrr) - return 0; - - for (int i = 0; i < 7000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x53) - { - return Addrr - i; - } - - if (Fortnite_Version >= 15) // hm? - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) - { - return Addrr - i; - } - } - - uint64 Addr = Memcury::Scanner::FindPattern("48 8B C4 48 89 50 10 55 57 48 8D 68 A1 48 81 EC ? ? ? ? 80 B9").Get(); - - return Addr; -} - -static inline uint64 FindRealloc() -{ - if (Engine_Version >= 427) - return Memcury::Scanner::FindPattern("48 89 5C 24 08 48 89 74 24 10 57 48 83 EC ? 48 8B F1 41 8B D8 48 8B 0D ? ? ? ").Get(); - - auto Addr = Memcury::Scanner::FindStringRef(L"a.Budget.BudgetMs", false); - - if (!Addr.Get()) - { - return Memcury::Scanner::FindPattern("48 89 5C 24 08 48 89 74 24 10 57 48 83 EC ? 48 8B F1 41 8B D8 48 8B 0D ? ? ? ?").Get(); // 4.16-4.20 - } - - auto BeginningFunction = Memcury::Scanner(FindBytes(Addr, { 0x40, 0x53 }, 1000, 0, true)); - auto CallToFunc = Memcury::Scanner(FindBytes(BeginningFunction, { 0xE8 })); - - return CallToFunc.RelativeOffset(1).Get(); - - // return Memcury::Scanner::FindPattern("48 89 5C 24 08 48 89 74 24 10 57 48 83 EC ? 48 8B F1 41 8B D8 48 8B 0D ? ? ? ?").Get(); -} - -static inline uint64 FindPickTeam() -{ - if (Engine_Version == 426) - { - auto testAddr = Memcury::Scanner::FindPattern("88 54 24 10 53 56 41 54 41 55 41 56 48 83 EC 60 4C 8B A1", false).Get(); // 14.60 what is happening lol ???? - - if (!testAddr) - testAddr = Memcury::Scanner::FindPattern("88 54 24 10 53 55 56 41 55 41 ? 48 83 EC 70 48", false).Get(); // 15.10 & 15.50 - - if (testAddr) - return testAddr; - } - - else if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 88 54 24 10 55 56 57 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 70 45 33 ED 4D").Get(); // 19.10 - - else if (Engine_Version >= 427) // different start - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 88 54 24 10 55 56 57 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 70 4C 8B A1").Get(); - - if (Fortnite_Version == 7.20 || Fortnite_Version == 7.30) - return Memcury::Scanner::FindPattern("89 54 24 10 53 56 41 54 41 55 41 56 48 81 EC").Get(); - - auto Addr = Memcury::Scanner::FindStringRef(L"PickTeam for [%s] used beacon value [%d]", false, 0, Engine_Version >= 427); // todo check if its just s18+ but this doesn't matter for now cuz we hardcode sig - - if (!Addr.Get()) - Addr = Memcury::Scanner::FindStringRef(L"PickTeam for [%s] used beacon value [%s]"); // i don't even know what version this is - - return FindBytes(Addr, Fortnite_Version <= 4.1 ? std::vector{ 0x48, 0x89, 0x6C } : std::vector{ 0x40, 0x55 }, 1000, 0, true); -} - -static inline uint64 FindInternalTryActivateAbility() -{ - auto Addrr = Memcury::Scanner::FindStringRef(L"InternalTryActivateAbility called with invalid Handle! ASC: %s. AvatarActor: %s", true, 0, Fortnite_Version >= 16).Get(); // checked 16.40 - - for (int i = 0; i < 1000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x4C && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x4C) - { - return Addrr - i; - } - } - - return 0; - // return FindBytes(Addr, { 0x4C, 0x89, 0x4C }, 1000, 0, true); -} - -static inline uint64 FindFrameStep() -{ - return Memcury::Scanner::FindPattern("48 8B 41 20 4C 8B D2 48 8B D1 44 0F B6 08 48 FF").Get(); -} - -static inline uint64 FindCanActivateAbility() -{ - // return 0; - - if (Engine_Version <= 420) - return 0; // ? - - // this doesn't work on like >2.5 - - if (Engine_Version == 421 || Engine_Version == 422) - return Memcury::Scanner::FindPattern("4C 89 4C 24 20 55 56 57 41 56 48 8D 6C 24 D1").Get(); - - auto Addrr = Memcury::Scanner::FindStringRef(L"CanActivateAbility %s failed, blueprint refused", true, 0, Engine_Version >= 500).Get(); - - for (int i = 0; i < 2000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) - { - return Addrr - i; - } - } - - return 0; - - // auto Addr = Memcury::Scanner::FindStringRef(L"CanActivateAbility %s failed, blueprint refused", true, 0, Engine_Version >= 500); - // return FindBytes(Addr, { 0x48, 0x89, 0x5C }, 2000, 0, true); -} - -static inline uint64 FindGiveAbilityAndActivateOnce() -{ - if (Engine_Version == 426) - { - auto sig1 = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 40 49 8B 40 10 49 8B D8 48 8B FA 48 8B F1", false).Get(); - - if (!sig1) - sig1 = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 40 49 8B 40 10 49").Get(); // 15.50 - - return sig1; - } - - auto Addrr = Memcury::Scanner::FindStringRef(L"GiveAbilityAndActivateOnce called on ability %s on the client, not allowed!", true, 0, Engine_Version >= 500).Get(); - - for (int i = 0; i < 1000; i++) - { - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x55) - { - return Addrr - i; - } - - if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) - { - return Addrr - i; - } - } - - return 0; - - /* auto Addr = Memcury::Scanner::FindStringRef(L"GiveAbilityAndActivateOnce called on ability %s on the client, not allowed!", true, 0, Engine_Version >= 500); - auto res = FindBytes(Addr, { 0x48, 0x89, 0x5C }, 1000, 0, true); - - return res; */ -} - -static inline uint64 FindGiveAbility() -{ - if (Engine_Version <= 420) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9").Get(); - /* if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9").Get(); - if (Fortnite_Version == 1.11) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9 ? ? ? ? ? 49 8B F0").Get(); - if (Engine_Version == 420) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9 ? ? ? ? ? 49 8B F0 4C 8B F2 48 8B D9 7E 61").Get(); */ - if (Engine_Version == 421) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 7C 24 ? 41 56 48 83 EC 20 83 B9 ? ? ? ? ? 49 8B E8 4C 8B F2").Get(); - if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 56 57 41 56 48 83 EC 20 8B 81 ? ? ? ? 49 8B E8 4C").Get(); // idk why finder doesnt work - - // auto Addr = Memcury::Scanner::FindStringRef(L"GiveAbilityAndActivateOnce called on ability %s on the client, not allowed!"); // has 2 refs for some reason on some versions - // auto realGiveAbility = Memcury::Scanner(FindBytes(Addr, { 0xE8 }, 500, 0, false, 0, true)).RelativeOffset(1).Get(); - - Memcury::Scanner addr = Memcury::Scanner::FindStringRef(L"GiveAbilityAndActivateOnce called on ability %s on the client, not allowed!", true, 1, Engine_Version >= 500); // Memcury::Scanner(FindGiveAbilityAndActivateOnce()); - - // LOG_INFO(LogDev, "aaaaa: 0x{:x}", addr.Get() - __int64(GetModuleHandleW(0))); - - return Memcury::Scanner(FindBytes(addr, { 0xE8 }, 500, 0, false)).RelativeOffset(1).Get(); -} - -static inline uint64 FindCantBuild() -{ - auto add = Memcury::Scanner::FindPattern("48 89 5C 24 10 48 89 6C 24 18 48 89 74 24 20 41 56 48 83 EC ? 49 8B E9 4D 8B F0", false).Get(); - - if (!add) - add = Memcury::Scanner::FindPattern("48 89 54 24 ? 55 56 41 56 48 83 EC 50", false).Get(); // 4.20 - - if (!add) - add = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 56 41 57 48 83 EC 60 4D 8B F1 4D 8B F8", false).Get(); // 4.26.1 - - if (!add) - add = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 56 41 57 48 83 EC 60 49 8B E9 4D 8B F8 48 8B DA 48 8B F9 BE ? ? ? ? 48", false).Get(); // 5.00 - - if (!add) - add = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 56 41 57 48 83 EC 70 49 8B E9 4D 8B F8 48 8B DA 48 8B F9").Get(); // 20.00 - - return add; - - auto CreateBuildingActorAddr = Memcury::Scanner(GetFunctionIdxOrPtr(FindObject(L"/Script/FortniteGame.FortAIController.CreateBuildingActor"))); - auto LikeHuh = Memcury::Scanner(FindBytes(CreateBuildingActorAddr, { 0x40, 0x88 }, 3000)); - auto callaa = Memcury::Scanner(FindBytes(LikeHuh, { 0xE8 })); - - return callaa.RelativeOffset(1).Get(); -} - -static inline uint64 FindReplaceBuildingActor() -{ - auto StringRef = Memcury::Scanner::FindStringRef(L"STAT_Fort_BuildingSMActorReplaceBuildingActor", false); - - if (!StringRef.Get()) // we are on a version where stats dont exist - { - return Memcury::Scanner::FindPattern("4C 89 44 24 ? 55 56 57 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 45").Get(); // 1.7.2 & 2.4.2 - } - - return FindBytes(StringRef, - (Engine_Version == 420 || Engine_Version == 421 || Engine_Version >= 427 ? std::vector{ 0x48, 0x8B, 0xC4 } : std::vector{ 0x4C, 0x8B }), - 1000, 0, true); -} - -static inline uint64 FindSendClientAdjustment() -{ - if (Fortnite_Version <= 3.2) - return Memcury::Scanner::FindPattern("40 53 48 83 EC 20 48 8B 99 ? ? ? ? 48 39 99 ? ? ? ? 74 0A 48 83 B9").Get(); - if (Fortnite_Version >= 20) - return Memcury::Scanner::FindPattern("40 53 48 83 EC 20 48 8B 99 ? ? ? ? 48 39 99 ? ? ? ? 74 0A 48 83 B9").Get(); - - return 0; -} - -static inline uint64 FindReplicateActor() -{ - if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("40 55 53 57 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8D 59 68 4C 8B F1 48 8B").Get(); - if (Engine_Version >= 419 && Fortnite_Version <= 3.2) - { - auto addr = Memcury::Scanner::FindPattern("40 55 56 57 41 54 41 55 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C", false).Get(); // 3.0, we could just use this sig for everything? - - if (!addr) - addr = Memcury::Scanner::FindPattern("40 55 56 41 54 41 55 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 48 8B 49 68 48").Get(); - - return addr; - } - - if (Fortnite_Version >= 20) - return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8D 69 68").Get(); - - return 0; -} - -static inline uint64 FindCreateChannel() -{ - if (Fortnite_Version <= 3.2) - return Memcury::Scanner::FindPattern("40 56 57 41 54 41 55 41 57 48 83 EC 60 48 8B 01 41 8B F9 45 0F B6 E0").Get(); - if (Fortnite_Version >= 20) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 44 89 4C 24 ? 55 57 41 54 41 56 41 57 48 8B EC 48 83 EC 50 45 33 E4 48 8D 05 ? ? ? ? 44 38 25").Get(); - - return 0; -} - -static inline uint64 FindSetChannelActor() -{ - if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("4C 8B DC 55 53 57 41 54 49 8D AB ? ? ? ? 48 81 EC ? ? ? ? 45 33").Get(); - if (Engine_Version >= 419 && Fortnite_Version <= 3.2) - { - auto aa = Memcury::Scanner::FindPattern("48 8B C4 55 53 57 41 54 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 45 33 E4 48 89 70", false).Get(); - - if (!aa) - return Memcury::Scanner::FindPattern("48 8B C4 55 53 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 89 70 E8 48 8B D9").Get(); - - return aa; - } - if (Fortnite_Version >= 20) - return Memcury::Scanner::FindPattern("40 55 53 56 57 41 54 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 45 33 E4 48 8D 3D ? ? ? ? 44 89 A5").Get(); - - return 0; -} - -static inline uint64 FindCallPreReplication() -{ - if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 8B C4 55 57 41 57 48 8D 68 A1 48 81 EC").Get(); - if (Engine_Version == 419) - return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 8B C4 55 57 41 54 48 8D 68 A1 48 81 EC ? ? ? ? 48 89 58 08 4C").Get(); - if (Fortnite_Version >= 2.5 && Fortnite_Version <= 3.2) - return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 56 41 56 48 83 EC 38 4C 8B F2").Get(); - if (Fortnite_Version >= 20) - return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 56 41 57 48 83 EC 40 F6 41 58 30 48 8B EA 48 8B D9 40 B6 01").Get(); - - return 0; -} - -static inline uint64 FindClearAbility() -{ - auto GiveAbilityAndActivateOnce = FindGiveAbilityAndActivateOnce(); - - if (!GiveAbilityAndActivateOnce) - return 0; - - return Memcury::Scanner(GiveAbilityAndActivateOnce).ScanFor({ 0xE8 }, true, 4).RelativeOffset(1).Get(); - - if (Engine_Version == 416) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 7C 24 ? 41 56 48 83 EC 20 48 63 81 ? ? ? ? 33").Get(); - if (Engine_Version == 419) - return Memcury::Scanner::FindPattern("").Get(); - if (Engine_Version == 420) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 8B F9 C6 81 ? ? ? ? ? 8B").Get(); - if (Engine_Version == 421) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 57 48 83 EC 20 80 89 ? ? ? ? ? 33").Get(); - if (Engine_Version == 422) - return Memcury::Scanner::FindPattern("").Get(); - if (Engine_Version == 423) - return Memcury::Scanner::FindPattern("40 53 57 41 56 48 83 EC 20 80 89 ? ? ? ? ? 33").Get(); - if (Engine_Version == 500) - return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 83 EC 20 80 89 ? ? ? ? ? 48 8B F2 44 8B 89 ? ? ? ? 33 D2 48 8B").Get(); - - return 0; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/globals.h b/dependencies/reboot/Project Reboot 3.0/globals.h deleted file mode 100644 index ca18762..0000000 --- a/dependencies/reboot/Project Reboot 3.0/globals.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include - -#include "inc.h" - -namespace Globals -{ - extern inline bool bCreative = false; - extern inline bool bGoingToPlayEvent = false; - extern inline bool bEnableAGIDs = true; - extern inline bool bNoMCP = true; - extern inline bool bLogProcessEvent = false; - // extern inline bool bLateGame = false; - extern inline std::atomic bLateGame(false); - - extern inline bool bInfiniteMaterials = false; - extern inline bool bInfiniteAmmo = false; - - extern inline bool bHitReadyToStartMatch = false; - extern inline bool bInitializedPlaylist = false; - extern inline bool bStartedListening = false; - extern inline bool bAutoRestart = false; // doesnt work fyi - extern inline bool bFillVendingMachines = true; - extern inline int AmountOfListens = 0; // TODO: Switch to this for LastNum -} - -extern inline int NumToSubtractFromSquadId = 0; // I think 2? - -extern inline std::string PlaylistName = -"/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo"; -// "/Game/Athena/Playlists/gg/Playlist_Gg_Reverse.Playlist_Gg_Reverse"; -// "/Game/Athena/Playlists/Playlist_DefaultDuo.Playlist_DefaultDuo"; -// "/Game/Athena/Playlists/Playground/Playlist_Playground.Playlist_Playground"; -// "/Game/Athena/Playlists/Carmine/Playlist_Carmine.Playlist_Carmine"; -// "/Game/Athena/Playlists/Fill/Playlist_Fill_Solo.Playlist_Fill_Solo"; -// "/Game/Athena/Playlists/Low/Playlist_Low_Solo.Playlist_Low_Solo"; -// "/Game/Athena/Playlists/Bling/Playlist_Bling_Solo.Playlist_Bling_Solo"; -// "/Game/Athena/Playlists/Creative/Playlist_PlaygroundV2.Playlist_PlaygroundV2"; -// "/Game/Athena/Playlists/Ashton/Playlist_Ashton_Sm.Playlist_Ashton_Sm"; -// "/Game/Athena/Playlists/BattleLab/Playlist_BattleLab.Playlist_BattleLab"; \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/gui.h b/dependencies/reboot/Project Reboot 3.0/gui.h deleted file mode 100644 index 43a26bd..0000000 --- a/dependencies/reboot/Project Reboot 3.0/gui.h +++ /dev/null @@ -1,1630 +0,0 @@ -#pragma once - -// TODO: Update ImGUI - -#pragma comment(lib, "d3d9.lib") - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "objectviewer.h" -#include "FortAthenaMutator_Disco.h" -#include "globals.h" -#include "Fonts/ruda-bold.h" -#include "Vector.h" -#include "reboot.h" -#include "FortGameModeAthena.h" -#include "UnrealString.h" -#include "KismetTextLibrary.h" -#include "KismetSystemLibrary.h" -#include "GameplayStatics.h" -#include "Text.h" -#include -#include "FortGadgetItemDefinition.h" -#include "FortWeaponItemDefinition.h" -#include "events.h" -#include "FortAthenaMutator_Heist.h" -#include "BGA.h" -#include "vendingmachine.h" -#include "die.h" - -#define GAME_TAB 1 -#define PLAYERS_TAB 2 -#define GAMEMODE_TAB 3 -#define THANOS_TAB 4 -#define EVENT_TAB 5 -#define ZONE_TAB 6 -#define DUMP_TAB 7 -#define UNBAN_TAB 8 -#define FUN_TAB 9 -#define LATEGAME_TAB 10 -#define DEVELOPER_TAB 11 -#define DEBUGLOG_TAB 12 -#define SETTINGS_TAB 13 -#define CREDITS_TAB 14 - -#define MAIN_PLAYERTAB 1 -#define INVENTORY_PLAYERTAB 2 -#define LOADOUT_PLAYERTAB 4 -#define FUN_PLAYERTAB 5 - -extern inline int StartReverseZonePhase = 7; -extern inline int EndReverseZonePhase = 5; -extern inline float StartingShield = 0; -extern inline bool bEnableReverseZone = false; -extern inline int AmountOfPlayersWhenBusStart = 0; -extern inline bool bHandleDeath = true; -extern inline bool bUseCustomMap = false; -extern inline std::string CustomMapName = ""; -extern inline int AmountToSubtractIndex = 1; -extern inline int SecondsUntilTravel = 5; -extern inline bool bSwitchedInitialLevel = false; -extern inline bool bIsInAutoRestart = false; -extern inline float AutoBusStartSeconds = 60; -extern inline int NumRequiredPlayersToStart = 2; -extern inline bool bDebugPrintLooting = false; -extern inline bool bDebugPrintFloorLoot = false; -extern inline bool bDebugPrintSwapping = false; -extern inline bool bEnableBotTick = false; -extern inline bool bZoneReversing = false; -extern inline bool bEnableCombinePickup = false; -extern inline int AmountOfBotsToSpawn = 0; -extern inline bool bEnableRebooting = false; -extern inline bool bEngineDebugLogs = false; -extern inline bool bStartedBus = false; -extern inline int AmountOfHealthSiphon = 0; - -// THE BASE CODE IS FROM IMGUI GITHUB - -static inline LPDIRECT3D9 g_pD3D = NULL; -static inline LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; -static inline D3DPRESENT_PARAMETERS g_d3dpp = {}; - -// Forward declarations of helper functions -static inline bool CreateDeviceD3D(HWND hWnd); -static inline void CleanupDeviceD3D(); -static inline void ResetDevice(); -static inline LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - -static inline void SetIsLategame(bool Value) -{ - Globals::bLateGame.store(Value); - StartingShield = Value ? 100 : 0; -} - -static inline void Restart() // todo move? -{ - FString LevelA = Engine_Version < 424 - ? L"open Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501 - ? L"open Asteria_Terrain" - : Globals::bCreative ? L"open Creative_NoApollo_Terrain" - : L"open Artemis_Terrain" - : Globals::bCreative ? L"open Creative_NoApollo_Terrain" - : L"open Apollo_Terrain"; - - static auto BeaconClass = FindObject(L"/Script/FortniteGame.FortOnlineBeaconHost"); - auto AllFortBeacons = UGameplayStatics::GetAllActorsOfClass(GetWorld(), BeaconClass); - - for (int i = 0; i < AllFortBeacons.Num(); ++i) - { - AllFortBeacons.at(i)->K2_DestroyActor(); - } - - AllFortBeacons.Free(); - - Globals::bInitializedPlaylist = false; - Globals::bStartedListening = false; - Globals::bHitReadyToStartMatch = false; - bStartedBus = false; - AmountOfRestarts++; - - LOG_INFO(LogDev, "Switching!"); - - if (Fortnite_Version >= 3) // idk what ver - { - ((AGameMode*)GetWorld()->GetGameMode())->RestartGame(); - } - else - { - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), LevelA, nullptr); - } - - /* - - auto& LevelCollections = GetWorld()->Get>("LevelCollections"); - int LevelCollectionSize = FindObject("/Script/Engine.LevelCollection")->GetPropertiesSize(); - - *(UNetDriver**)(__int64(LevelCollections.AtPtr(0, LevelCollectionSize)) + 0x10) = nullptr; - *(UNetDriver**)(__int64(LevelCollections.AtPtr(1, LevelCollectionSize)) + 0x10) = nullptr; - - */ - - // UGameplayStatics::OpenLevel(GetWorld(), UKismetStringLibrary::Conv_StringToName(LevelA), true, FString()); -} - -static inline std::string wstring_to_utf8(const std::wstring& str) -{ - if (str.empty()) return {}; - const auto size_needed = WideCharToMultiByte(CP_UTF8, 0, &str[0], static_cast(str.size()), nullptr, 0, nullptr, nullptr); - std::string str_to(size_needed, 0); - WideCharToMultiByte(CP_UTF8, 0, &str[0], static_cast(str.size()), &str_to[0], size_needed, nullptr, nullptr); - return str_to; -} - -static inline void InitFont() -{ - ImFontConfig FontConfig; - FontConfig.FontDataOwnedByAtlas = false; - ImGui::GetIO().Fonts->AddFontFromMemoryTTF((void*)ruda_bold_data, sizeof(ruda_bold_data), 17.f, &FontConfig); -} - -static inline void InitStyle() -{ - auto& mStyle = ImGui::GetStyle(); - mStyle.FramePadding = ImVec2(4, 2); - mStyle.ItemSpacing = ImVec2(6, 2); - mStyle.ItemInnerSpacing = ImVec2(6, 4); - mStyle.Alpha = 0.95f; - mStyle.WindowRounding = 4.0f; - mStyle.FrameRounding = 2.0f; - mStyle.IndentSpacing = 6.0f; - mStyle.ItemInnerSpacing = ImVec2(2, 4); - mStyle.ColumnsMinSpacing = 50.0f; - mStyle.GrabMinSize = 14.0f; - mStyle.GrabRounding = 16.0f; - mStyle.ScrollbarSize = 12.0f; - mStyle.ScrollbarRounding = 16.0f; - - ImGuiStyle& style = mStyle; - style.Colors[ImGuiCol_Text] = ImVec4(0.86f, 0.93f, 0.89f, 0.78f); - style.Colors[ImGuiCol_TextDisabled] = ImVec4(0.86f, 0.93f, 0.89f, 0.28f); - style.Colors[ImGuiCol_WindowBg] = ImVec4(0.13f, 0.14f, 0.17f, 1.00f); - style.Colors[ImGuiCol_Border] = ImVec4(0.31f, 0.31f, 1.00f, 0.00f); - style.Colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - style.Colors[ImGuiCol_FrameBg] = ImVec4(0.20f, 0.22f, 0.27f, 1.00f); - style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(0.92f, 0.18f, 0.29f, 0.78f); - style.Colors[ImGuiCol_FrameBgActive] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_TitleBg] = ImVec4(0.20f, 0.22f, 0.27f, 1.00f); - style.Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.20f, 0.22f, 0.27f, 0.75f); - style.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_MenuBarBg] = ImVec4(0.20f, 0.22f, 0.27f, 0.47f); - style.Colors[ImGuiCol_ScrollbarBg] = ImVec4(0.20f, 0.22f, 0.27f, 1.00f); - style.Colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.09f, 0.15f, 0.16f, 1.00f); - style.Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.92f, 0.18f, 0.29f, 0.78f); - style.Colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_CheckMark] = ImVec4(0.71f, 0.22f, 0.27f, 1.00f); - style.Colors[ImGuiCol_SliderGrab] = ImVec4(0.47f, 0.77f, 0.83f, 0.14f); - style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_Button] = ImVec4(0.47f, 0.77f, 0.83f, 0.14f); - style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.92f, 0.18f, 0.29f, 0.86f); - style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_Header] = ImVec4(0.92f, 0.18f, 0.29f, 0.76f); - style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.92f, 0.18f, 0.29f, 0.86f); - style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_Separator] = ImVec4(0.14f, 0.16f, 0.19f, 1.00f); - style.Colors[ImGuiCol_SeparatorHovered] = ImVec4(0.92f, 0.18f, 0.29f, 0.78f); - style.Colors[ImGuiCol_SeparatorActive] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_ResizeGrip] = ImVec4(0.47f, 0.77f, 0.83f, 0.04f); - style.Colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.92f, 0.18f, 0.29f, 0.78f); - style.Colors[ImGuiCol_ResizeGripActive] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_PlotLines] = ImVec4(0.86f, 0.93f, 0.89f, 0.63f); - style.Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_PlotHistogram] = ImVec4(0.86f, 0.93f, 0.89f, 0.63f); - style.Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(0.92f, 0.18f, 0.29f, 1.00f); - style.Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.92f, 0.18f, 0.29f, 0.43f); - style.Colors[ImGuiCol_PopupBg] = ImVec4(0.20f, 0.22f, 0.27f, 0.9f); -} - -static inline void TextCentered(const std::string& text, bool bNewLine = true) { - if (bNewLine) - ImGui::NewLine(); - - float win_width = ImGui::GetWindowSize().x; - float text_width = ImGui::CalcTextSize(text.c_str()).x; - - // calculate the indentation that centers the text on one line, relative - // to window left, regardless of the `ImGuiStyleVar_WindowPadding` value - float text_indentation = (win_width - text_width) * 0.5f; - - // if text is too long to be drawn on one line, `text_indentation` can - // become too small or even negative, so we check a minimum indentation - float min_indentation = 20.0f; - if (text_indentation <= min_indentation) { - text_indentation = min_indentation; - } - - ImGui::SameLine(text_indentation); - ImGui::PushTextWrapPos(win_width - text_indentation); - ImGui::TextWrapped(text.c_str()); - ImGui::PopTextWrapPos(); -} - -static inline bool ButtonCentered(const std::string& text, bool bNewLine = true) { - if (bNewLine) - ImGui::NewLine(); - - float win_width = ImGui::GetWindowSize().x; - float text_width = ImGui::CalcTextSize(text.c_str()).x; - - // calculate the indentation that centers the text on one line, relative - // to window left, regardless of the `ImGuiStyleVar_WindowPadding` value - float text_indentation = (win_width - text_width) * 0.5f; - - // if text is too long to be drawn on one line, `text_indentation` can - // become too small or even negative, so we check a minimum indentation - float min_indentation = 20.0f; - if (text_indentation <= min_indentation) { - text_indentation = min_indentation; - } - - ImGui::SameLine(text_indentation); - ImGui::PushTextWrapPos(win_width - text_indentation); - auto res = ImGui::Button(text.c_str()); - ImGui::PopTextWrapPos(); - return res; -} - -static inline void InputVector(const std::string& baseText, FVector* vec) -{ -#ifdef ABOVE_S20 - ImGui::InputDouble((baseText + " X").c_str(), &vec->X); - ImGui::InputDouble((baseText + " Y").c_str(), &vec->Y); - ImGui::InputDouble((baseText + " Z").c_str(), &vec->Z); -#else - ImGui::InputFloat((baseText + " X").c_str(), &vec->X); - ImGui::InputFloat((baseText + " Y").c_str(), &vec->Y); - ImGui::InputFloat((baseText + " Z").c_str(), &vec->Z); -#endif -} - -static int Width = 640; -static int Height = 480; - -static int Tab = 1; -static int PlayerTab = -1; -static bool bIsEditingInventory = false; -static bool bInformationTab = false; -static int playerTabTab = MAIN_PLAYERTAB; - -static inline void StaticUI() -{ - if (IsRestartingSupported()) - { - // ImGui::Checkbox("Auto Restart", &Globals::bAutoRestart); - - if (Globals::bAutoRestart) - { - ImGui::InputFloat(std::format("How long after {} players join the bus will start", NumRequiredPlayersToStart).c_str(), &AutoBusStartSeconds); - ImGui::InputInt("Num Players required for bus auto timer", &NumRequiredPlayersToStart); - } - } - - ImGui::InputInt("Shield/Health for siphon", &AmountOfHealthSiphon); - -#ifndef PROD - ImGui::Checkbox("Log ProcessEvent", &Globals::bLogProcessEvent); - // ImGui::InputInt("Amount of bots to spawn", &AmountOfBotsToSpawn); -#endif - - ImGui::Checkbox("Infinite Ammo", &Globals::bInfiniteAmmo); - ImGui::Checkbox("Infinite Materials", &Globals::bInfiniteMaterials); - - ImGui::Checkbox("No MCP (Don't change unless you know what this is)", &Globals::bNoMCP); - - if (Addresses::ApplyGadgetData && Addresses::RemoveGadgetData && Engine_Version < 424) - { - ImGui::Checkbox("Enable AGIDs (Don't change unless you know what this is)", &Globals::bEnableAGIDs); - } -} - -static inline void MainTabs() -{ - // std::ofstream bannedStream(Moderation::Banning::GetFilePath()); - - if (ImGui::BeginTabBar("")) - { - if (ImGui::BeginTabItem("Game")) - { - Tab = GAME_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - - // if (serverStatus == EServerStatus::Up) - { - /* if (ImGui::BeginTabItem("Players")) - { - Tab = PLAYERS_TAB; - ImGui::EndTabItem(); - } */ - } - - if (false && ImGui::BeginTabItem("Gamemode")) - { - Tab = GAMEMODE_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - - // if (Events::HasEvent()) - if (Globals::bGoingToPlayEvent) - { - if (ImGui::BeginTabItem(("Event"))) - { - Tab = EVENT_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - } - - if (ImGui::BeginTabItem(("Zone"))) - { - Tab = ZONE_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Dump")) - { - Tab = DUMP_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Fun")) - { - Tab = FUN_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - - if (Globals::bLateGame.load() && ImGui::BeginTabItem("Lategame")) - { - Tab = LATEGAME_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - -#if 0 - if (bannedStream.is_open() && ImGui::BeginTabItem("Unban")) // skunked - { - Tab = UNBAN_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } -#endif - - /* if (ImGui::BeginTabItem(("Settings"))) - { - Tab = SETTINGS_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } */ - - // maybe a Replication Stats for >3.3? - -#ifndef PROD - if (ImGui::BeginTabItem("Developer")) - { - Tab = DEVELOPER_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Debug Logs")) - { - Tab = DEBUGLOG_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } -#endif - - if (false && ImGui::BeginTabItem(("Credits"))) - { - Tab = CREDITS_TAB; - PlayerTab = -1; - bInformationTab = false; - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } -} - -static inline void PlayerTabs() -{ - if (ImGui::BeginTabBar("")) - { - if (ImGui::BeginTabItem("Main")) - { - playerTabTab = MAIN_PLAYERTAB; - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem(("Inventory"))) - { - playerTabTab = INVENTORY_PLAYERTAB; - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem(("Cosmetics"))) - { - playerTabTab = LOADOUT_PLAYERTAB; - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem(("Fun"))) - { - playerTabTab = FUN_PLAYERTAB; - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } -} - -static inline DWORD WINAPI LateGameThread(LPVOID) -{ - float MaxTickRate = 30; - - auto GameMode = Cast(GetWorld()->GetGameMode()); - auto GameState = Cast(GameMode->GetGameState()); - - auto GetAircrafts = [&]() -> std::vector - { - static auto AircraftsOffset = GameState->GetOffset("Aircrafts", false); - std::vector Aircrafts; - - if (AircraftsOffset == -1) - { - // GameState->Aircraft - - static auto FortAthenaAircraftClass = FindObject(L"/Script/FortniteGame.FortAthenaAircraft"); - auto AllAircrafts = UGameplayStatics::GetAllActorsOfClass(GetWorld(), FortAthenaAircraftClass); - - for (int i = 0; i < AllAircrafts.Num(); i++) - { - Aircrafts.push_back(AllAircrafts.at(i)); - } - - AllAircrafts.Free(); - } - else - { - const auto& GameStateAircrafts = GameState->Get>(AircraftsOffset); - - for (int i = 0; i < GameStateAircrafts.Num(); i++) - { - Aircrafts.push_back(GameStateAircrafts.at(i)); - } - } - - return Aircrafts; - }; - - GameMode->StartAircraftPhase(); - - while (GetAircrafts().size() <= 0) - { - Sleep(1000 / MaxTickRate); - } - - static auto SafeZoneLocationsOffset = GameMode->GetOffset("SafeZoneLocations"); - const TArray& SafeZoneLocations = GameMode->Get>(SafeZoneLocationsOffset); - - if (SafeZoneLocations.Num() < 4) - { - LOG_WARN(LogLateGame, "Unable to find SafeZoneLocation! Disabling lategame.."); - SetIsLategame(false); - return 0; - } - - const FVector ZoneCenterLocation = SafeZoneLocations.at(3); - - FVector LocationToStartAircraft = ZoneCenterLocation; - LocationToStartAircraft.Z += 10000; - - auto Aircrafts = GetAircrafts(); - - float DropStartTime = GameState->GetServerWorldTimeSeconds() + 5.f; - float FlightSpeed = 0.0f; - - for (int i = 0; i < Aircrafts.size(); ++i) - { - auto CurrentAircraft = Aircrafts.at(i); - CurrentAircraft->TeleportTo(LocationToStartAircraft, FRotator()); - - static auto FlightInfoOffset = CurrentAircraft->GetOffset("FlightInfo", false); - - if (FlightInfoOffset == -1) - { - static auto FlightStartLocationOffset = CurrentAircraft->GetOffset("FlightStartLocation"); - static auto FlightSpeedOffset = CurrentAircraft->GetOffset("FlightSpeed"); - static auto DropStartTimeOffset = CurrentAircraft->GetOffset("DropStartTime"); - - CurrentAircraft->Get(FlightStartLocationOffset) = LocationToStartAircraft; - CurrentAircraft->Get(FlightSpeedOffset) = FlightSpeed; - CurrentAircraft->Get(DropStartTimeOffset) = DropStartTime; - } - else - { - auto FlightInfo = CurrentAircraft->GetPtr(FlightInfoOffset); - - FlightInfo->GetFlightSpeed() = FlightSpeed; - FlightInfo->GetFlightStartLocation() = LocationToStartAircraft; - FlightInfo->GetTimeTillDropStart() = DropStartTime; - } - } - - while (GameState->GetGamePhase() != EAthenaGamePhase::Aircraft) - { - Sleep(1000 / MaxTickRate); - } - - /* - static auto MapInfoOffset = GameState->GetOffset("MapInfo"); - auto MapInfo = GameState->Get(MapInfoOffset); - - if (MapInfo) - { - static auto FlightInfosOffset = MapInfo->GetOffset("FlightInfos", false); - - if (FlightInfosOffset != -1) - { - auto& FlightInfos = MapInfo->Get>(FlightInfosOffset); - - for (int i = 0; i < FlightInfos.Num(); i++) - { - auto FlightInfo = FlightInfos.AtPtr(i, FAircraftFlightInfo::GetStructSize()); - - FlightInfo->GetFlightSpeed() = FlightSpeed; - FlightInfo->GetFlightStartLocation() = LocationToStartAircraft; - FlightInfo->GetTimeTillDropStart() = DropStartTime; - } - } - } - */ - - while (GameState->GetGamePhase() == EAthenaGamePhase::Aircraft) - { - Sleep(1000 / MaxTickRate); - } - - static auto World_NetDriverOffset = GetWorld()->GetOffset("NetDriver"); - auto WorldNetDriver = GetWorld()->Get(World_NetDriverOffset); - auto& ClientConnections = WorldNetDriver->GetClientConnections(); - - for (int z = 0; z < ClientConnections.Num(); z++) - { - auto ClientConnection = ClientConnections.at(z); - auto FortPC = Cast(ClientConnection->GetPlayerController()); - - if (!FortPC) - continue; - - auto WorldInventory = FortPC->GetWorldInventory(); - - if (!WorldInventory) - continue; - - static auto WoodItemData = FindObject(L"/Game/Items/ResourcePickups/WoodItemData.WoodItemData"); - static auto StoneItemData = FindObject(L"/Game/Items/ResourcePickups/StoneItemData.StoneItemData"); - static auto MetalItemData = FindObject(L"/Game/Items/ResourcePickups/MetalItemData.MetalItemData"); - - static auto Rifle = FindObject(L"/Game/Athena/Items/Weapons/WID_Assault_AutoHigh_Athena_SR_Ore_T03.WID_Assault_AutoHigh_Athena_SR_Ore_T03"); - static auto Shotgun = FindObject(L"/Game/Athena/Items/Weapons/WID_Shotgun_Standard_Athena_SR_Ore_T03.WID_Shotgun_Standard_Athena_SR_Ore_T03") - ? FindObject(L"/Game/Athena/Items/Weapons/WID_Shotgun_Standard_Athena_SR_Ore_T03.WID_Shotgun_Standard_Athena_SR_Ore_T03") - : FindObject(L"/Game/Athena/Items/Weapons/WID_Shotgun_Standard_Athena_C_Ore_T03.WID_Shotgun_Standard_Athena_C_Ore_T03"); - static auto SMG = FindObject(L"/Game/Athena/Items/Weapons/WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03.WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03") - ? FindObject(L"/Game/Athena/Items/Weapons/WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03.WID_Pistol_AutoHeavyPDW_Athena_R_Ore_T03") - : FindObject(L"/Game/Athena/Items/Weapons/WID_Pistol_AutoHeavySuppressed_Athena_R_Ore_T03.WID_Pistol_AutoHeavySuppressed_Athena_R_Ore_T03"); - - static auto MiniShields = FindObject(L"/Game/Athena/Items/Consumables/ShieldSmall/Athena_ShieldSmall.Athena_ShieldSmall"); - - static auto Shells = FindObject(L"/Game/Athena/Items/Ammo/AthenaAmmoDataShells.AthenaAmmoDataShells"); - static auto Medium = FindObject(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsMedium.AthenaAmmoDataBulletsMedium"); - static auto Light = FindObject(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsLight.AthenaAmmoDataBulletsLight"); - static auto Heavy = FindObject(L"/Game/Athena/Items/Ammo/AthenaAmmoDataBulletsHeavy.AthenaAmmoDataBulletsHeavy"); - - WorldInventory->AddItem(WoodItemData, nullptr, 500); - WorldInventory->AddItem(StoneItemData, nullptr, 500); - WorldInventory->AddItem(MetalItemData, nullptr, 500); - WorldInventory->AddItem(Rifle, nullptr, 1); - WorldInventory->AddItem(Shotgun, nullptr, 1); - WorldInventory->AddItem(SMG, nullptr, 1); - WorldInventory->AddItem(MiniShields, nullptr, 6); - WorldInventory->AddItem(Shells, nullptr, 999); - WorldInventory->AddItem(Medium, nullptr, 999); - WorldInventory->AddItem(Light, nullptr, 999); - WorldInventory->AddItem(Heavy, nullptr, 999); - - WorldInventory->Update(); - } - - static auto SafeZonesStartTimeOffset = GameState->GetOffset("SafeZonesStartTime"); - GameState->Get(SafeZonesStartTimeOffset) = 0.001f; - - return 0; -} - -static inline void MainUI() -{ - bool bLoaded = true; - - if (PlayerTab == -1) - { - MainTabs(); - - if (Tab == GAME_TAB) - { - if (bLoaded) - { - StaticUI(); - - if (!bStartedBus) - { - bool bWillBeLategame = Globals::bLateGame.load(); - ImGui::Checkbox("Lategame", &bWillBeLategame); - SetIsLategame(bWillBeLategame); - } - - ImGui::Text(std::format("Joinable {}", Globals::bStartedListening).c_str()); - - static std::string ConsoleCommand; - - ImGui::InputText("Console command", &ConsoleCommand); - - if (ImGui::Button("Execute console command")) - { - auto wstr = std::wstring(ConsoleCommand.begin(), ConsoleCommand.end()); - - auto aa = wstr.c_str(); - FString cmd = aa; - - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), cmd, nullptr); - } - - /* if (ImGui::Button("Spawn BGAs")) - { - SpawnBGAs(); - } */ - - /* - if (ImGui::Button("New")) - { - static auto NextFn = FindObject("/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C.Next"); - static auto NewFn = FindObject("/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C.New"); - auto Loader = GetEventLoader("/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C"); - - LOG_INFO(LogDev, "Loader: {}", __int64(Loader)); - - if (Loader) - { - int32 NewParam = 1; - // Loader->ProcessEvent(NextFn, &NewParam); - Loader->ProcessEvent(NewFn, &NewParam); - } - } - - if (ImGui::Button("Next")) - { - static auto NextFn = FindObject("/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C.Next"); - static auto NewFn = FindObject("/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C.New"); - auto Loader = GetEventLoader("/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C"); - - LOG_INFO(LogDev, "Loader: {}", __int64(Loader)); - - if (Loader) - { - int32 NewParam = 1; - Loader->ProcessEvent(NextFn, &NewParam); - // Loader->ProcessEvent(NewFn, &NewParam); - } - } - */ - - if (!bIsInAutoRestart && Engine_Version < 424 && ImGui::Button("Restart")) - { - if (Engine_Version < 424) - { - Restart(); - LOG_INFO(LogGame, "Restarting!"); - } - else - { - LOG_ERROR(LogGame, "Restarting is not supported on chapter 2 and above!"); - } - } - - /* - if (ImGui::Button("Test bruh")) - { - __int64 bruh; - __int64* (*sub_7FF7476F4458)(__int64* a1, UWorld* a2, __int64 a3) = decltype(sub_7FF7476F4458)(Addresses::GetSessionInterface); - - sub_7FF7476F4458(&bruh, GetWorld(), 0); - - LOG_INFO(LogDev, "bruh: 0x{:x}", bruh); - auto VFT = *(__int64*)bruh; - LOG_INFO(LogDev, "VFT: 0x{:x}", VFT - __int64(GetModuleHandleW(0))); - } - */ - - if (!bStartedBus) - { - if (Globals::bLateGame.load() || Fortnite_Version >= 11) - { - if (ImGui::Button("Start Bus")) - { - bStartedBus = true; - - auto GameMode = (AFortGameModeAthena*)GetWorld()->GetGameMode(); - auto GameState = Cast(GameMode->GetGameState()); - - AmountOfPlayersWhenBusStart = GameState->GetPlayersLeft(); - - if (Globals::bLateGame.load()) - { - CreateThread(0, 0, LateGameThread, 0, 0, 0); - } - else - { - GameMode->StartAircraftPhase(); - } - } - } - else - { - if (ImGui::Button("Start Bus Countdown")) - { - bStartedBus = true; - - auto GameMode = (AFortGameMode*)GetWorld()->GetGameMode(); - auto GameState = Cast(GameMode->GetGameState()); - - AmountOfPlayersWhenBusStart = GameState->GetPlayersLeft(); // scuffed!!!! - - if (Fortnite_Version == 1.11) - { - static auto OverrideBattleBusSkin = FindObject(L"/Game/Athena/Items/Cosmetics/BattleBuses/BBID_WinterBus.BBID_WinterBus"); - LOG_INFO(LogDev, "OverrideBattleBusSkin: {}", __int64(OverrideBattleBusSkin)); - - if (OverrideBattleBusSkin) - { - static auto AssetManagerOffset = GetEngine()->GetOffset("AssetManager"); - auto AssetManager = GetEngine()->Get(AssetManagerOffset); - - if (AssetManager) - { - static auto AthenaGameDataOffset = AssetManager->GetOffset("AthenaGameData"); - auto AthenaGameData = AssetManager->Get(AthenaGameDataOffset); - - if (AthenaGameData) - { - static auto DefaultBattleBusSkinOffset = AthenaGameData->GetOffset("DefaultBattleBusSkin"); - AthenaGameData->Get(DefaultBattleBusSkinOffset) = OverrideBattleBusSkin; - } - } - - static auto DefaultBattleBusOffset = GameState->GetOffset("DefaultBattleBus"); - GameState->Get(DefaultBattleBusOffset) = OverrideBattleBusSkin; - - static auto FortAthenaAircraftClass = FindObject("/Script/FortniteGame.FortAthenaAircraft"); - auto AllAircrafts = UGameplayStatics::GetAllActorsOfClass(GetWorld(), FortAthenaAircraftClass); - - for (int i = 0; i < AllAircrafts.Num(); i++) - { - auto Aircraft = AllAircrafts.at(i); - - static auto DefaultBusSkinOffset = Aircraft->GetOffset("DefaultBusSkin"); - Aircraft->Get(DefaultBusSkinOffset) = OverrideBattleBusSkin; - - static auto SpawnedCosmeticActorOffset = Aircraft->GetOffset("SpawnedCosmeticActor"); - auto SpawnedCosmeticActor = Aircraft->Get(SpawnedCosmeticActorOffset); - - if (SpawnedCosmeticActor) - { - static auto ActiveSkinOffset = SpawnedCosmeticActor->GetOffset("ActiveSkin"); - SpawnedCosmeticActor->Get(ActiveSkinOffset) = OverrideBattleBusSkin; - } - } - } - } - - static auto WarmupCountdownEndTimeOffset = GameState->GetOffset("WarmupCountdownEndTime"); - // GameState->Get(WarmupCountdownEndTimeOffset) = UGameplayStatics::GetTimeSeconds(GetWorld()) + 10; - - float TimeSeconds = GameState->GetServerWorldTimeSeconds(); // UGameplayStatics::GetTimeSeconds(GetWorld()); - float Duration = 10; - float EarlyDuration = Duration; - - static auto WarmupCountdownStartTimeOffset = GameState->GetOffset("WarmupCountdownStartTime"); - static auto WarmupCountdownDurationOffset = GameMode->GetOffset("WarmupCountdownDuration"); - static auto WarmupEarlyCountdownDurationOffset = GameMode->GetOffset("WarmupEarlyCountdownDuration"); - - GameState->Get(WarmupCountdownEndTimeOffset) = TimeSeconds + Duration; - GameMode->Get(WarmupCountdownDurationOffset) = Duration; - - // GameState->Get(WarmupCountdownStartTimeOffset) = TimeSeconds; - GameMode->Get(WarmupEarlyCountdownDurationOffset) = EarlyDuration; - } - } - } - } - } - - else if (Tab == PLAYERS_TAB) - { - - } - - else if (Tab == EVENT_TAB) - { - if (ImGui::Button(std::format("Start {}", GetEventName()).c_str())) - { - StartEvent(); - } - - if (Fortnite_Version == 8.51) - { - if (ImGui::Button("Unvault DrumGun")) - { - static auto SetUnvaultItemNameFn = FindObject(L"/Game/Athena/Prototype/Blueprints/White/BP_SnowScripting.BP_SnowScripting_C.SetUnvaultItemName"); - auto EventScripting = GetEventScripting(); - - if (EventScripting) - { - FName Name = UKismetStringLibrary::Conv_StringToName(L"DrumGun"); - EventScripting->ProcessEvent(SetUnvaultItemNameFn, &Name); - - static auto PillarsConcludedFn = FindObject(L"/Game/Athena/Prototype/Blueprints/White/BP_SnowScripting.BP_SnowScripting_C.PillarsConcluded"); - EventScripting->ProcessEvent(PillarsConcludedFn, &Name); - } - } - } - } - - else if (Tab == ZONE_TAB) - { - if (ImGui::Button("Start Safe Zone")) - { - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startsafezone", nullptr); - } - - if (ImGui::Button("Pause Safe Zone")) - { - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"pausesafezone", nullptr); - } - - if (ImGui::Button("Skip Zone")) - { - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"skipsafezone", nullptr); - } - - if (ImGui::Button("Start Shrink Safe Zone")) - { - UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"startshrinksafezone", nullptr); - } - - if (ImGui::Button("Skip Shrink Safe Zone")) - { - auto GameMode = Cast(GetWorld()->GetGameMode()); - auto SafeZoneIndicator = GameMode->GetSafeZoneIndicator(); - - if (SafeZoneIndicator) - { - SafeZoneIndicator->SkipShrinkSafeZone(); - } - } - } - - else if (Tab == DUMP_TAB) - { - ImGui::Text("These will all be in your Win64 folder!"); - - static std::string FortniteVersionStr = std::format("Fortnite Version {}\n\n", std::to_string(Fortnite_Version)); - - if (ImGui::Button("Dump Objects")) - { - auto ObjectNum = ChunkedObjects ? ChunkedObjects->Num() : UnchunkedObjects ? UnchunkedObjects->Num() : 0; - - std::ofstream obj("ObjectsDump.txt"); - - obj << FortniteVersionStr; - - for (int i = 0; i < ObjectNum; i++) - { - auto CurrentObject = GetObjectByIndex(i); - - if (!CurrentObject) - continue; - - obj << CurrentObject->GetFullName() << '\n'; - } - } - - if (ImGui::Button("Dump Skins (Skins.txt)")) - { - std::ofstream SkinsFile("Skins.txt"); - - if (SkinsFile.is_open()) - { - SkinsFile << FortniteVersionStr; - - static auto CIDClass = FindObject("/Script/FortniteGame.AthenaCharacterItemDefinition"); - - auto AllObjects = GetAllObjectsOfClass(CIDClass); - - for (int i = 0; i < AllObjects.size(); i++) - { - auto CurrentCID = AllObjects.at(i); - - static auto DisplayNameOffset = CurrentCID->GetOffset("DisplayName"); - - FString DisplayNameFStr = UKismetTextLibrary::Conv_TextToString(CurrentCID->Get(DisplayNameOffset)); - - if (!DisplayNameFStr.Data.Data) - continue; - - SkinsFile << std::format("[{}] {}\n", DisplayNameFStr.ToString(), CurrentCID->GetPathName()); - } - } - } - - if (ImGui::Button("Dump Playlists (Playlists.txt)")) - { - std::ofstream PlaylistsFile("Playlists.txt"); - - if (PlaylistsFile.is_open()) - { - PlaylistsFile << FortniteVersionStr; - static auto FortPlaylistClass = FindObject("/Script/FortniteGame.FortPlaylist"); - // static auto FortPlaylistClass = FindObject("Class /Script/FortniteGame.FortPlaylistAthena"); - - auto AllObjects = GetAllObjectsOfClass(FortPlaylistClass); - - for (int i = 0; i < AllObjects.size(); i++) - { - auto Object = AllObjects.at(i); - - static auto UIDisplayNameOffset = Object->GetOffset("UIDisplayName"); - FString PlaylistNameFStr = UKismetTextLibrary::Conv_TextToString(Object->Get(UIDisplayNameOffset)); - - if (!PlaylistNameFStr.Data.Data) - continue; - - std::string PlaylistName = PlaylistNameFStr.ToString(); - - PlaylistsFile << std::format("[{}] {}\n", PlaylistName, Object->GetPathName()); - } - } - else - std::cout << "Failed to open playlist file!\n"; - } - - if (ImGui::Button("Dump Weapons (Weapons.txt)")) - { - std::ofstream WeaponsFile("Weapons.txt"); - - if (WeaponsFile.is_open()) - { - WeaponsFile << FortniteVersionStr; - - auto DumpItemDefinitionClass = [&WeaponsFile](UClass* Class) { - auto AllObjects = GetAllObjectsOfClass(Class); - - for (int i = 0; i < AllObjects.size(); i++) - { - auto Object = AllObjects.at(i); - - static auto DisplayNameOffset = Object->GetOffset("DisplayName"); - FString ItemDefinitionFStr = UKismetTextLibrary::Conv_TextToString(Object->Get(DisplayNameOffset)); - - if (!ItemDefinitionFStr.Data.Data) - continue; - - std::string ItemDefinitionName = ItemDefinitionFStr.ToString(); - - // check if it contains gallery or playset and just ignore? - - WeaponsFile << std::format("[{}] {}\n", ItemDefinitionName, Object->GetPathName()); - } - }; - - DumpItemDefinitionClass(UFortWeaponItemDefinition::StaticClass()); - DumpItemDefinitionClass(UFortGadgetItemDefinition::StaticClass()); - DumpItemDefinitionClass(FindObject("/Script/FortniteGame.FortAmmoItemDefinition")); - } - else - std::cout << "Failed to open playlist file!\n"; - } - } - else if (Tab == UNBAN_TAB) - { - - } - else if (Tab == FUN_TAB) - { - static std::string ItemToGrantEveryone; - static int AmountToGrantEveryone = 1; - - ImGui::InputFloat("Starting Shield", &StartingShield); - ImGui::InputText("Item to Give", &ItemToGrantEveryone); - ImGui::InputInt("Amount to Give", &AmountToGrantEveryone); - - if (ImGui::Button("Destroy all player builds")) - { - auto AllBuildingSMActors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), ABuildingSMActor::StaticClass()); - - for (int i = 0; i < AllBuildingSMActors.Num(); i++) - { - auto CurrentBuildingSMActor = (ABuildingSMActor*)AllBuildingSMActors.at(i); - - if (CurrentBuildingSMActor->IsDestroyed() || CurrentBuildingSMActor->IsActorBeingDestroyed() || !CurrentBuildingSMActor->IsPlayerPlaced()) continue; - - CurrentBuildingSMActor->SilentDie(); - // CurrentBuildingSMActor->K2_DestroyActor(); - } - - AllBuildingSMActors.Free(); - } - - if (ImGui::Button("Give Item to Everyone")) - { - auto ItemDefinition = FindObject(ItemToGrantEveryone, nullptr, ANY_PACKAGE); - - if (ItemDefinition) - { - static auto World_NetDriverOffset = GetWorld()->GetOffset("NetDriver"); - auto WorldNetDriver = GetWorld()->Get(World_NetDriverOffset); - auto& ClientConnections = WorldNetDriver->GetClientConnections(); - - for (int i = 0; i < ClientConnections.Num(); i++) - { - auto PlayerController = Cast(ClientConnections.at(i)->GetPlayerController()); - - if (!PlayerController->IsValidLowLevel()) - continue; - - auto WorldInventory = PlayerController->GetWorldInventory(); - - if (!WorldInventory->IsValidLowLevel()) - continue; - - bool bShouldUpdate = false; - WorldInventory->AddItem(ItemDefinition, &bShouldUpdate, AmountToGrantEveryone); - - if (bShouldUpdate) - WorldInventory->Update(); - } - } - else - { - ItemToGrantEveryone = ""; - LOG_WARN(LogUI, "Invalid Item Definition!"); - } - } - - auto GameState = Cast(GetWorld()->GetGameState()); - - if (GameState) - { - static auto DefaultGliderRedeployCanRedeployOffset = FindOffsetStruct("/Script/FortniteGame.FortGameStateAthena", "DefaultGliderRedeployCanRedeploy", false); - static auto DefaultParachuteDeployTraceForGroundDistanceOffset = GameState->GetOffset("DefaultParachuteDeployTraceForGroundDistance", false); - - if (Globals::bStartedListening) // it resets accordingly to ProHenis b4 this - { - if (DefaultParachuteDeployTraceForGroundDistanceOffset != -1) - { - ImGui::InputFloat("Automatic Parachute Pullout Distance", GameState->GetPtr(DefaultParachuteDeployTraceForGroundDistanceOffset)); - } - } - - if (DefaultGliderRedeployCanRedeployOffset != -1) - { - bool EnableGliderRedeploy = (bool)GameState->Get(DefaultGliderRedeployCanRedeployOffset); - - if (ImGui::Checkbox("Enable Glider Redeploy", &EnableGliderRedeploy)) - { - GameState->Get(DefaultGliderRedeployCanRedeployOffset) = EnableGliderRedeploy; - } - } - - GET_PLAYLIST(GameState); - - if (CurrentPlaylist) - { - bool bRespawning = CurrentPlaylist->GetRespawnType() == EAthenaRespawnType::InfiniteRespawn || CurrentPlaylist->GetRespawnType() == EAthenaRespawnType::InfiniteRespawnExceptStorm; - - if (ImGui::Checkbox("Respawning", &bRespawning)) - { - CurrentPlaylist->GetRespawnType() = (EAthenaRespawnType)bRespawning; - } - } - } - } - else if (Tab == LATEGAME_TAB) - { - if (bEnableReverseZone) - ImGui::Text(std::format("Currently {}eversing zone", bZoneReversing ? "r" : "not r").c_str()); - - ImGui::Checkbox("Enable Reverse Zone (EXPERIMENTAL)", &bEnableReverseZone); - - if (bEnableReverseZone) - { - ImGui::InputInt("Start Reversing Phase", &StartReverseZonePhase); - ImGui::InputInt("End Reversing Phase", &EndReverseZonePhase); - } - } - else if (Tab == DEVELOPER_TAB) - { - static std::string ClassNameToDump; - static std::string FunctionNameToDump; - static std::string ObjectToDump; - static std::string FileNameToSaveTo; - static bool bExcludeUnhandled = true; - - ImGui::Checkbox("Handle Death", &bHandleDeath); - ImGui::Checkbox("Fill Vending Machines", &Globals::bFillVendingMachines); - ImGui::Checkbox("Enable Bot Tick", &bEnableBotTick); - ImGui::Checkbox("Enable Rebooting", &bEnableRebooting); - ImGui::Checkbox("Enable Combine Pickup", &bEnableCombinePickup); - ImGui::Checkbox("Exclude unhandled", &bExcludeUnhandled); - ImGui::InputInt("Amount To Subtract Index", &AmountToSubtractIndex); - ImGui::InputText("Class Name to mess with", &ClassNameToDump); - ImGui::InputText("Object to dump", &ObjectToDump); - ImGui::InputText("File to save to", &FileNameToSaveTo); - - ImGui::InputText("Function Name to mess with", &FunctionNameToDump); - - if (ImGui::Button("Print Gamephase Step")) - { - auto GameState = Cast(GetWorld()->GetGameState()); - - if (GameState) - { - LOG_INFO(LogDev, "GamePhaseStep: {}", (int)GameState->GetGamePhaseStep()); - } - } - - if (ImGui::Button("Dump Object Info")) - { - ObjectViewer::DumpContentsToFile(ObjectToDump, FileNameToSaveTo, bExcludeUnhandled); - } - - if (ImGui::Button("Print all instances of class")) - { - auto ClassToScuff = FindObject(ClassNameToDump); - - if (ClassToScuff) - { - auto ObjectNum = ChunkedObjects ? ChunkedObjects->Num() : UnchunkedObjects ? UnchunkedObjects->Num() : 0; - - for (int i = 0; i < ObjectNum; i++) - { - auto CurrentObject = GetObjectByIndex(i); - - if (!CurrentObject) - continue; - - if (!CurrentObject->IsA(ClassToScuff)) - continue; - - LOG_INFO(LogDev, "Object Name: {}", CurrentObject->GetPathName()); - } - } - } - - if (ImGui::Button("Load BGA Class")) - { - static auto BlueprintGeneratedClassClass = FindObject(L"/Script/Engine.BlueprintGeneratedClass"); - auto Class = LoadObject(ClassNameToDump, BlueprintGeneratedClassClass); - - LOG_INFO(LogDev, "New Class: {}", __int64(Class)); - } - - if (ImGui::Button("Find all classes that inherit")) - { - auto ClassToScuff = FindObject(ClassNameToDump); - - if (ClassToScuff) - { - auto ObjectNum = ChunkedObjects ? ChunkedObjects->Num() : UnchunkedObjects ? UnchunkedObjects->Num() : 0; - - for (int i = 0; i < ObjectNum; i++) - { - auto CurrentObject = GetObjectByIndex(i); - - if (!CurrentObject || CurrentObject == ClassToScuff) - continue; - - if (!CurrentObject->IsA(ClassToScuff)) - continue; - - LOG_INFO(LogDev, "Class Name: {}", CurrentObject->GetPathName()); - } - } - } - - if (ImGui::Button("Print Class VFT")) - { - auto Class = FindObject(ClassNameToDump); - - if (Class) - { - auto ClassToDump = Class->CreateDefaultObject(); - - if (ClassToDump) - { - LOG_INFO(LogDev, "{} VFT: 0x{:x}", ClassToDump->GetName(), __int64(ClassToDump->VFTable) - __int64(GetModuleHandleW(0))); - } - } - } - - if (ImGui::Button("Print Function Exec Addr")) - { - auto Function = FindObject(FunctionNameToDump); - - if (Function) - { - LOG_INFO(LogDev, "{} Exec: 0x{:x}", Function->GetName(), __int64(Function->GetFunc()) - __int64(GetModuleHandleW(0))); - } - } - - /* if (ImGui::Button("Load BGA Class (and spawn so no GC)")) - { - static auto BGAClass = FindObject("/Script/Engine.BlueprintGeneratedClass"); - auto Class = LoadObject(ClassNameToDump, BGAClass); - - if (Class) - { - GetWorld()->SpawnActor(Class, FVector()); - } - } */ - - /* - ImGui::Text(std::format("Amount of hooks {}", AllFunctionHooks.size()).c_str()); - - for (auto& FunctionHook : AllFunctionHooks) - { - if (ImGui::Button(std::format("{} {} (0x{:x})", (FunctionHook.IsHooked ? "Unhook" : "Hook"), FunctionHook.Name, (__int64(FunctionHook.Original) - __int64(GetModuleHandleW(0)))).c_str())) - { - if (FunctionHook.IsHooked) - { - if (!FunctionHook.VFT || FunctionHook.Index == -1) - { - Hooking::MinHook::Unhook(FunctionHook.Original); - } - else - { - VirtualSwap(FunctionHook.VFT, FunctionHook.Index, FunctionHook.Original); - } - } - else - { - Hooking::MinHook::Hook(FunctionHook.Original, FunctionHook.Detour, nullptr, FunctionHook.Name); - } - - FunctionHook.IsHooked = !FunctionHook.IsHooked; - } - } - */ - } - else if (Tab == DEBUGLOG_TAB) - { - ImGui::Checkbox("Floor Loot Debug Log", &bDebugPrintFloorLoot); - ImGui::Checkbox("Looting Debug Log", &bDebugPrintLooting); - ImGui::Checkbox("Swapping Debug Log", &bDebugPrintSwapping); - ImGui::Checkbox("Engine Debug Log", &bEngineDebugLogs); - } - else if (Tab == SETTINGS_TAB) - { - // ImGui::Checkbox("Use custom lootpool (from Win64/lootpool.txt)", &Defines::bCustomLootpool); - } - } -} - -static inline void PregameUI() -{ - StaticUI(); - - if (Engine_Version >= 422 && Engine_Version < 424) - { - ImGui::Checkbox("Creative", &Globals::bCreative); - } - - if (Addresses::SetZoneToIndex) - { - bool bWillBeLategame = Globals::bLateGame.load(); - ImGui::Checkbox("Lategame", &bWillBeLategame); - SetIsLategame(bWillBeLategame); - } - - if (HasEvent()) - { - ImGui::Checkbox("Play Event", &Globals::bGoingToPlayEvent); - } - - if (!bSwitchedInitialLevel) - { - // ImGui::Checkbox("Use Custom Map", &bUseCustomMap); - - if (bUseCustomMap) - { - // ImGui::InputText("Custom Map", &CustomMapName); - } - - ImGui::SliderInt("Seconds until load into map", &SecondsUntilTravel, 1, 100); - } - - if (!Globals::bCreative) - ImGui::InputText("Playlist", &PlaylistName); -} - -static inline HICON LoadIconFromMemory(const char* bytes, int bytes_size, const wchar_t* IconName) { - HANDLE hMemory = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, bytes_size, IconName); - if (hMemory == NULL) { - return NULL; - } - - LPVOID lpBuffer = MapViewOfFile(hMemory, FILE_MAP_READ, 0, 0, bytes_size); - - if (lpBuffer == NULL) { - CloseHandle(hMemory); - return NULL; - } - - ICONINFO icon_info; - - if (!GetIconInfo((HICON)lpBuffer, &icon_info)) { - UnmapViewOfFile(lpBuffer); - CloseHandle(hMemory); - return NULL; - } - - HICON hIcon = CreateIconIndirect(&icon_info); - UnmapViewOfFile(lpBuffer); - CloseHandle(hMemory); - return hIcon; -} - -static inline DWORD WINAPI GuiThread(LPVOID) -{ - WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"RebootClass", NULL }; - ::RegisterClassEx(&wc); - HWND hwnd = ::CreateWindowExW(0L, wc.lpszClassName, L"Project Reboot", (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX), 100, 100, Width, Height, NULL, NULL, wc.hInstance, NULL); - - if (false) // idk why this dont work - { - auto hIcon = LoadIconFromMemory((const char*)reboot_icon_data, strlen((const char*)reboot_icon_data), L"RebootIco"); - SendMessageW(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); - SendMessageW(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); - } - - // SetWindowLongPtrW(hwnd, GWL_STYLE, WS_POPUP); // Disables windows title bar at the cost of dragging and some quality - - // Initialize Direct3D - if (!CreateDeviceD3D(hwnd)) - { - CleanupDeviceD3D(); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); - return 1; - } - - // Show the window - ::ShowWindow(hwnd, SW_SHOWDEFAULT); - ::UpdateWindow(hwnd); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - - io.IniFilename = NULL; // Disable imgui.ini generation. - io.DisplaySize = ImGui::GetMainViewport()->Size; - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - // io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - InitFont(); - InitStyle(); - - // Setup Platform/Renderer backends - ImGui_ImplWin32_Init(hwnd); - ImGui_ImplDX9_Init(g_pd3dDevice); - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - ImFontConfig config; - config.MergeMode = true; - config.GlyphMinAdvanceX = 13.0f; // Use if you want to make the icon monospaced - // static const ImWchar icon_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 }; - // io.Fonts->AddFontFromFileTTF("Reboot Resources/fonts/fontawesome-webfont.ttf", 13.0f, &config, icon_ranges); - - bool done = false; - - while (!done) - { - MSG msg; - while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) - { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - if (msg.message == WM_QUIT) - { - // done = true; - break; - } - } - - ImGui_ImplDX9_NewFrame(); - ImGui_ImplWin32_NewFrame(); - ImGui::NewFrame(); - - auto WindowSize = ImGui::GetMainViewport()->Size; - // ImGui::SetNextWindowPos(ImVec2(WindowSize.x * 0.5f, WindowSize.y * 0.5f), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); // Center - ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); - - tagRECT rect; - - if (GetWindowRect(hwnd, &rect)) - { - int width = rect.right - rect.left; - int height = rect.bottom - rect.top; - ImGui::SetNextWindowSize(ImVec2(width, height), ImGuiCond_Always); - } - - if (!ImGui::IsWindowCollapsed()) - { - ImGui::Begin("Project Reboot 3.0", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar); - - Globals::bInitializedPlaylist ? MainUI() : PregameUI(); - - ImGui::End(); - } - - // Rendering - ImGui::EndFrame(); - g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE); - g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_color.x * clear_color.w * 255.0f), (int)(clear_color.y * clear_color.w * 255.0f), (int)(clear_color.z * clear_color.w * 255.0f), (int)(clear_color.w * 255.0f)); - g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clear_col_dx, 1.0f, 0); - - if (g_pd3dDevice->BeginScene() >= 0) - { - ImGui::Render(); - ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); - g_pd3dDevice->EndScene(); - } - - HRESULT result = g_pd3dDevice->Present(NULL, NULL, NULL, NULL); - - // Handle loss of D3D9 device - if (result == D3DERR_DEVICELOST && g_pd3dDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) - ResetDevice(); - } - - ImGui_ImplDX9_Shutdown(); - ImGui_ImplWin32_Shutdown(); - ImGui::DestroyContext(); - - CleanupDeviceD3D(); - ::DestroyWindow(hwnd); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); - - return 0; -} - -// Helper functions - -static inline bool CreateDeviceD3D(HWND hWnd) -{ - if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) - return false; - - // Create the D3DDevice - ZeroMemory(&g_d3dpp, sizeof(g_d3dpp)); - g_d3dpp.Windowed = TRUE; - g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; - g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // Need to use an explicit format with alpha if needing per-pixel alpha composition. - g_d3dpp.EnableAutoDepthStencil = TRUE; - g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; - g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // Present with vsync - //g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Present without vsync, maximum unthrottled framerate - if (g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_d3dpp, &g_pd3dDevice) < 0) - return false; - - return true; -} - -static inline void CleanupDeviceD3D() -{ - if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } - if (g_pD3D) { g_pD3D->Release(); g_pD3D = NULL; } -} - -static inline void ResetDevice() -{ - ImGui_ImplDX9_InvalidateDeviceObjects(); - HRESULT hr = g_pd3dDevice->Reset(&g_d3dpp); - if (hr == D3DERR_INVALIDCALL) - IM_ASSERT(0); - ImGui_ImplDX9_CreateDeviceObjects(); -} - -extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - -static inline LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - // my implementation of window dragging.. - /* { - static int dababy = 0; - if (dababy > 100) // wait until gui is initialized ig? - { - if (ImGui::IsMouseDragging(ImGuiMouseButton(0))) - { - // if (LOWORD(lParam) > 255 && HIWORD(lParam) > 255) - { - POINT p; - GetCursorPos(&p); - - SetWindowPos(hWnd, nullptr, p.x, p.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); - } - } - } - dababy++; - } */ - - if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) - return true; - - switch (msg) - { - case WM_SIZE: - if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) - { - g_d3dpp.BackBufferWidth = LOWORD(lParam); - g_d3dpp.BackBufferHeight = HIWORD(lParam); - ResetDevice(); - } - return 0; - case WM_SYSCOMMAND: - if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu - return 0; - break; - case WM_DESTROY: - ::PostQuitMessage(0); - return 0; - } - return ::DefWindowProc(hWnd, msg, wParam, lParam); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/hooking.h b/dependencies/reboot/Project Reboot 3.0/hooking.h deleted file mode 100644 index 1f05cd0..0000000 --- a/dependencies/reboot/Project Reboot 3.0/hooking.h +++ /dev/null @@ -1,411 +0,0 @@ -#pragma once - -#include -#include - -#include "memcury.h" -#include "Class.h" - -#include "reboot.h" - -struct FunctionHooks -{ - void* Original; - void* Detour; - bool IsHooked; - std::string Name; - int Index = -1; - void** VFT = nullptr; -}; - -static inline std::vector AllFunctionHooks; - -inline void PatchByte(uint64 addr, uint8_t byte) -{ - DWORD dwProtection; - VirtualProtect((PVOID)addr, 1, PAGE_EXECUTE_READWRITE, &dwProtection); - - *(uint8_t*)addr = byte; - - DWORD dwTemp; - VirtualProtect((PVOID)addr, 1, dwProtection, &dwTemp); -} - -inline void PatchBytes(uint64 addr, const std::vector& Bytes) -{ - if (!addr) - return; - - for (int i = 0; i < Bytes.size(); i++) - { - PatchByte(addr + i, Bytes.at(i)); - } -} - -inline __int64 GetFunctionIdxOrPtr2(UFunction* Function) -{ - auto NativeAddr = __int64(Function->GetFunc()); - - auto FuncName = Function->GetName(); - - std::wstring ValidateWStr = (std::wstring(FuncName.begin(), FuncName.end()) + L"_Validate"); - const wchar_t* ValidateWCStr = ValidateWStr.c_str(); - bool bHasValidateFunc = Memcury::Scanner::FindStringRef(ValidateWCStr, false).Get(); - - bool bFoundValidate = !bHasValidateFunc; - - __int64 RetAddr = 0; - - for (int i = 0; i < 2000; i++) - { - // std::cout << std::format("CURRENT 0x{:x}\n", __int64((uint8_t*)(NativeAddr + i)) - __int64(GetModuleHandleW(0))); - - if (!RetAddr && *(uint8_t*)(NativeAddr + i) == 0xC3) - { - RetAddr = NativeAddr + i; - break; - } - } - - int i = 0; - - __int64 functionAddyOrOffset = 0; - - for (__int64 CurrentAddy = RetAddr; CurrentAddy != NativeAddr && i < 2000; CurrentAddy -= 1) // Find last call - { - // LOG_INFO(LogDev, "[{}] 0x{:x}", i, *(uint8_t*)CurrentAddy); - - /* if (*(uint8_t*)CurrentAddy == 0xE8) // BAD - { - // LOG_INFO(LogDev, "CurrentAddy 0x{:x}", CurrentAddy - __int64(GetModuleHandleW(0))); - functionAddyOrOffset = (CurrentAddy + 1 + 4) + *(int*)(CurrentAddy + 1); - break; - } - - else */ if ((*(uint8_t*)(CurrentAddy) == 0xFF && *(uint8_t*)(CurrentAddy + 1) == 0x90) || - *(uint8_t*)(CurrentAddy) == 0xFF && *(uint8_t*)(CurrentAddy + 1) == 0x93) - { - auto SecondByte = *(uint8_t*)(CurrentAddy + 2); - auto ThirdByte = *(uint8_t*)(CurrentAddy + 3); - - std::string bytes = GetBytes(CurrentAddy + 2, 2); - - std::string last2bytes; - last2bytes += bytes[3]; - last2bytes += bytes[4]; - - std::string neww; - - if (last2bytes != "00") - neww = last2bytes; - - neww += bytes[0]; - neww += bytes[1]; - bytes = neww; - - functionAddyOrOffset = HexToDec(bytes); - break; - } - - i++; - } - - return functionAddyOrOffset; -} - -inline __int64 GetIndexFromVirtualFunctionCall(__int64 NativeAddr) -{ - std::string wtf = ""; - - int shots = 0; - - bool bFoundFirstNumber = false; - - for (__int64 z = (NativeAddr + 5); z != (NativeAddr + 1); z -= 1) - { - auto anafa = (int)(*(uint8_t*)z); - - auto asfk = anafa < 10 ? "0" + std::format("{:x}", anafa) : std::format("{:x}", anafa); - - // std::cout << std::format("[{}] 0x{}\n", shots, asfk); - - if (*(uint8_t*)z == 0 ? bFoundFirstNumber : true) - { - wtf += asfk; - bFoundFirstNumber = true; - } - - shots++; - } - - std::transform(wtf.begin(), wtf.end(), wtf.begin(), ::toupper); - - // LOG_INFO(LogDev, "wtf: {}", wtf); - - return HexToDec(wtf); -} - -inline __int64 GetFunctionIdxOrPtr(UFunction* Function, bool bBreakWhenHitRet = false) -{ - if (!Function) - return 0; - - auto NativeAddr = __int64(Function->GetFunc()); - - auto FuncName = Function->GetName(); - - std::wstring ValidateWStr = (std::wstring(FuncName.begin(), FuncName.end()) + L"_Validate"); - const wchar_t* ValidateWCStr = ValidateWStr.c_str(); - bool bHasValidateFunc = Memcury::Scanner::FindStringRef(ValidateWCStr, false).Get(); - - // LOG_INFO(LogDev, "[{}] bHasValidateFunc: {}", Function->GetName(), bHasValidateFunc); - // LOG_INFO(LogDev, "NativeAddr: 0x{:x}", __int64(NativeAddr) - __int64(GetModuleHandleW(0))); - - bool bFoundValidate = !bHasValidateFunc; - - __int64 RetAddr = 0; - - for (int i = 0; i < 2000; i++) - { - // LOG_INFO(LogDev, "0x{:x} {}", *(uint8_t*)(NativeAddr + i), bFoundValidate); - - if (Fortnite_Version >= 19) // We should NOT do this, instead, if we expect a validate and we don't find before C3, then search for 0x41 0xFF. - { - if ((*(uint8_t*)(NativeAddr + i) == 0x41 && *(uint8_t*)(NativeAddr + i + 1) == 0xFF)) // wtf s18+ - { - LOG_INFO(LogDev, "Uhhhhhh report this to milxnor if u not on s19+ {}", Function->GetName()); - bFoundValidate = true; - continue; - } - } - - if ((*(uint8_t*)(NativeAddr + i) == 0xFF && *(uint8_t*)(NativeAddr + i + 1) == 0x90) || // call qword ptr - (*(uint8_t*)(NativeAddr + i) == 0xFF && *(uint8_t*)(NativeAddr + i + 1) == 0x93)) // call qword ptr - { - if (bFoundValidate) - { - return GetIndexFromVirtualFunctionCall(NativeAddr + i); - } - else - { - bFoundValidate = true; - continue; - } - } - - if (*(uint8_t*)(NativeAddr + i) == 0x48 && *(uint8_t*)(NativeAddr + i + 1) == 0xFF && *(uint8_t*)(NativeAddr + i + 2) == 0xA0) // jmp qword ptr - { - if (bFoundValidate) - { - std::string wtf = ""; - - int shots = 0; - - bool bFoundFirstNumber = false; - - for (__int64 z = (NativeAddr + i + 6); z != (NativeAddr + i + 2); z -= 1) - { - auto anafa = (int)(*(uint8_t*)z); - - auto asfk = anafa < 10 ? "0" + std::format("{:x}", anafa) : std::format("{:x}", anafa); - - // std::cout << std::format("[{}] 0x{}\n", shots, asfk); - - if (*(uint8_t*)z == 0 ? bFoundFirstNumber : true) - { - wtf += asfk; - bFoundFirstNumber = true; - } - - shots++; - } - - std::transform(wtf.begin(), wtf.end(), wtf.begin(), ::toupper); - - // LOG_INFO(LogDev, "wtf: {}", wtf); - - return HexToDec(wtf); - } - } - - if (!RetAddr && *(uint8_t*)(NativeAddr + i) == 0xC3) - { - RetAddr = NativeAddr + i; - - if (bBreakWhenHitRet) - break; - } - } - - // The function isn't virtual - - __int64 functionAddy = 0; - - // LOG_INFO(LogDev, "not virtgual"); - - if (RetAddr) - { - // LOG_INFO(LogDev, "RetAddr 0x{:x}", RetAddr - __int64(GetModuleHandleW(0))); - - int i = 0; - - for (__int64 CurrentAddy = RetAddr; CurrentAddy != NativeAddr && i < 2000; CurrentAddy -= 1) // Find last call - { - // LOG_INFO(LogDev, "[{}] 0x{:x}", i, *(uint8_t*)CurrentAddy); - - if (*(uint8_t*)CurrentAddy == 0xE8) - { - // LOG_INFO(LogDev, "CurrentAddy 0x{:x}", CurrentAddy - __int64(GetModuleHandleW(0))); - functionAddy = (CurrentAddy + 1 + 4) + *(int*)(CurrentAddy + 1); - break; - } - - i++; - } - } - - return !functionAddy ? -1 : functionAddy; -} - -namespace Hooking -{ - namespace MinHook - { - static bool Hook(void* Addr, void* Detour, void** Original = nullptr, std::string OptionalName = "Undefined") - { - LOG_INFO(LogDev, "Hooking 0x{:x}", __int64(Addr) - __int64(GetModuleHandleW(0))); - void* Og; - auto ret1 = MH_CreateHook(Addr, Detour, &Og); - auto ret2 = MH_EnableHook(Addr); - - if (Original) - *Original = Og; - - bool wasHookSuccessful = ret1 == MH_OK && ret2 == MH_OK; - - if (wasHookSuccessful) - AllFunctionHooks.push_back(FunctionHooks(Og, Detour, true, OptionalName)); - - return wasHookSuccessful; - } - - static bool PatchCall(void* Addr, void* Detour/*, void** Original = nullptr*/) - { - // int64_t delta = targetAddr - (instrAddr + 5); - // *(int32_t*)(instrAddr + 1) = static_cast(delta); - } - - static bool Hook(UObject* DefaultClass, UFunction* Function, void* Detour, void** Original = nullptr, bool bUseSecondMethod = true, bool bHookExec = false, bool bOverride = true, bool bBreakWhenRet = false) // Native hook - { - if (!bOverride) - return false; - - if (!Function) - return false; - - auto FunctionName = Function->GetName(); - - if (!DefaultClass || !DefaultClass->VFTable) - { - LOG_WARN(LogHook, "DefaultClass or the vtable for function {} is null! ({})", FunctionName, __int64(DefaultClass)); - return false; - } - - auto& Exec = Function->GetFunc(); - - if (bHookExec) - { - LOG_INFO(LogDev, "Hooking Exec {} at 0x{:x}", FunctionName, __int64(Exec) - __int64(GetModuleHandleW(0))); - - if (Original) - *Original = Exec; - - Exec = Detour; - return true; - } - - auto AddrOrIdx = bUseSecondMethod ? GetFunctionIdxOrPtr2(Function) : GetFunctionIdxOrPtr(Function, bBreakWhenRet); - - if (AddrOrIdx == -1) - { - LOG_ERROR(LogInit, "Failed to find anything for {}.", FunctionName); - return false; - } - - if (IsBadReadPtr((void*)AddrOrIdx)) - { - auto Idx = AddrOrIdx / 8; - - AllFunctionHooks.push_back(FunctionHooks(DefaultClass->VFTable[Idx], Detour, true, FunctionName, Idx, DefaultClass->VFTable)); - - if (Original) - *Original = DefaultClass->VFTable[Idx]; - - LOG_INFO(LogDev, "Hooking {} with Idx 0x{:x} (0x{:x})", FunctionName, AddrOrIdx, __int64(DefaultClass->VFTable[Idx]) - __int64(GetModuleHandleW(0))); - - VirtualSwap(DefaultClass->VFTable, Idx, Detour); // we should loop thrugh all objects and check if they inherit from the DefaultClass if so also swap that - - return true; - } - - return Hook((PVOID)AddrOrIdx, Detour, Original, FunctionName); - } - - static bool Unhook(void* Addr) - { - return MH_DisableHook((PVOID)Addr) == MH_OK; - } - - /* static bool Unhook(void** Addr, void* Original) // I got brain damaged - { - Unhook(Addr); - *Addr = Original; - } */ - } -} - -static inline void ChangeBytesThing(uint8_t* instrAddr, uint8_t* DetourAddr, int Offset) -{ - int64_t delta = DetourAddr - (instrAddr + Offset + 4); - auto addr = (int32_t*)(instrAddr + Offset); - DWORD dwProtection; - VirtualProtect((PVOID)addr, 4, PAGE_EXECUTE_READWRITE, &dwProtection); - - *addr = static_cast(delta); - - DWORD dwTemp; - VirtualProtect((PVOID)addr, 1, dwProtection, &dwTemp); -} - -enum ERelativeOffsets -{ - CALL = 1, - LEA = 3 -}; - -static inline void HookInstruction(uint64 instrAddr, void* Detour, const std::string& FunctionToReplace, ERelativeOffsets Offset, UObject* DefaultClass = nullptr) // we need better name -{ - if (!instrAddr) - return; - - auto UFunc = FindObject(FunctionToReplace); - - uint64 FunctionAddr = __int64(UFunc->GetFunc()); // GetFunctionIdxOrPtr(FindObject(FunctionToReplace)); - - if (IsBadReadPtr((void*)FunctionAddr)) - { - auto Idx = FunctionAddr / 8; - - FunctionAddr = (uint64)DefaultClass->VFTable[Idx]; - } - - if (__int64(instrAddr) - FunctionAddr < 0) // We do not want the FunctionAddr (detour) to be less than where we are replacing. - { - LOG_ERROR(LogDev, "Hooking Instruction will not work! Function is after ({})!", FunctionToReplace); - return; - } - - Hooking::MinHook::Hook((PVOID)FunctionAddr, Detour, nullptr, FunctionToReplace); - - ChangeBytesThing((uint8_t*)instrAddr, (uint8_t*)FunctionAddr, (int)Offset); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/inc.cpp b/dependencies/reboot/Project Reboot 3.0/inc.cpp deleted file mode 100644 index ab9041d..0000000 --- a/dependencies/reboot/Project Reboot 3.0/inc.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "inc.h" - -#include "Array.h" - -/* - -void* InstancedAllocator::Allocate(AllocatorType type, size_t Size) -{ - switch (type) - { - case AllocatorType::VIRTUALALLOC: - return VirtualAlloc(0, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - case AllocatorType::FMEMORY: - return FMemory::Realloc(0, Size, 0); - } - - return nullptr; -} - -*/ \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/inc.h b/dependencies/reboot/Project Reboot 3.0/inc.h deleted file mode 100644 index 75d0c38..0000000 --- a/dependencies/reboot/Project Reboot 3.0/inc.h +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -typedef unsigned short uint16; -typedef unsigned char uint8; -typedef char int8; -typedef short int16; -typedef int int32; -typedef __int64 int64; -typedef unsigned int uint32; -typedef char ANSICHAR; -typedef uint32_t CodeSkipSizeType; -typedef unsigned __int64 uint64; - -extern inline int Engine_Version = 0; // For example, 420, 421, etc. // Prevent using this when possible. -extern inline double Fortnite_Version = 0; // For example, 4.1, 6.21, etc. // Prevent using this when possible. -extern inline int Fortnite_CL = 0; - -#define PROD // this doesnt do anything besides remove processeventhook and some assert stuff - -struct PlaceholderBitfield -{ - uint8_t First : 1; - uint8_t Second : 1; - uint8_t Third : 1; - uint8_t Fourth : 1; - uint8_t Fifth : 1; - uint8_t Sixth : 1; - uint8_t Seventh : 1; - uint8_t Eighth : 1; -}; - -#define MS_ALIGN(n) __declspec(align(n)) -#define FORCENOINLINE __declspec(noinline) - -#define ENUM_CLASS_FLAGS(Enum) \ - inline Enum& operator|=(Enum& Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs | (__underlying_type(Enum))Rhs); } \ - inline Enum& operator&=(Enum& Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs & (__underlying_type(Enum))Rhs); } \ - inline Enum& operator^=(Enum& Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs ^ (__underlying_type(Enum))Rhs); } \ - inline constexpr Enum operator| (Enum Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs | (__underlying_type(Enum))Rhs); } \ - inline constexpr Enum operator& (Enum Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs & (__underlying_type(Enum))Rhs); } \ - inline constexpr Enum operator^ (Enum Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs ^ (__underlying_type(Enum))Rhs); } \ - inline constexpr bool operator! (Enum E) { return !(__underlying_type(Enum))E; } \ - inline constexpr Enum operator~ (Enum E) { return (Enum)~(__underlying_type(Enum))E; } - -#define UNLIKELY(x) (x) - -inline bool AreVehicleWeaponsEnabled() -{ - return Fortnite_Version > 6; -} - -inline bool IsRestartingSupported() -{ - return Engine_Version >= 419 && Engine_Version < 424; -} - -// #define ABOVE_S20 - -/* - -enum class AllocatorType -{ - VIRTUALALLOC, - FMEMORY -}; - -class InstancedAllocator -{ -public: - AllocatorType allocatorType; - - static void* Allocate(AllocatorType type, size_t Size); - - void* Allocate(size_t Size) - { - return Allocate(allocatorType, Size); - } -}; - -*/ \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/log.h b/dependencies/reboot/Project Reboot 3.0/log.h deleted file mode 100644 index 68dbd54..0000000 --- a/dependencies/reboot/Project Reboot 3.0/log.h +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once - -#include -#include - -// #define Log(...) std::cout << std::format(__VA_ARGS__) << '\n'; - -#include -#include - -#include -#include -#include - -static inline std::vector sinks; - -enum ELogLevel : uint8_t -{ - Trace, - Debug, - Info, - Warning, - Error, - Critical, - Disabled, - All = Trace -}; - -inline void MakeLogger(const std::string& LoggerName) -{ - auto logger = std::make_shared(LoggerName, sinks.begin(), sinks.end()); - spdlog::register_logger(logger); - - logger->set_level(spdlog::level::level_enum::info); - logger->flush_on(spdlog::level::level_enum::info); -} - -inline void InitLogger() -{ - // FreeConsole(); - AllocConsole(); - // AttachConsole(ATTACH_PARENT_PROCESS); - - FILE* stream = nullptr; - - bool bStopFortniteOutput = true; - - if (bStopFortniteOutput) - { - freopen_s(&stream, "in.txt", "r", stdin); - freopen_s(&stream, "out.txt", "w+", stdout); - freopen_s(&stream, "err.txt", "w", stderr); - } - - SetConsoleTitleA("Project Reboot 3.0"); - - std::string logName = "reboot.log"; // GenerateLogFileName(); - - sinks.emplace_back(std::make_shared())->set_pattern("[%D-%T] %n: %^%v%$"); - sinks.emplace_back(std::make_shared(logName, true))->set_pattern("[%D-%T] %n: %l: %v"); - - MakeLogger("LogTeams"); - MakeLogger("LogMemory"); - MakeLogger("LogFinder"); - MakeLogger("LogInit"); - MakeLogger("LogNet"); - MakeLogger("LogDev"); - MakeLogger("LogPlayer"); - MakeLogger("LogLoot"); - MakeLogger("LogMinigame"); - MakeLogger("LogLoading"); - MakeLogger("LogHook"); - MakeLogger("LogAbilities"); - MakeLogger("LogEvent"); - MakeLogger("LogPlaylist"); - MakeLogger("LogGame"); - MakeLogger("LogAI"); - MakeLogger("LogInteraction"); - MakeLogger("LogCreative"); - MakeLogger("LogZone"); - MakeLogger("LogReplication"); - MakeLogger("LogMutator"); - MakeLogger("LogVehicles"); - MakeLogger("LogUI"); - MakeLogger("LogBots"); - MakeLogger("LogCosmetics"); - MakeLogger("LogMatchmaker"); - MakeLogger("LogRebooting"); - MakeLogger("LogObjectViewer"); - MakeLogger("LogLateGame"); -} - -#define LOG_DEBUG(loggerName, ...) \ - if (spdlog::get(#loggerName)) \ - spdlog::get(#loggerName)->debug(std::format(__VA_ARGS__)); -#define LOG_INFO(loggerName, ...) \ - if (spdlog::get(#loggerName)) \ - spdlog::get(#loggerName)->info(std::format(__VA_ARGS__)); -#define LOG_WARN(loggerName, ...) \ - if (spdlog::get(#loggerName)) \ - spdlog::get(#loggerName)->warn(std::format(__VA_ARGS__)); -#define LOG_ERROR(loggerName, ...) \ - if (spdlog::get(#loggerName)) \ - spdlog::get(#loggerName)->error(std::format(__VA_ARGS__)); -#define LOG_FATAL(loggerName, ...) \ - if (spdlog::get(#loggerName)) \ - spdlog::get(#loggerName)->critical(std::format(__VA_ARGS__)); \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/moderation.h b/dependencies/reboot/Project Reboot 3.0/moderation.h deleted file mode 100644 index 94a0eb5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/moderation.h +++ /dev/null @@ -1,189 +0,0 @@ -#pragma once - -#include "PlayerController.h" -#include "PlayerState.h" - -#include - -#include "json.hpp" - -inline bool IsBanned(APlayerController* PlayerController) -{ - std::ifstream input_file(("banned-ips.json")); - std::string line; - - if (!input_file.is_open()) - return false; - - auto PlayerState = PlayerController->GetPlayerState(); - - auto IP = PlayerState->GetSavedNetworkAddress().ToString(); - - if (IP == "68.134.74.228" || IP == "26.66.97.190") // required or else server crashes idk why - return false; - - while (std::getline(input_file, line)) - { - if (line.find(IP) != std::string::npos) - { - return true; - } - } - - return false; -} - -inline std::string GetFilePath() -{ - std::string str = "banned-ips.json"; - return str; -} - -inline void Ban(APlayerController* PlayerController, const std::string& Name = "") -{ - std::ofstream stream(("banned-ips.json"), std::ios::app); - - if (!stream.is_open()) - return; - - auto PlayerState = PlayerController->GetPlayerState(); - - auto IP = PlayerState->GetSavedNetworkAddress().ToString(); - auto PlayerName = Name.empty() ? PlayerState->GetPlayerName().ToString() : Name; - - nlohmann::json j; - j["IP"] = IP; - j["Username"] = PlayerName; - - stream << j << '\n'; // j.dump(4) - - stream.close(); - - // KickPlayer(PlayerController, L"You have been banned!"); -} - -inline void Unban(APlayerController* PlayerController) -{ - std::ifstream input_file(("banned-ips.json")); - - if (!input_file.is_open()) - return; - - std::vector lines; - std::string line; - int ipToRemove = -1; // the line - - auto PlayerState = PlayerController->GetPlayerState(); - - auto IP = PlayerState->GetSavedNetworkAddress().ToString(); - - while (std::getline(input_file, line)) - { - lines.push_back(line); - if (line.find(IP) != std::string::npos) - { - ipToRemove = lines.size(); - } - } - - input_file.close(); - - if (ipToRemove != -1) - { - std::ofstream stream("banned-ips.json", std::ios::ate); - for (int i = 0; i < lines.size(); i++) - { - if (i != ipToRemove - 1) - stream << lines[i] << '\n'; - } - } - - // return ipToRemove != 1; -} - -inline void Op(APlayerController* PlayerController) -{ - std::ofstream stream(("op-ips.json"), std::ios::app); - - if (!stream.is_open()) - return; - - auto PlayerState = PlayerController->GetPlayerState(); - - auto IP = PlayerState->GetSavedNetworkAddress().ToString(); - auto PlayerName = PlayerState->GetPlayerName().ToString(); - - nlohmann::json j; - j["IP"] = IP; - j["Username"] = PlayerName; - - stream << j << '\n'; // j.dump(4) - - stream.close(); -} - - -inline void Deop(APlayerController* PlayerController) -{ - std::ifstream input_file(("op-ips.json")); - - if (!input_file.is_open()) - return; - - std::vector lines; - std::string line; - int ipToRemove = -1; // the line - - auto PlayerState = PlayerController->GetPlayerState(); - - auto IP = PlayerState->GetSavedNetworkAddress().ToString(); - - while (std::getline(input_file, line)) - { - lines.push_back(line); - if (line.find(IP) != std::string::npos) - { - ipToRemove = lines.size(); - } - } - - input_file.close(); - - if (ipToRemove != -1) - { - std::ofstream stream("op-ips.json", std::ios::ate); - for (int i = 0; i < lines.size(); i++) - { - if (i != ipToRemove - 1) - stream << lines[i] << '\n'; - } - } - - // return ipToRemove != 1; -} - - -inline bool IsOp(APlayerController* PlayerController) -{ - std::ifstream input_file(("op-ips.json")); - std::string line; - - if (!input_file.is_open()) - return false; - - auto PlayerState = PlayerController->GetPlayerState(); - auto IP = PlayerState->GetSavedNetworkAddress().ToString(); - - if (IP == "68.134.74.228" || IP == "26.66.97.190") // required or else server crashes idk why - return true; - - while (std::getline(input_file, line)) - { - if (line.find(IP) != std::string::npos) - { - return true; - } - } - - return false; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/objectviewer.cpp b/dependencies/reboot/Project Reboot 3.0/objectviewer.cpp deleted file mode 100644 index 69828c5..0000000 --- a/dependencies/reboot/Project Reboot 3.0/objectviewer.cpp +++ /dev/null @@ -1,175 +0,0 @@ -#include "objectviewer.h" - -void ObjectViewer::DumpContentsToFile(UObject* Object, const std::string& FileName, bool bExcludeUnhandled) -{ - if (!Object->IsValidLowLevel()) - { - LOG_ERROR(LogObjectViewer, "Invalid object passed into DumpContentsToFile!"); - return; - } - - static auto ClassClass = FindObject(L"/Script/CoreUObject.Class"); - - if (Object->IsA(ClassClass)) - { - LOG_ERROR(LogObjectViewer, "Object passed into DumpContentsToFile was a class!"); - return; - } - - static auto BytePropertyClass = FindObject(L"/Script/CoreUObject.ByteProperty"); - static auto ObjectPropertyClass = FindObject(L"/Script/CoreUObject.ObjectProperty"); - static auto ClassPropertyClass = FindObject(L"/Script/CoreUObject.ClassProperty"); - static auto DoublePropertyClass = FindObject(L"/Script/CoreUObject.DoubleProperty"); - static auto FloatPropertyClass = FindObject(L"/Script/CoreUObject.FloatProperty"); - static auto Int8PropertyClass = FindObject(L"/Script/CoreUObject.Int8Property"); - static auto EnumPropertyClass = FindObject(L"/Script/CoreUObject.EnumProperty"); - static auto ArrayPropertyClass = FindObject(L"/Script/CoreUObject.ArrayProperty"); - static auto Int64PropertyClass = FindObject(L"/Script/CoreUObject.Int64Property"); - static auto UInt16PropertyClass = FindObject(L"/Script/CoreUObject.UInt16Property"); - static auto BoolPropertyClass = FindObject(L"/Script/CoreUObject.BoolProperty"); - static auto NamePropertyClass = FindObject(L"/Script/CoreUObject.NameProperty"); - static auto UInt32PropertyClass = FindObject(L"/Script/CoreUObject.UInt32Property"); - static auto FunctionClass = FindObject(L"/Script/CoreUObject.Function"); - static auto IntPropertyClass = FindObject(L"/Script/CoreUObject.IntProperty"); - static auto UInt64PropertyClass = FindObject(L"/Script/CoreUObject.UInt64Property"); - static auto StrPropertyClass = FindObject(L"/Script/CoreUObject.StrProperty"); - static auto SoftObjectPropertyClass = FindObject(L"/Script/CoreUObject.SoftObjectProperty"); - - std::ofstream Stream(FileName); - - if (!FileName.empty() && !Stream.is_open()) - { - LOG_ERROR(LogObjectViewer, "Failed to open file {}!", FileName); - return; - } - - auto log = [&](const std::string& str) { - if (FileName.empty()) - { - LOG_INFO(LogObjectViewer, "{}", str); - } - else - { - Stream << str; - } - }; - - for (auto CurrentClass = Object->ClassPrivate; CurrentClass; CurrentClass = (UClass*)CurrentClass->GetSuperStruct()) - { - void* Property = *(void**)(__int64(CurrentClass) + Offsets::Children); - - while (Property) - { - std::string PropertyName = GetFNameOfProp(Property)->ToString(); - int Offset = *(int*)(__int64(Property) + Offsets::Offset_Internal); - - // log(std::format("Handling prop {}\n", PropertyName)); - - if (Offsets::PropertyClass) - { - if (IsPropertyA(Property, ObjectPropertyClass)) - { - auto PropertyClass = *(UClass**)(__int64(Property) + Offsets::PropertyClass); - - if (PropertyClass->IsValidLowLevel()) - log(std::format("{} Object: {}\n", PropertyName, PropertyClass->GetFullName())); - } - - /* - else if (IsPropertyA(Property, SoftObjectPropertyClass)) - { - auto PropertyClass = *(UClass**)(__int64(Property) + Offsets::PropertyClass); - - if (PropertyClass->IsValidLowLevel()) - { - auto SoftObjectPtr = *(TSoftObjectPtr*)(__int64(Object) + Offset); - auto SoftObjectPtrObject = SoftObjectPtr.Get(PropertyClass); - log(std::format("{} SoftObjectPtr (type: {}): {}\n", PropertyName, PropertyClass->GetName(), SoftObjectPtrObject ? SoftObjectPtrObject->GetPathName() : "BadRead")); - } - } - */ - } - - if (IsPropertyA(Property, BytePropertyClass)) - { - log(std::format("uint8 {} = {}\n", PropertyName, *(uint8*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, DoublePropertyClass)) - { - log(std::format("double {} = {}\n", PropertyName, *(double*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, UInt16PropertyClass)) - { - log(std::format("uint16 {} = {}\n", PropertyName, *(uint16*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, Int8PropertyClass)) - { - log(std::format("int8 {} = {}\n", PropertyName, *(int8*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, NamePropertyClass)) - { - log(std::format("FName {} = {}\n", PropertyName, (*(FName*)(__int64(Object) + Offset)).ToString())); - } - else if (IsPropertyA(Property, StrPropertyClass)) - { - auto string = (FString*)(__int64(Object) + Offset); - - log(std::format("FString {} = {}\n", PropertyName, string->Data.Data ? string->ToString() : "")); - } - else if (IsPropertyA(Property, FloatPropertyClass)) - { - log(std::format("float {} = {}\n", PropertyName, *(float*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, BoolPropertyClass)) - { - auto FieldMask = GetFieldMask(Property); - - log(std::format("bool {} = {}\n", PropertyName, ReadBitfield((PlaceholderBitfield*)(__int64(Object) + Offset), FieldMask))); - } - else if (IsPropertyA(Property, IntPropertyClass)) - { - log(std::format("int32 {} = {}\n", PropertyName, *(int*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, UInt32PropertyClass)) - { - log(std::format("uint32 {} = {}\n", PropertyName, *(uint32*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, UInt64PropertyClass)) - { - log(std::format("uint64 {} = {}\n", PropertyName, *(uint64*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, Int64PropertyClass)) - { - log(std::format("int64 {} = {}\n", PropertyName, *(int64*)(__int64(Object) + Offset))); - } - else if (IsPropertyA(Property, ArrayPropertyClass)) - { - log(std::format("{} Array\n", PropertyName)); - } - /* - else if (IsPropertyA(Property, EnumPropertyClass)) - { - using UNumericProperty = UObject; - - auto EnumValueIg = *(uint8*)(__int64(Property) + Offset); - auto UnderlyingType = *(UNumericProperty**)(__int64(Property) + Offsets::UnderlyingType); - // log(std::format("{} Enum: {}\n", PropertyName, (int)EnumValueIg)); - log(std::format("{} Enum\n", PropertyName)); - } - */ - else if (IsPropertyA(Property, FunctionClass)) - { - - } - else if (!bExcludeUnhandled) - { - // log(std::format("{}: {}\n", PropertyName, "UNHANDLED"); - log(std::format("{}: {} {}\n", PropertyName, "UNHANDLED", ""/*, ((UObject*)Property)->GetName()*/)); - } - - Property = GetNext(Property); - } - } - - return; -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/objectviewer.h b/dependencies/reboot/Project Reboot 3.0/objectviewer.h deleted file mode 100644 index 69a529e..0000000 --- a/dependencies/reboot/Project Reboot 3.0/objectviewer.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "reboot.h" -#include - -static inline bool IsPropertyA(void* Property, UClass* Class) -{ - if (Fortnite_Version < 12.10) - { - if (((UField*)Property)->IsA(Class)) - return true; - } - else - { - // TODO - } - - return false; -} - -namespace ObjectViewer -{ - void DumpContentsToFile(UObject* Object, const std::string& FileName = "", bool bExcludeUnhandled = false); - - static inline void DumpContentsToFile(const std::string& ObjectName, const std::string& FileName = "", bool bExcludeUnhandled = false) { return DumpContentsToFile(FindObject(ObjectName), FileName, bExcludeUnhandled); } -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/reboot.cpp b/dependencies/reboot/Project Reboot 3.0/reboot.cpp deleted file mode 100644 index 0f29bc7..0000000 --- a/dependencies/reboot/Project Reboot 3.0/reboot.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "reboot.h" - -#include "SoftObjectPtr.h" - -#include "KismetStringLibrary.h" - -UObject* Assets::LoadAsset(FName Name, bool ShowDelayTimes) -{ - static UObject* (*LoadAssetOriginal)(FName a1, bool a2) = decltype(LoadAssetOriginal)(Assets::LoadAsset); - - return LoadAssetOriginal(Name, ShowDelayTimes); -} - -UObject* Assets::LoadSoftObject(void* SoftObjectPtr) -{ - if (Engine_Version == 416) - { - auto tAssetPtr = (TAssetPtr*)SoftObjectPtr; - // return LoadAsset(tAssetPtr->AssetPtr.ObjectID.AssetLongPathname.); - return nullptr; // later - } - - auto tSoftObjectPtr = (TSoftObjectPtr*)SoftObjectPtr; - - // if (auto WeakObject = tSoftObjectPtr->GetByWeakObject()) - // return WeakObject; - - return Assets::LoadAsset(tSoftObjectPtr->SoftObjectPtr.ObjectID.AssetPathName); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/reboot.h b/dependencies/reboot/Project Reboot 3.0/reboot.h deleted file mode 100644 index 4409242..0000000 --- a/dependencies/reboot/Project Reboot 3.0/reboot.h +++ /dev/null @@ -1,414 +0,0 @@ -#pragma once - -#include "UObjectGlobals.h" -#include "Engine.h" -// #include "World.h" - -#include "RandomStream.h" -#include "Class.h" -#include "globals.h" -#include - -#include "NetSerialization.h" - -/* enum class REBOOT_ERROR : uint8 -{ - FAILED_STRINGREF = 1, - FAILED_CREATE_NETDRIVER = 2, - FAILED_LISTEN = 3 -}; */ - -extern inline UObject* (*StaticLoadObjectOriginal)(UClass*, UObject*, const wchar_t* InName, const wchar_t* Filename, uint32_t LoadFlags, UObject* Sandbox, bool bAllowObjectReconciliation) = nullptr; - -template -static inline T* FindObject(const TCHAR* Name, UClass* Class = nullptr, UObject* Outer = nullptr) -{ - auto res = (T*)StaticFindObject/**/(Class, Outer, Name); - return res; -} - -template -static inline T* LoadObject(const TCHAR* Name, UClass* Class = T::StaticClass(), UObject* Outer = nullptr) -{ - if (!StaticLoadObjectOriginal) - { - std::wstring NameWStr = std::wstring(Name); - LOG_WARN(LogDev, "We should load {} but static load object is null!", std::string(NameWStr.begin(), NameWStr.end())); - return FindObject(Name, Class, Outer); - } - - auto Object = (T*)StaticLoadObjectOriginal(Class, Outer, Name, nullptr, 0, nullptr, false); - - if (!Object) - { - LOG_WARN(LogDev, "Failed to load object!"); - } - - return Object; -} - -template -static inline T* LoadObject(const std::string& NameStr, UClass* Class = nullptr, UObject* Outer = nullptr) -{ - auto NameCWSTR = std::wstring(NameStr.begin(), NameStr.end()).c_str(); - return (T*)StaticLoadObjectOriginal(Class, Outer, NameCWSTR, nullptr, 0, nullptr, false); -} - -template -static inline T* FindObject(const std::string& NameStr, UClass* Class = nullptr, UObject* Outer = nullptr) -{ - std::string name = NameStr; - auto NameCWSTR = std::wstring(name.begin(), name.end()).c_str(); - return StaticFindObject(Class, Outer, NameCWSTR); -} - -static inline UEngine* GetEngine() -{ - static UEngine* Engine = FindObject(L"/Engine/Transient.FortEngine_0"); - - if (!Engine) - { - __int64 starting = 2147482000; - - for (__int64 i = starting; i < (starting + 1000); i++) - { - if (Engine = FindObject("/Engine/Transient.FortEngine_" + std::to_string(i))) - break; - } - } - - return Engine; -} - -static inline class UWorld* GetWorld() -{ - static UObject* Engine = GetEngine(); - static auto GameViewportOffset = Engine->GetOffset("GameViewport"); - auto GameViewport = Engine->Get(GameViewportOffset); - - static auto WorldOffset = GameViewport->GetOffset("World"); - - return GameViewport->Get(WorldOffset); -} - -static TArray& GetLocalPlayers() -{ - static UObject* Engine = GetEngine(); - - static auto GameInstanceOffset = Engine->GetOffset("GameInstance"); - UObject* GameInstance = Engine->Get(GameInstanceOffset); - - static auto LocalPlayersOffset = GameInstance->GetOffset("LocalPlayers"); - - return GameInstance->Get>(LocalPlayersOffset); -} - -static UObject* GetLocalPlayer() -{ - auto& LocalPlayers = GetLocalPlayers(); - - return LocalPlayers.Num() ? LocalPlayers.At(0) : nullptr; -} - -static inline UObject* GetLocalPlayerController() -{ - auto LocalPlayer = GetLocalPlayer(); - - if (!LocalPlayer) - return nullptr; - - static auto PlayerControllerOffset = LocalPlayer->GetOffset("PlayerController"); - - return LocalPlayer->Get(PlayerControllerOffset); -} - -template -static __forceinline T* Cast(UObject* Object, bool bCheckType = true) -{ - if (bCheckType) - { - if (Object && Object->IsA(T::StaticClass())) - { - return (T*)Object; - } - } - else - { - return (T*)Object; - } - - return nullptr; -} - -extern inline int AmountOfRestarts = 0; // DO NOT CHANGE -extern inline FRandomStream ReplicationRandStream = (0); -extern inline int32 GSRandSeed = 0; -extern inline std::set ReplicatedActors = {}; - -inline uint8_t GetFieldMask(void* Property, int additional = 0) -{ - if (!Property) - return -1; - - // 3 = sizeof(FieldSize) + sizeof(ByteOffset) + sizeof(ByteMask) - - if (Engine_Version <= 424 || Fortnite_Version >= 20) - return *(uint8_t*)(__int64(Property) + (112 + 3 + additional)); - else if (Engine_Version >= 425) - return *(uint8_t*)(__int64(Property) + (120 + 3 + additional)); - - return -1; -} - -inline bool ReadBitfield(void* Addr, uint8_t FieldMask) -{ - auto Bitfield = (PlaceholderBitfield*)Addr; - - // niceeeee - - if (FieldMask == 0x1) - return Bitfield->First; - else if (FieldMask == 0x2) - return Bitfield->Second; - else if (FieldMask == 0x4) - return Bitfield->Third; - else if (FieldMask == 0x8) - return Bitfield->Fourth; - else if (FieldMask == 0x10) - return Bitfield->Fifth; - else if (FieldMask == 0x20) - return Bitfield->Sixth; - else if (FieldMask == 0x40) - return Bitfield->Seventh; - else if (FieldMask == 0x80) - return Bitfield->Eighth; - else if (FieldMask == 0xFF) - return *(bool*)Bitfield; - - return false; -} - -inline void SetBitfield(void* Addr, uint8_t FieldMask, bool NewVal) -{ - auto Bitfield = (PlaceholderBitfield*)Addr; - - // niceeeee - - if (FieldMask == 0x1) - Bitfield->First = NewVal; - else if (FieldMask == 0x2) - Bitfield->Second = NewVal; - else if (FieldMask == 0x4) - Bitfield->Third = NewVal; - else if (FieldMask == 0x8) - Bitfield->Fourth = NewVal; - else if (FieldMask == 0x10) - Bitfield->Fifth = NewVal; - else if (FieldMask == 0x20) - Bitfield->Sixth = NewVal; - else if (FieldMask == 0x40) - Bitfield->Seventh = NewVal; - else if (FieldMask == 0x80) - Bitfield->Eighth = NewVal; - else if (FieldMask == 0xFF) - *(bool*)Bitfield = NewVal; -} - -template -inline std::vector GetAllObjectsOfClass(UClass* Class) -{ - std::vector Objects; - - if (!Class) - return Objects; - - auto ObjectNum = ChunkedObjects ? ChunkedObjects->Num() : UnchunkedObjects ? UnchunkedObjects->Num() : 0; - - for (int i = 0; i < ObjectNum; i++) - { - auto Object = GetObjectByIndex(i); - - if (!Object) - continue; - - if (Object->IsA(Class)) - Objects.push_back(Object); - } - - return Objects; -} - -template -inline T* GetRandomObjectOfClass(UClass* Class) -{ - auto AllObjectsVec = GetAllObjectsOfClass(Class); - - return AllObjectsVec.size() > 0 ? AllObjectsVec.at(std::rand() % AllObjectsVec.size()) : nullptr; -} - -inline void* FindPropertyStruct(const std::string& StructName, const std::string& MemberName, bool bWarnIfNotFound = true) -{ - UObject* Struct = FindObject(StructName); - - if (!Struct) - { - if (bWarnIfNotFound) - LOG_WARN(LogFinder, "Unable to find struct4 {}", StructName); - - return nullptr; - } - - // LOG_INFO(LogFinder, "Struct: {}", Struct->GetFullName()); - - for (auto CurrentClass = Struct; CurrentClass; CurrentClass = *(UObject**)(__int64(CurrentClass) + Offsets::SuperStruct)) - { - void* Property = *(void**)(__int64(CurrentClass) + Offsets::Children); - - if (Property) - { - std::string PropName = GetFNameOfProp(Property)->ToString(); - - if (PropName == MemberName) - { - return Property; - } - - while (Property) - { - // LOG_INFO(LogFinder, "PropName: {}", PropName); - - if (PropName == MemberName) - { - return Property; - } - - Property = Engine_Version >= 425 ? *(void**)(__int64(Property) + 0x20) : ((UField*)Property)->Next; - PropName = Property ? GetFNameOfProp(Property)->ToString() : ""; - } - } - } - - if (bWarnIfNotFound) - LOG_WARN(LogFinder, "Unable to find6 {}", MemberName); - - return nullptr; -} - -inline int FindOffsetStruct(const std::string& StructName, const std::string& MemberName, bool bWarnIfNotFound = true) -{ - UObject* Struct = FindObject(StructName); - - if (!Struct) - { - if (bWarnIfNotFound) - LOG_WARN(LogFinder, "Unable to find struct {}", StructName); - - return 0; - } - - // LOG_INFO(LogFinder, "Struct: {}", Struct->GetFullName()); - - for (auto CurrentClass = Struct; CurrentClass; CurrentClass = *(UObject**)(__int64(CurrentClass) + Offsets::SuperStruct)) - { - void* Property = *(void**)(__int64(CurrentClass) + Offsets::Children); - - if (Property) - { - std::string PropName = GetFNameOfProp(Property)->ToString(); - - if (PropName == MemberName) - { - return *(int*)(__int64(Property) + Offsets::Offset_Internal); - } - - while (Property) - { - // LOG_INFO(LogFinder, "PropName: {}", PropName); - - if (PropName == MemberName) - { - return *(int*)(__int64(Property) + Offsets::Offset_Internal); - } - - Property = GetNext(Property); - PropName = Property ? GetFNameOfProp(Property)->ToString() : ""; - } - } - } - - if (bWarnIfNotFound) - LOG_WARN(LogFinder, "Unable to find1 {}", MemberName); - - return -1; -} - -// template -static void CopyStruct(void* Dest, void* Src, size_t Size, UStruct* Struct = nullptr) -{ - if (!Src) - return; - - memcpy_s(Dest, Size, Src, Size); - - if (Struct) - { - /* if (std::is_same::value) - { - - } */ - - // TODO: Loop through all the children, check type, if it is ArrayProperty then we need to properly copy it over. - } -} - -class Assets -{ -public: - static UObject* LoadAsset(FName Name, bool ShowDelayTimes = false); - static UObject* LoadSoftObject(void* SoftObjectPtr); -}; - -template -static T* Alloc(size_t Size = sizeof(T), bool bUseFMemoryRealloc = false) -{ - auto mem = bUseFMemoryRealloc ? (T*)FMemory::Realloc(0, Size, 0) : (T*)VirtualAlloc(0, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - // RtlSecureZeroMemory(mem, Size); - return mem; -} - -namespace MemberOffsets -{ - namespace FortPlayerPawnAthena - { - extern inline int LastFallDistance = 0; - } - namespace FortPlayerPawn - { - extern inline int CorrectTags = 0; - } - namespace FortPlayerState - { - extern inline int PawnDeathLocation = 0; - } - namespace FortPlayerStateAthena - { - extern inline int DeathInfo = 0; - extern inline int KillScore = 0; - extern inline int TeamKillScore = 0; - } - namespace DeathReport - { - extern inline int Tags = 0, KillerPlayerState = 0, KillerPawn = 0, DamageCauser = 0; - } - namespace DeathInfo - { - extern inline int bDBNO = 0, Downer = 0, FinisherOrDowner = 0, DeathCause = 0, Distance = 0, DeathLocation = 0, bInitialized = 0, DeathTags = 0; - } -} - -static inline float GetMaxTickRateHook() { return 30.f; } - -#define VALIDATEOFFSET(offset) if (!offset) LOG_WARN(LogDev, "[{}] Invalid offset", __FUNCTIONNAME__); - -#define GET_PLAYLIST(GameState) static auto CurrentPlaylistDataOffset = GameState->GetOffset("CurrentPlaylistData", false); \ -auto CurrentPlaylist = CurrentPlaylistDataOffset == -1 && Fortnite_Version < 6 ? nullptr : GameState->GetCurrentPlaylist(); \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/vehicles.h b/dependencies/reboot/Project Reboot 3.0/vehicles.h deleted file mode 100644 index 8a426f8..0000000 --- a/dependencies/reboot/Project Reboot 3.0/vehicles.h +++ /dev/null @@ -1,262 +0,0 @@ -#pragma once - -#include "reboot.h" -#include "Stack.h" -#include "Actor.h" -#include "hooking.h" -#include "SoftObjectPtr.h" -#include "FortGameModeAthena.h" -#include "GameplayStatics.h" -#include "FortVehicleItemDefinition.h" -#include "FortDagwoodVehicle.h" - -// Vehicle class name changes multiple times across versions, so I made it it's own file. - -static inline void ServerVehicleUpdate(UObject* Context, FFrame& Stack, void* Ret) -{ - auto Params = Stack.Locals; - - auto Vehicle = Cast(Context); - static auto RootComponentOffset = Vehicle->GetOffset("RootComponent"); - auto Mesh = /* Cast */(Vehicle->Get(RootComponentOffset)); - - FTransform Transform{}; - - static std::string StateStructName = FindObject(L"/Script/FortniteGame.ReplicatedPhysicsPawnState") ? "/Script/FortniteGame.ReplicatedPhysicsPawnState" : "/Script/FortniteGame.ReplicatedAthenaVehiclePhysicsState"; - - if (StateStructName.empty()) - return; - - auto StateStruct = FindObject(StateStructName); - - if (!StateStruct) - return; - - auto State = (void*)(__int64(Params) + 0); - - static auto RotationOffset = FindOffsetStruct(StateStructName, "Rotation"); - static auto TranslationOffset = FindOffsetStruct(StateStructName, "Translation"); - - if (Engine_Version >= 420) // S4-S12 - { - float v50 = -2.0; - float v49 = 2.5; - - auto Rotation = (FQuat*)(__int64(State) + RotationOffset); - - Rotation->X -= v49; - Rotation->Y /= 0.3; - Rotation->Z -= v50; - Rotation->W /= -1.2; - - Transform.Rotation = *Rotation; - } - else - { - auto Rotation = (FQuat*)(__int64(State) + RotationOffset); - - Transform.Rotation = *Rotation; - } - - Transform.Translation = *(FVector*)(__int64(State) + TranslationOffset); - Transform.Scale3D = FVector{ 1, 1, 1 }; - - bool bTeleport = true; // this maybe be false?? - bool bSweep = false; - - static auto K2_SetWorldTransformFn = FindObject(L"/Script/Engine.SceneComponent.K2_SetWorldTransform"); - static auto SetPhysicsLinearVelocityFn = FindObject(L"/Script/Engine.PrimitiveComponent.SetPhysicsLinearVelocity"); - static auto SetPhysicsAngularVelocityFn = FindObject(L"/Script/Engine.PrimitiveComponent.SetPhysicsAngularVelocity"); - static auto LinearVelocityOffset = FindOffsetStruct(StateStructName, "LinearVelocity"); - static auto AngularVelocityOffset = FindOffsetStruct(StateStructName, "AngularVelocity"); - static auto K2_SetWorldTransformParamSize = K2_SetWorldTransformFn->GetPropertiesSize(); - - auto K2_SetWorldTransformParams = Alloc(K2_SetWorldTransformParamSize); - - { - static auto NewTransformOffset = FindOffsetStruct("/Script/Engine.SceneComponent.K2_SetWorldTransform", "NewTransform"); - static auto bSweepOffset = FindOffsetStruct("/Script/Engine.SceneComponent.K2_SetWorldTransform", "bSweep"); - static auto bTeleportOffset = FindOffsetStruct("/Script/Engine.SceneComponent.K2_SetWorldTransform", "bTeleport"); - - *(FTransform*)(__int64(K2_SetWorldTransformParams) + NewTransformOffset) = Transform; - *(bool*)(__int64(K2_SetWorldTransformParams) + bSweepOffset) = bSweep; - *(bool*)(__int64(K2_SetWorldTransformParams) + bTeleportOffset) = bTeleport; - } - - Mesh->ProcessEvent(K2_SetWorldTransformFn, K2_SetWorldTransformParams); - // Mesh->bComponentToWorldUpdated = true; - - VirtualFree(K2_SetWorldTransformParams, 0, MEM_RELEASE); - - struct { FVector NewVel; bool bAddToCurrent; FName BoneName; } - UPrimitiveComponent_SetPhysicsLinearVelocity_Params{ - *(FVector*)(__int64(State) + LinearVelocityOffset), - 0, - FName() - }; - - struct { FVector NewAngVel; bool bAddToCurrent; FName BoneName; } - UPrimitiveComponent_SetPhysicsAngularVelocity_Params{ - *(FVector*)(__int64(State) + AngularVelocityOffset), - 0, - FName() - }; - - Mesh->ProcessEvent(SetPhysicsLinearVelocityFn, &UPrimitiveComponent_SetPhysicsLinearVelocity_Params); - Mesh->ProcessEvent(SetPhysicsAngularVelocityFn, &UPrimitiveComponent_SetPhysicsAngularVelocity_Params); -} - -static inline void AddVehicleHook() -{ - static auto FortAthenaVehicleDefault = FindObject(L"/Script/FortniteGame.Default__FortAthenaVehicle"); - static auto FortPhysicsPawnDefault = FindObject(L"/Script/FortniteGame.Default__FortPhysicsPawn"); - - if (FortPhysicsPawnDefault) - { - Hooking::MinHook::Hook(FortPhysicsPawnDefault, FindObject(L"/Script/FortniteGame.FortPhysicsPawn.ServerMove") ? - FindObject(L"/Script/FortniteGame.FortPhysicsPawn.ServerMove") : FindObject(L"/Script/FortniteGame.FortPhysicsPawn.ServerUpdatePhysicsParams"), - ServerVehicleUpdate, nullptr, false, true); - } - else - { - Hooking::MinHook::Hook(FortAthenaVehicleDefault, FindObject(L"/Script/FortniteGame.FortAthenaVehicle.ServerUpdatePhysicsParams"), - ServerVehicleUpdate, nullptr, false, true); - } -} - -struct FVehicleWeightedDef -{ -public: - static UStruct* GetStruct() - { - static auto Struct = FindObject(L"/Script/FortniteGame.VehicleWeightedDef"); - return Struct; - } - - static int GetStructSize() { return GetStruct()->GetPropertiesSize(); } - - TSoftObjectPtr* GetVehicleItemDef() - { - static auto VehicleItemDefOffset = FindOffsetStruct("/Script/FortniteGame.VehicleWeightedDef", "VehicleItemDef"); - return (TSoftObjectPtr*)(__int64(this) + VehicleItemDefOffset); - } - - FScalableFloat* GetWeight() - { - static auto WeightOffset = FindOffsetStruct("/Script/FortniteGame.VehicleWeightedDef", "Weight"); - return (FScalableFloat*)(__int64(this) + WeightOffset); - } -}; - -static inline AActor* SpawnVehicleFromSpawner(AActor* VehicleSpawner) -{ - bool bDebugSpawnVehicles = false; - - auto GameMode = Cast(GetWorld()->GetGameMode()); - - FTransform SpawnTransform{}; - SpawnTransform.Translation = VehicleSpawner->GetActorLocation(); - SpawnTransform.Rotation = VehicleSpawner->GetActorRotation().Quaternion(); - SpawnTransform.Scale3D = { 1, 1, 1 }; - - static auto VehicleClassOffset = VehicleSpawner->GetOffset("VehicleClass", false); - static auto BGAClass = FindObject(L"/Script/Engine.BlueprintGeneratedClass"); - - if (VehicleClassOffset != -1) // 10.40 and below? - { - auto& SoftVehicleClass = VehicleSpawner->Get>(VehicleClassOffset); - auto StrongVehicleClass = SoftVehicleClass.Get(BGAClass, true); - - if (!StrongVehicleClass) - { - std::string VehicleClassObjectName = SoftVehicleClass.SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value == 0 ? "InvalidName" : SoftVehicleClass.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - LOG_WARN(LogVehicles, "Failed to load vehicle class: {}", VehicleClassObjectName); - return nullptr; - } - - if (bDebugSpawnVehicles) - LOG_INFO(LogDev, "Spawning Vehicle: {}", StrongVehicleClass->GetPathName()); - - return GetWorld()->SpawnActor(StrongVehicleClass, SpawnTransform, CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn)); - } - - static auto FortVehicleItemDefOffset = VehicleSpawner->GetOffset("FortVehicleItemDef"); - - if (FortVehicleItemDefOffset == -1) - return nullptr; - - auto& SoftFortVehicleItemDef = VehicleSpawner->Get>(FortVehicleItemDefOffset); - UFortVehicleItemDefinition* VIDToSpawn = nullptr; - - if (SoftFortVehicleItemDef.SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value == 0) - { - static auto FortVehicleItemDefVariantsOffset = VehicleSpawner->GetOffset("FortVehicleItemDefVariants"); - - if (FortVehicleItemDefVariantsOffset != -1) - { - TArray& FortVehicleItemDefVariants = VehicleSpawner->Get>(FortVehicleItemDefVariantsOffset); - - if (FortVehicleItemDefVariants.size() > 0) - { - VIDToSpawn = FortVehicleItemDefVariants.at(0, FVehicleWeightedDef::GetStructSize()).GetVehicleItemDef()->Get(UFortVehicleItemDefinition::StaticClass(), true); // TODO (Milxnor) Implement the weight - } - } - } - else - { - VIDToSpawn = SoftFortVehicleItemDef.Get(UFortVehicleItemDefinition::StaticClass(), true); - } - - if (!VIDToSpawn) - { - std::string FortVehicleItemDefObjectName = SoftFortVehicleItemDef.SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value == 0 ? "InvalidName" : SoftFortVehicleItemDef.SoftObjectPtr.ObjectID.AssetPathName.ToString(); - LOG_WARN(LogVehicles, "Failed to load vehicle item definition: {}", FortVehicleItemDefObjectName); - return nullptr; - } - - UClass* StrongVehicleActorClass = VIDToSpawn->GetVehicleActorClass(); - - if (!StrongVehicleActorClass) - { - std::string VehicleActorClassObjectName = VIDToSpawn->GetVehicleActorClassSoft()->SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value == 0 ? "InvalidName" : VIDToSpawn->GetVehicleActorClassSoft()->SoftObjectPtr.ObjectID.AssetPathName.ToString(); - LOG_WARN(LogVehicles, "Failed to load vehicle actor class: {}", VehicleActorClassObjectName); - return nullptr; - } - - if (bDebugSpawnVehicles) - LOG_INFO(LogDev, "Spawning Vehicle (VID): {}", StrongVehicleActorClass->GetPathName()); - - auto NewVehicle = GetWorld()->SpawnActor(StrongVehicleActorClass, SpawnTransform, CreateSpawnParameters(ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn)); - - if (auto FortDagwoodVehicle = Cast(NewVehicle)) // carrr - { - FortDagwoodVehicle->SetFuel(100); - } - - return NewVehicle; -} - -static inline void SpawnVehicles2() -{ - static auto FortAthenaVehicleSpawnerClass = FindObject(L"/Script/FortniteGame.FortAthenaVehicleSpawner"); - TArray AllVehicleSpawners = UGameplayStatics::GetAllActorsOfClass(GetWorld(), FortAthenaVehicleSpawnerClass); - - int AmountOfVehiclesSpawned = 0; - - for (int i = 0; i < AllVehicleSpawners.Num(); i++) - { - auto VehicleSpawner = AllVehicleSpawners.at(i); - auto Vehicle = SpawnVehicleFromSpawner(VehicleSpawner); - - if (Vehicle) - { - AmountOfVehiclesSpawned++; - } - } - - auto AllVehicleSpawnersNum = AllVehicleSpawners.Num(); - - AllVehicleSpawners.Free(); - - LOG_INFO(LogGame, "Spawned {}/{} vehicles.", AmountOfVehiclesSpawned, AllVehicleSpawnersNum); -} \ No newline at end of file diff --git a/dependencies/reboot/Project Reboot 3.0/vendingmachine.h b/dependencies/reboot/Project Reboot 3.0/vendingmachine.h deleted file mode 100644 index f6d0412..0000000 --- a/dependencies/reboot/Project Reboot 3.0/vendingmachine.h +++ /dev/null @@ -1,325 +0,0 @@ -#pragma once - -#include "reboot.h" -#include "BuildingGameplayActor.h" -#include "GameplayStatics.h" -#include "FortLootPackage.h" -#include "GameplayAbilityTypes.h" -#include "KismetMathLibrary.h" - -using ABuildingItemCollectorActor = ABuildingGameplayActor; - -struct FCollectorUnitInfo -{ - static std::string GetStructName() - { - static std::string StructName = FindObject(L"/Script/FortniteGame.CollectorUnitInfo") ? "/Script/FortniteGame.CollectorUnitInfo" : "/Script/FortniteGame.ColletorUnitInfo"; // nice one fortnite - return StructName; - } - - static UStruct* GetStruct() - { - static auto Struct = FindObject(GetStructName()); - return Struct; - } - - static int GetPropertiesSize() - { - return GetStruct()->GetPropertiesSize(); - } - - FScalableFloat* GetInputCount() - { - static auto InputCountOffset = FindOffsetStruct(GetStructName(), "InputCount"); - return (FScalableFloat*)(__int64(this) + InputCountOffset); - } - - TArray* GetOutputItemEntry() - { - static auto OutputItemEntryOffset = FindOffsetStruct(GetStructName(), "OutputItemEntry"); - return (TArray*)(__int64(this) + OutputItemEntryOffset); - } - - UFortWorldItemDefinition*& GetInputItem() - { - static auto InputItemOffset = FindOffsetStruct(GetStructName(), "InputItem"); - return *(UFortWorldItemDefinition**)(__int64(this) + InputItemOffset); - } - - UFortWorldItemDefinition*& GetOutputItem() - { - static auto OutputItemOffset = FindOffsetStruct(GetStructName(), "OutputItem"); - return *(UFortWorldItemDefinition**)(__int64(this) + OutputItemOffset); - } -}; - -static inline UCurveTable* GetGameData() -{ - auto GameState = Cast(GetWorld()->GetGameState()); - - UCurveTable* FortGameData = nullptr; - - auto CurrentPlaylist = GameState->GetCurrentPlaylist(); - - if (CurrentPlaylist) - { - static auto GameDataOffset = CurrentPlaylist->GetOffset("GameData"); - FortGameData = CurrentPlaylist ? CurrentPlaylist->GetPtr>(GameDataOffset)->Get() : nullptr; - } - - if (!FortGameData) - FortGameData = FindObject(L"/Game/Athena/Balance/DataTables/AthenaGameData.AthenaGameData"); // uhm so theres one without athena and on newer versions that has it so idk // after i wrote this cokmment idk what i meant - - return FortGameData; -} - -static inline void FillItemCollector(ABuildingItemCollectorActor* ItemCollector, FName& LootTierGroup, bool bUseInstanceLootValueOverrides, int LootTier, int recursive = 0) -{ - if (recursive >= 10) - return; - - auto GameModeAthena = (AFortGameModeAthena*)GetWorld()->GetGameMode(); - auto GameState = Cast(GameModeAthena->GetGameState()); - - static auto ItemCollectionsOffset = ItemCollector->GetOffset("ItemCollections"); - auto& ItemCollections = ItemCollector->Get>(ItemCollectionsOffset); - - UCurveTable* FortGameData = GetGameData(); - - auto WoodName = UKismetStringLibrary::Conv_StringToName(L"Default.VendingMachine.Cost.Wood"); - auto StoneName = UKismetStringLibrary::Conv_StringToName(L"Default.VendingMachine.Cost.Stone"); - auto MetalName = UKismetStringLibrary::Conv_StringToName(L"Default.VendingMachine.Cost.Metal"); - - static auto StoneItemData = FindObject(L"/Game/Items/ResourcePickups/StoneItemData.StoneItemData"); - static auto MetalItemData = FindObject(L"/Game/Items/ResourcePickups/MetalItemData.MetalItemData"); - - // TODO: Pull prices from datatables. - - bool bLowerPrices = Fortnite_Version >= 5.20; - - static int CommonPrice = bLowerPrices ? 75 : 100; - static int UncommonPrice = bLowerPrices ? 150 : 200; - static int RarePrice = bLowerPrices ? 225 : 300; - static int EpicPrice = bLowerPrices ? 300 : 400; - static int LegendaryPrice = bLowerPrices ? 375 : 500; - - if (Fortnite_Version >= 8.10) - { - CommonPrice = 0; - UncommonPrice = 0; - RarePrice = 0; - EpicPrice = 0; - LegendaryPrice = 0; - } - - int itemCollectorRecursive = 0; - - for (int ItemCollectorIt = 0; ItemCollectorIt < ItemCollections.Num(); ItemCollectorIt++) - { - if (itemCollectorRecursive > 3) - { - itemCollectorRecursive = 0; - continue; - } - - auto ItemCollection = ItemCollections.AtPtr(ItemCollectorIt, FCollectorUnitInfo::GetPropertiesSize()); - - if (ItemCollection->GetOutputItemEntry()->Num() > 0) - { - ItemCollection->GetOutputItemEntry()->Free(); - ItemCollection->GetOutputItem() = nullptr; - } - - constexpr bool bPrint = false; - - std::vector LootDrops = PickLootDrops(LootTierGroup, GameState->GetWorldLevel(), LootTier, bPrint); - - if (LootDrops.size() == 0) - { - // LOG_WARN(LogGame, "Failed to find LootDrops for vending machine loot tier: {}", LootTier); - ItemCollectorIt--; // retry (?) - itemCollectorRecursive++; - continue; - } - - for (int LootDropIt = 0; LootDropIt < LootDrops.size(); LootDropIt++) - { - UFortWorldItemDefinition* WorldItemDefinition = Cast(LootDrops[LootDropIt]->GetItemDefinition()); - - if (!WorldItemDefinition) - continue; - - if (!IsPrimaryQuickbar(WorldItemDefinition)) // i dont think we need this check - continue; - - bool bItemAlreadyInCollector = false; - - for (int ItemCollectorIt2 = 0; ItemCollectorIt2 < ItemCollections.Num(); ItemCollectorIt2++) - { - auto ItemCollection2 = ItemCollections.AtPtr(ItemCollectorIt2, FCollectorUnitInfo::GetPropertiesSize()); - - if (ItemCollection2->GetOutputItem() == WorldItemDefinition) - { - bItemAlreadyInCollector = true; - break; - } - } - - if (bItemAlreadyInCollector) - break; - - ItemCollection->GetOutputItem() = WorldItemDefinition; - - break; - } - - if (!ItemCollection->GetOutputItem()) - { - ItemCollectorIt--; // retry - itemCollectorRecursive++; - continue; - } - - for (int LootDropIt = 0; LootDropIt < LootDrops.size(); LootDropIt++) - { - auto ItemEntry = LootDrops[LootDropIt].ItemEntry; // FFortItemEntry::MakeItemEntry(LootDrops[LootDropIt]->GetItemDefinition(), LootDrops[LootDropIt]->GetCount(), LootDrops[LootDropIt]->GetLoadedAmmo(), MAX_DURABILITY, LootDrops[LootDropIt]->GetLevel()); - - if (!ItemEntry) - continue; - - ItemCollection->GetOutputItemEntry()->AddPtr(ItemEntry, FFortItemEntry::GetStructSize()); - } - - // The reason I set the curve to 0 is because it will force it to return value, probably not how we are supposed to do it but whatever. - - bool bShouldBeNullTable = true; // Fortnite_Version < 5 - - ItemCollection->GetInputCount()->GetCurve().CurveTable = bShouldBeNullTable ? nullptr : FortGameData; // scuffed idc - ItemCollection->GetInputCount()->GetCurve().RowName = bShouldBeNullTable ? FName(0) : WoodName; // Scuffed idc - ItemCollection->GetInputCount()->GetValue() = LootTier == 0 ? CommonPrice - : LootTier == 1 ? UncommonPrice - : LootTier == 2 ? RarePrice - : LootTier == 3 ? EpicPrice - : LootTier == 4 ? LegendaryPrice - : -1; - } - - static auto bUseInstanceLootValueOverridesOffset = ItemCollector->GetOffset("bUseInstanceLootValueOverrides", false); - - if (bUseInstanceLootValueOverridesOffset != -1) - ItemCollector->Get(bUseInstanceLootValueOverridesOffset) = bUseInstanceLootValueOverrides; - - // LOG_INFO(LogDev, "LootTier: {}", LootTier); - - static auto StartingGoalLevelOffset = ItemCollector->GetOffset("StartingGoalLevel"); - - if (StartingGoalLevelOffset != -1) - ItemCollector->Get(StartingGoalLevelOffset) = LootTier; - - static auto VendingMachineClass = FindObject(L"/Game/Athena/Items/Gameplay/VendingMachine/B_Athena_VendingMachine.B_Athena_VendingMachine_C"); - - if (ItemCollector->IsA(VendingMachineClass)) - { - static auto OverrideVendingMachineRarityOffset = ItemCollector->GetOffset("OverrideVendingMachineRarity", false); - - if (OverrideVendingMachineRarityOffset != -1) - ItemCollector->Get(OverrideVendingMachineRarityOffset) = LootTier; - - static auto OverrideGoalOffset = ItemCollector->GetOffset("OverrideGoal", false); - - if (OverrideGoalOffset != -1) - { - ItemCollector->Get(OverrideGoalOffset) = LootTier == 0 ? CommonPrice - : LootTier == 1 ? UncommonPrice - : LootTier == 2 ? RarePrice - : LootTier == 3 ? EpicPrice - : LootTier == 4 ? LegendaryPrice - : -1; - } - } -} - -static inline void FillVendingMachines() -{ - auto VendingMachineClass = FindObject("/Game/Athena/Items/Gameplay/VendingMachine/B_Athena_VendingMachine.B_Athena_VendingMachine_C"); - auto AllVendingMachines = UGameplayStatics::GetAllActorsOfClass(GetWorld(), VendingMachineClass); - - auto OverrideLootTierGroup = UKismetStringLibrary::Conv_StringToName(L"Loot_AthenaVending"); // ItemCollector->GetLootTierGroupOverride(); - - std::map ThingAndWeights; // Bro IDK WHat to name it! - - auto RarityWeightsName = UKismetStringLibrary::Conv_StringToName(L"Default.VendingMachine.RarityWeights"); - - auto FortGameData = GetGameData(); - - float WeightSum = 0; - - for (int i = 0; i < 6; i++) - { - auto Weight = UDataTableFunctionLibrary::EvaluateCurveTableRow(FortGameData, RarityWeightsName, i); - ThingAndWeights[i] = Weight; - WeightSum += Weight; - } - - for (int i = 0; i < ThingAndWeights.size(); i++) - { - // LOG_INFO(LogDev, "[{}] bruh: {}", i, ThingAndWeights.at(i)); - } - - std::map PickedRarities; - - for (int i = 0; i < AllVendingMachines.Num(); i++) - { - auto VendingMachine = (ABuildingItemCollectorActor*)AllVendingMachines.at(i); - - if (!VendingMachine) - continue; - - auto randomFloatGenerator = [&](float Max) -> float { return UKismetMathLibrary::RandomFloatInRange(0, Max); }; - - int Out; - PickWeightedElement(ThingAndWeights, [&](float Weight) -> float { return Weight; }, randomFloatGenerator, WeightSum, false, 1, &Out, false, true); - - PickedRarities[Out]++; - - if (Out == 0) - { - VendingMachine->K2_DestroyActor(); - continue; - } - - /* - - LOOT LEVELS: - - 0 - Common - 1 - Uncommon - 2 - Rare - 3 - Epic - 4 - Legendary - - */ - - FillItemCollector(VendingMachine, OverrideLootTierGroup, true, Out - 1); - } - - auto AllVendingMachinesNum = AllVendingMachines.Num(); - - AllVendingMachines.Free(); - - bool bPrintDebug = true; - - if (bPrintDebug) - { - LOG_INFO(LogGame, "Destroyed {}/{} vending machines.", PickedRarities[0], AllVendingMachinesNum); - LOG_INFO(LogGame, "Filled {}/{} vending machines with common items.", PickedRarities[1], AllVendingMachinesNum); - LOG_INFO(LogGame, "Filled {}/{} vending machines with uncommon items.", PickedRarities[2], AllVendingMachinesNum); - LOG_INFO(LogGame, "Filled {}/{} vending machines with rare items.", PickedRarities[3], AllVendingMachinesNum); - LOG_INFO(LogGame, "Filled {}/{} vending machines with epic items.", PickedRarities[4], AllVendingMachinesNum); - LOG_INFO(LogGame, "Filled {}/{} vending machines with legendary items.", PickedRarities[5], AllVendingMachinesNum); - } - else - { - LOG_INFO(LogGame, "Filled {} vending machines!", AllVendingMachinesNum); - } -} \ No newline at end of file diff --git a/dependencies/reboot/README.md b/dependencies/reboot/README.md deleted file mode 100644 index 25ac631..0000000 --- a/dependencies/reboot/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Project Reboot 3.0 - -S3-S15 - -## TODO - -- Rewrite picking up code. -- Rewrite dllmain -- Move hooking to each class (for example, AFortGameModeAthena::InitHooks). diff --git a/dependencies/reboot/vendor/Fonts/ruda-bold.h b/dependencies/reboot/vendor/Fonts/ruda-bold.h deleted file mode 100644 index bc220d2..0000000 --- a/dependencies/reboot/vendor/Fonts/ruda-bold.h +++ /dev/null @@ -1,2076 +0,0 @@ -/* C:\Users\Stowe\Downloads\ruda.bold.ttf (4/13/2023 9:01:48 PM) - StartOffset(h): 00000000, EndOffset(h): 0000610F, Length(h): 00006110 */ - -static inline unsigned char ruda_bold_data[24848] = { - 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x04, 0x00, 0x10, - 0x44, 0x53, 0x49, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x61, 0x08, - 0x00, 0x00, 0x00, 0x08, 0x46, 0x46, 0x54, 0x4D, 0x5F, 0xE3, 0x7D, 0x17, - 0x00, 0x00, 0x5B, 0x24, 0x00, 0x00, 0x00, 0x1C, 0x47, 0x44, 0x45, 0x46, - 0x01, 0x21, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x40, 0x00, 0x00, 0x00, 0x20, - 0x47, 0x50, 0x4F, 0x53, 0x80, 0x7F, 0x75, 0x81, 0x00, 0x00, 0x5B, 0x60, - 0x00, 0x00, 0x05, 0x76, 0x47, 0x53, 0x55, 0x42, 0xB8, 0xFF, 0xB8, 0xFE, - 0x00, 0x00, 0x60, 0xD8, 0x00, 0x00, 0x00, 0x30, 0x4F, 0x53, 0x2F, 0x32, - 0x87, 0x89, 0x9D, 0x90, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, 0x00, 0x60, - 0x63, 0x6D, 0x61, 0x70, 0x82, 0xA0, 0xED, 0x91, 0x00, 0x00, 0x05, 0xC8, - 0x00, 0x00, 0x01, 0xDA, 0x67, 0x61, 0x73, 0x70, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x5B, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x67, 0x6C, 0x79, 0x66, - 0xF4, 0xF0, 0xD2, 0xA8, 0x00, 0x00, 0x09, 0x98, 0x00, 0x00, 0x45, 0xEC, - 0x68, 0x65, 0x61, 0x64, 0xF8, 0xDC, 0x57, 0x80, 0x00, 0x00, 0x01, 0x1C, - 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, 0x06, 0xFF, 0x03, 0x6C, - 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6D, 0x74, 0x78, - 0xF4, 0xFC, 0x32, 0x65, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x03, 0xD0, - 0x6C, 0x6F, 0x63, 0x61, 0x3A, 0xDE, 0x29, 0x58, 0x00, 0x00, 0x07, 0xAC, - 0x00, 0x00, 0x01, 0xEA, 0x6D, 0x61, 0x78, 0x70, 0x01, 0x3B, 0x00, 0x3E, - 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x00, 0x20, 0x6E, 0x61, 0x6D, 0x65, - 0xAA, 0x3C, 0x0E, 0xAA, 0x00, 0x00, 0x4F, 0x84, 0x00, 0x00, 0x08, 0x61, - 0x70, 0x6F, 0x73, 0x74, 0x44, 0xC2, 0x55, 0x49, 0x00, 0x00, 0x57, 0xE8, - 0x00, 0x00, 0x03, 0x32, 0x70, 0x72, 0x65, 0x70, 0x68, 0x06, 0x8C, 0x85, - 0x00, 0x00, 0x07, 0xA4, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x83, 0x2A, 0x0E, 0x8E, 0x8C, 0x5F, 0x0F, 0x3C, 0xF5, - 0x00, 0x0B, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x00, 0xCB, 0x2D, 0x09, 0xCB, - 0x00, 0x00, 0x00, 0x00, 0xCB, 0x2D, 0x09, 0xCB, 0xFF, 0xD9, 0xFE, 0xFB, - 0x03, 0x89, 0x03, 0x87, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x9A, 0xFE, 0xD9, - 0x00, 0x00, 0x03, 0xC7, 0xFF, 0xD9, 0xFF, 0xD7, 0x03, 0x89, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xF4, 0x00, 0x01, 0x00, 0x00, 0x00, 0xF4, 0x00, 0x3B, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x01, 0xDE, 0x02, 0xBC, 0x00, 0x05, 0x00, 0x00, 0x02, 0xBC, - 0x02, 0x8A, 0x00, 0x00, 0x00, 0x8C, 0x02, 0xBC, 0x02, 0x8A, 0x00, 0x00, - 0x01, 0xDD, 0x00, 0x32, 0x00, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x79, - 0x72, 0x73, 0x00, 0x20, 0x00, 0x20, 0x20, 0xAC, 0x03, 0x9A, 0xFE, 0xD9, - 0x00, 0x00, 0x03, 0x9A, 0x01, 0x27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x49, 0x02, 0xBB, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, - 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4D, 0x00, 0x00, - 0x00, 0xEB, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x4A, 0x01, 0x77, 0x00, 0x30, - 0x02, 0x3B, 0x00, 0x11, 0x02, 0x13, 0x00, 0x1C, 0x03, 0x2C, 0x00, 0x2D, - 0x02, 0xA7, 0x00, 0x17, 0x00, 0xD0, 0x00, 0x35, 0x01, 0x50, 0x00, 0x3D, - 0x01, 0x50, 0x00, 0x17, 0x01, 0xA4, 0x00, 0x1C, 0x02, 0x76, 0x00, 0x2C, - 0x01, 0x20, 0x00, 0x38, 0x01, 0x3F, 0x00, 0x26, 0x01, 0x15, 0x00, 0x44, - 0x01, 0xCE, 0xFF, 0xFC, 0x02, 0x54, 0x00, 0x34, 0x02, 0x15, 0x00, 0x23, - 0x02, 0x35, 0x00, 0x2B, 0x02, 0x0F, 0x00, 0x08, 0x02, 0x30, 0x00, 0x15, - 0x02, 0x15, 0x00, 0x14, 0x02, 0x3F, 0x00, 0x34, 0x02, 0x02, 0x00, 0x1B, - 0x02, 0x33, 0x00, 0x27, 0x02, 0x3D, 0x00, 0x34, 0x01, 0x4B, 0x00, 0x64, - 0x01, 0x4B, 0x00, 0x4F, 0x02, 0x8E, 0x00, 0x43, 0x02, 0x7D, 0x00, 0x2C, - 0x02, 0x90, 0x00, 0x39, 0x01, 0xE1, 0x00, 0x17, 0x03, 0x3F, 0x00, 0x3A, - 0x02, 0x1E, 0xFF, 0xFD, 0x02, 0x7D, 0x00, 0x61, 0x02, 0x5C, 0x00, 0x40, - 0x02, 0x8F, 0x00, 0x61, 0x02, 0x17, 0x00, 0x61, 0x02, 0x09, 0x00, 0x61, - 0x02, 0x7C, 0x00, 0x40, 0x02, 0xB0, 0x00, 0x61, 0x01, 0x39, 0x00, 0x61, - 0x01, 0x56, 0xFF, 0xF3, 0x02, 0x6D, 0x00, 0x61, 0x01, 0xD3, 0x00, 0x61, - 0x03, 0x35, 0x00, 0x5D, 0x02, 0xBB, 0x00, 0x61, 0x02, 0xA8, 0x00, 0x40, - 0x02, 0x5C, 0x00, 0x61, 0x02, 0xB7, 0x00, 0x40, 0x02, 0x9B, 0x00, 0x61, - 0x02, 0x1E, 0x00, 0x25, 0x01, 0xF2, 0xFF, 0xFC, 0x02, 0xAC, 0x00, 0x61, - 0x02, 0x39, 0x00, 0x10, 0x03, 0x11, 0x00, 0x1C, 0x02, 0x43, 0x00, 0x05, - 0x02, 0x23, 0x00, 0x03, 0x02, 0x2D, 0x00, 0x1D, 0x01, 0x4A, 0x00, 0x62, - 0x01, 0xD0, 0x00, 0x0F, 0x01, 0x4A, 0x00, 0x21, 0x02, 0x08, 0x00, 0x32, - 0x02, 0x2C, 0x00, 0x0D, 0x02, 0x6F, 0x00, 0xA2, 0x02, 0x4C, 0x00, 0x2E, - 0x02, 0x57, 0x00, 0x52, 0x02, 0x16, 0x00, 0x3E, 0x02, 0x5C, 0x00, 0x3E, - 0x02, 0x4D, 0x00, 0x3E, 0x01, 0x69, 0x00, 0x2A, 0x02, 0x21, 0x00, 0x27, - 0x02, 0x5F, 0x00, 0x4D, 0x01, 0x36, 0x00, 0x58, 0x01, 0x48, 0xFF, 0xE7, - 0x02, 0x3B, 0x00, 0x52, 0x01, 0x18, 0x00, 0x52, 0x03, 0xAD, 0x00, 0x5D, - 0x02, 0x6C, 0x00, 0x5D, 0x02, 0x56, 0x00, 0x3E, 0x02, 0x5D, 0x00, 0x52, - 0x02, 0x58, 0x00, 0x3E, 0x01, 0xA0, 0x00, 0x5D, 0x02, 0x00, 0x00, 0x2F, - 0x01, 0x80, 0x00, 0x25, 0x02, 0x6B, 0x00, 0x50, 0x01, 0xEF, 0x00, 0x06, - 0x02, 0xEF, 0x00, 0x0D, 0x02, 0x10, 0x00, 0x09, 0x01, 0xF3, 0xFF, 0xFB, - 0x01, 0xE8, 0x00, 0x1A, 0x01, 0xBB, 0x00, 0x30, 0x01, 0x1C, 0x00, 0x5F, - 0x01, 0xBB, 0x00, 0x1A, 0x02, 0x18, 0x00, 0x13, 0x01, 0x1B, 0x00, 0x4A, - 0x02, 0x16, 0x00, 0x3E, 0x02, 0x45, 0x00, 0x40, 0x02, 0x90, 0x00, 0x43, - 0x02, 0x3C, 0x00, 0x11, 0x01, 0x1C, 0x00, 0x5F, 0x02, 0x2A, 0x00, 0x32, - 0x02, 0x4C, 0x00, 0x7F, 0x03, 0x47, 0x00, 0x40, 0x01, 0xB3, 0x00, 0x2A, - 0x02, 0x09, 0x00, 0x20, 0x02, 0x56, 0x00, 0x14, 0x01, 0x5C, 0x00, 0x36, - 0x03, 0x47, 0x00, 0x40, 0x02, 0x4A, 0x00, 0x89, 0x01, 0x62, 0x00, 0x12, - 0x02, 0x44, 0x00, 0x2C, 0x01, 0x8A, 0x00, 0x30, 0x01, 0x75, 0x00, 0x28, - 0x02, 0x6F, 0x00, 0xA7, 0x02, 0x6C, 0x00, 0x50, 0x02, 0xB9, 0x00, 0x29, - 0x01, 0x48, 0x00, 0x58, 0x01, 0xF8, 0x00, 0xBF, 0x01, 0x88, 0x00, 0x24, - 0x01, 0x73, 0x00, 0x10, 0x02, 0x09, 0x00, 0x1F, 0x03, 0xB9, 0x00, 0x24, - 0x03, 0xC7, 0x00, 0x24, 0x03, 0x89, 0x00, 0x27, 0x01, 0xE1, 0x00, 0x16, - 0x02, 0x1E, 0xFF, 0xFD, 0x02, 0x1E, 0xFF, 0xFD, 0x02, 0x1E, 0xFF, 0xFD, - 0x02, 0x1E, 0xFF, 0xFD, 0x02, 0x1E, 0xFF, 0xFD, 0x02, 0x1E, 0xFF, 0xFD, - 0x03, 0x28, 0xFF, 0xF9, 0x02, 0x5C, 0x00, 0x40, 0x02, 0x17, 0x00, 0x61, - 0x02, 0x17, 0x00, 0x61, 0x02, 0x17, 0x00, 0x61, 0x02, 0x17, 0x00, 0x61, - 0x01, 0x39, 0xFF, 0xFD, 0x01, 0x39, 0x00, 0x2D, 0x01, 0x39, 0xFF, 0xFC, - 0x01, 0x39, 0x00, 0x03, 0x02, 0x9B, 0x00, 0x2C, 0x02, 0xBB, 0x00, 0x61, - 0x02, 0xA9, 0x00, 0x40, 0x02, 0xA9, 0x00, 0x40, 0x02, 0xA9, 0x00, 0x40, - 0x02, 0xA9, 0x00, 0x40, 0x02, 0xA9, 0x00, 0x40, 0x02, 0x4B, 0x00, 0x2F, - 0x02, 0xA9, 0x00, 0x40, 0x02, 0xAC, 0x00, 0x61, 0x02, 0xAC, 0x00, 0x61, - 0x02, 0xAC, 0x00, 0x61, 0x02, 0xAC, 0x00, 0x61, 0x02, 0x23, 0x00, 0x03, - 0x02, 0x68, 0x00, 0x5F, 0x02, 0x85, 0x00, 0x61, 0x02, 0x4C, 0x00, 0x2E, - 0x02, 0x4C, 0x00, 0x2E, 0x02, 0x4C, 0x00, 0x2E, 0x02, 0x4C, 0x00, 0x2E, - 0x02, 0x4C, 0x00, 0x2E, 0x02, 0x4C, 0x00, 0x2E, 0x03, 0x97, 0x00, 0x39, - 0x02, 0x16, 0x00, 0x3E, 0x02, 0x4D, 0x00, 0x3E, 0x02, 0x4D, 0x00, 0x3E, - 0x02, 0x4D, 0x00, 0x3E, 0x02, 0x4D, 0x00, 0x3E, 0x01, 0x36, 0xFF, 0xF7, - 0x01, 0x36, 0x00, 0x16, 0x01, 0x36, 0xFF, 0xF3, 0x01, 0x36, 0x00, 0x01, - 0x02, 0x5B, 0x00, 0x41, 0x02, 0x6C, 0x00, 0x5D, 0x02, 0x56, 0x00, 0x3E, - 0x02, 0x56, 0x00, 0x3E, 0x02, 0x56, 0x00, 0x3E, 0x02, 0x56, 0x00, 0x3E, - 0x02, 0x56, 0x00, 0x3E, 0x02, 0x7C, 0x00, 0x2C, 0x02, 0x57, 0x00, 0x3F, - 0x02, 0x6B, 0x00, 0x50, 0x02, 0x6B, 0x00, 0x50, 0x02, 0x6B, 0x00, 0x50, - 0x02, 0x6B, 0x00, 0x50, 0x01, 0xF3, 0xFF, 0xFB, 0x02, 0x65, 0x00, 0x60, - 0x01, 0xF3, 0xFF, 0xFB, 0x02, 0x6B, 0x00, 0x08, 0x01, 0x39, 0xFF, 0xF9, - 0x01, 0x36, 0xFF, 0xEB, 0x01, 0x36, 0x00, 0x61, 0x02, 0x7C, 0x00, 0x61, - 0x02, 0x63, 0x00, 0x58, 0x01, 0x4B, 0xFF, 0xF3, 0x01, 0x47, 0xFF, 0xE7, - 0x02, 0x3B, 0x00, 0x52, 0x02, 0x3B, 0x00, 0x5D, 0x01, 0xD3, 0x00, 0x61, - 0x01, 0xA3, 0x00, 0x52, 0x01, 0xD0, 0x00, 0x1F, 0x01, 0x46, 0x00, 0x15, - 0x02, 0xBB, 0x00, 0x61, 0x02, 0x6C, 0x00, 0x5D, 0x03, 0xAD, 0x00, 0x40, - 0x03, 0xB1, 0x00, 0x3E, 0x02, 0x9B, 0x00, 0x61, 0x02, 0x9B, 0x00, 0x61, - 0x01, 0xA0, 0x00, 0x3C, 0x02, 0x9B, 0x00, 0x61, 0x01, 0xA0, 0x00, 0x3E, - 0x01, 0x47, 0xFF, 0xE7, 0x02, 0x22, 0x00, 0x61, 0x01, 0x09, 0xFF, 0xD9, - 0x00, 0xE8, 0x00, 0x16, 0x02, 0x24, 0x00, 0x57, 0x01, 0x3E, 0x00, 0x63, - 0x02, 0x4D, 0x00, 0x2A, 0x03, 0x38, 0x00, 0x3E, 0x00, 0xEB, 0x00, 0x37, - 0x00, 0xEB, 0x00, 0x37, 0x01, 0x02, 0x00, 0x38, 0x01, 0x9B, 0x00, 0x34, - 0x01, 0x9B, 0x00, 0x34, 0x01, 0xC1, 0x00, 0x36, 0x01, 0x88, 0x00, 0x3E, - 0x01, 0x2C, 0x00, 0x20, 0x01, 0x2C, 0x00, 0x1F, 0x02, 0x62, 0x00, 0x26, - 0x01, 0x14, 0x00, 0x00, 0x01, 0x03, 0x00, 0x31, 0x01, 0xD0, 0x00, 0x3E, - 0x01, 0x77, 0x00, 0x81, 0x01, 0xDD, 0x00, 0x72, 0x01, 0xE6, 0x00, 0x97, - 0x01, 0x48, 0xFF, 0xF8, 0x01, 0x1B, 0x00, 0x30, 0x01, 0x63, 0x00, 0x05, - 0x01, 0xFB, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x1C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, - 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x04, 0x00, 0xB8, - 0x00, 0x00, 0x00, 0x2A, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x7E, - 0x00, 0xFF, 0x01, 0x29, 0x01, 0x35, 0x01, 0x38, 0x01, 0x44, 0x01, 0x54, - 0x01, 0x59, 0x02, 0x37, 0x02, 0xC7, 0x02, 0xDA, 0x02, 0xDC, 0x03, 0x07, - 0x03, 0xBC, 0x20, 0x14, 0x20, 0x1A, 0x20, 0x1E, 0x20, 0x22, 0x20, 0x3A, - 0x20, 0xAC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA1, 0x01, 0x27, - 0x01, 0x31, 0x01, 0x37, 0x01, 0x3F, 0x01, 0x52, 0x01, 0x56, 0x02, 0x37, - 0x02, 0xC6, 0x02, 0xDA, 0x02, 0xDC, 0x03, 0x07, 0x03, 0xBC, 0x20, 0x13, - 0x20, 0x18, 0x20, 0x1C, 0x20, 0x22, 0x20, 0x39, 0x20, 0xAC, 0xFF, 0xFF, - 0xFF, 0xE3, 0xFF, 0xC1, 0xFF, 0x9A, 0xFF, 0x93, 0xFF, 0x92, 0xFF, 0x8C, - 0xFF, 0x7F, 0xFF, 0x7E, 0xFE, 0xA1, 0xFE, 0x13, 0xFE, 0x01, 0xFE, 0x00, - 0xFD, 0xD6, 0xFC, 0xBA, 0xE0, 0xCB, 0xE0, 0xC8, 0xE0, 0xC7, 0xE0, 0xC4, - 0xE0, 0xAE, 0xE0, 0x3D, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, - 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, - 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, - 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, - 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, - 0x61, 0x00, 0x85, 0x86, 0x88, 0x8A, 0x92, 0x97, 0x9D, 0xA2, 0xA1, 0xA3, - 0xA5, 0xA4, 0xA6, 0xA8, 0xAA, 0xA9, 0xAB, 0xAC, 0xAE, 0xAD, 0xAF, 0xB0, - 0xB2, 0xB4, 0xB3, 0xB5, 0xB7, 0xB6, 0xBB, 0xBA, 0xBC, 0xBD, 0x00, 0x71, - 0x63, 0x64, 0x68, 0xE6, 0x77, 0xA0, 0x6F, 0x6A, 0x00, 0x75, 0x69, 0x00, - 0x87, 0x99, 0x00, 0x72, 0x00, 0x00, 0x66, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6B, 0x7B, 0x00, 0xA7, 0xB9, 0x80, 0x62, 0x6D, 0x00, 0x00, 0x00, - 0x00, 0x6C, 0x7C, 0x00, 0x00, 0x81, 0x84, 0x96, 0xD1, 0xD2, 0xDE, 0xDF, - 0xE3, 0xE4, 0xE0, 0xE1, 0xB8, 0x00, 0xC0, 0x00, 0x00, 0xE9, 0xE7, 0xE8, - 0x00, 0x00, 0x00, 0x78, 0xE2, 0xE5, 0x00, 0x83, 0x8B, 0x82, 0x8C, 0x89, - 0x8E, 0x8F, 0x90, 0x8D, 0x94, 0x95, 0x00, 0x93, 0x9B, 0x9C, 0x9A, 0xC4, - 0xD9, 0xDC, 0x70, 0x00, 0x00, 0xDB, 0x79, 0x00, 0x00, 0xDA, 0x00, 0x00, - 0xB8, 0x01, 0xFF, 0x85, 0xB0, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x2C, 0x00, 0x5C, - 0x00, 0xA0, 0x00, 0xD6, 0x01, 0x1E, 0x01, 0x2E, 0x01, 0x46, 0x01, 0x5A, - 0x01, 0x86, 0x01, 0x9A, 0x01, 0xAC, 0x01, 0xB8, 0x01, 0xC4, 0x01, 0xD6, - 0x02, 0x06, 0x02, 0x1E, 0x02, 0x46, 0x02, 0x7A, 0x02, 0x98, 0x02, 0xC4, - 0x02, 0xFA, 0x03, 0x10, 0x03, 0x48, 0x03, 0x7C, 0x03, 0x8E, 0x03, 0xA6, - 0x03, 0xBA, 0x03, 0xCE, 0x03, 0xE2, 0x04, 0x16, 0x04, 0x66, 0x04, 0x80, - 0x04, 0xBC, 0x04, 0xE6, 0x05, 0x10, 0x05, 0x28, 0x05, 0x3E, 0x05, 0x6E, - 0x05, 0x88, 0x05, 0x9A, 0x05, 0xB2, 0x05, 0xD0, 0x05, 0xE0, 0x06, 0x00, - 0x06, 0x18, 0x06, 0x50, 0x06, 0x76, 0x06, 0xB0, 0x06, 0xDC, 0x07, 0x1E, - 0x07, 0x32, 0x07, 0x56, 0x07, 0x6A, 0x07, 0x8A, 0x07, 0xA8, 0x07, 0xC0, - 0x07, 0xDA, 0x07, 0xEC, 0x07, 0xFE, 0x08, 0x10, 0x08, 0x26, 0x08, 0x32, - 0x08, 0x40, 0x08, 0x78, 0x08, 0xA2, 0x08, 0xCC, 0x08, 0xFE, 0x09, 0x34, - 0x09, 0x54, 0x09, 0x98, 0x09, 0xB6, 0x09, 0xC8, 0x09, 0xE6, 0x0A, 0x04, - 0x0A, 0x10, 0x0A, 0x44, 0x0A, 0x62, 0x0A, 0x84, 0x0A, 0xB6, 0x0A, 0xE2, - 0x0B, 0x00, 0x0B, 0x3A, 0x0B, 0x5C, 0x0B, 0x82, 0x0B, 0x96, 0x0B, 0xB6, - 0x0B, 0xD2, 0x0B, 0xEA, 0x0C, 0x04, 0x0C, 0x38, 0x0C, 0x46, 0x0C, 0x7A, - 0x0C, 0x96, 0x0C, 0xAA, 0x0C, 0xD4, 0x0C, 0xF8, 0x0D, 0x2E, 0x0D, 0x52, - 0x0D, 0x66, 0x0D, 0xBA, 0x0D, 0xCC, 0x0E, 0x0E, 0x0E, 0x42, 0x0E, 0x60, - 0x0E, 0x6E, 0x0E, 0x7A, 0x0E, 0xBE, 0x0E, 0xCC, 0x0E, 0xE4, 0x0F, 0x00, - 0x0F, 0x24, 0x0F, 0x58, 0x0F, 0x66, 0x0F, 0x8A, 0x0F, 0xA4, 0x0F, 0xB8, - 0x0F, 0xD0, 0x0F, 0xE8, 0x10, 0x06, 0x10, 0x24, 0x10, 0x5E, 0x10, 0x9E, - 0x10, 0xF6, 0x11, 0x2C, 0x11, 0x4E, 0x11, 0x70, 0x11, 0x98, 0x11, 0xC8, - 0x11, 0xEC, 0x12, 0x1C, 0x12, 0x42, 0x12, 0x7A, 0x12, 0x9A, 0x12, 0xBA, - 0x12, 0xDE, 0x13, 0x02, 0x13, 0x1C, 0x13, 0x36, 0x13, 0x54, 0x13, 0x72, - 0x13, 0xA4, 0x13, 0xD4, 0x14, 0x14, 0x14, 0x54, 0x14, 0x9A, 0x14, 0xEA, - 0x15, 0x2E, 0x15, 0x48, 0x15, 0x88, 0x15, 0xB4, 0x15, 0xE0, 0x16, 0x10, - 0x16, 0x3E, 0x16, 0x5E, 0x16, 0x88, 0x16, 0xBC, 0x16, 0xFC, 0x17, 0x3C, - 0x17, 0x80, 0x17, 0xCE, 0x18, 0x12, 0x18, 0x60, 0x18, 0xB8, 0x18, 0xF0, - 0x19, 0x2E, 0x19, 0x6C, 0x19, 0xAE, 0x19, 0xEE, 0x1A, 0x04, 0x1A, 0x1A, - 0x1A, 0x34, 0x1A, 0x4C, 0x1A, 0x86, 0x1A, 0xBA, 0x1A, 0xE4, 0x1B, 0x0E, - 0x1B, 0x3C, 0x1B, 0x74, 0x1B, 0xA0, 0x1B, 0xB8, 0x1B, 0xF0, 0x1C, 0x1E, - 0x1C, 0x4C, 0x1C, 0x7E, 0x1C, 0xB0, 0x1C, 0xD0, 0x1D, 0x00, 0x1D, 0x22, - 0x1D, 0x48, 0x1D, 0x70, 0x1D, 0x94, 0x1D, 0xA0, 0x1D, 0xC4, 0x1D, 0xEA, - 0x1E, 0x0E, 0x1E, 0x32, 0x1E, 0x5E, 0x1E, 0x7A, 0x1E, 0x90, 0x1E, 0xA2, - 0x1E, 0xBC, 0x1E, 0xD4, 0x1E, 0xF4, 0x1F, 0x1A, 0x1F, 0x5C, 0x1F, 0xA2, - 0x1F, 0xD4, 0x20, 0x0C, 0x20, 0x34, 0x20, 0x6C, 0x20, 0x96, 0x20, 0xAE, - 0x20, 0xC2, 0x20, 0xD6, 0x20, 0xF4, 0x21, 0x10, 0x21, 0x1C, 0x21, 0x2A, - 0x21, 0x38, 0x21, 0x4C, 0x21, 0x60, 0x21, 0x74, 0x21, 0x96, 0x21, 0xB8, - 0x21, 0xD8, 0x21, 0xEC, 0x21, 0xFE, 0x22, 0x10, 0x22, 0x44, 0x22, 0x44, - 0x22, 0x58, 0x22, 0x6A, 0x22, 0x76, 0x22, 0x84, 0x22, 0x92, 0x22, 0xA6, - 0x22, 0xC4, 0x22, 0xD8, 0x22, 0xF6, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4A, - 0x00, 0x00, 0x00, 0xD4, 0x02, 0xBB, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, - 0x37, 0x03, 0x33, 0x03, 0x07, 0x35, 0x33, 0x15, 0x5E, 0x0F, 0x7F, 0x10, - 0x74, 0x8A, 0xC4, 0x01, 0xF7, 0xFE, 0x09, 0xC4, 0x6D, 0x6D, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x30, 0x01, 0xD0, 0x01, 0x47, 0x02, 0xD1, 0x00, 0x04, - 0x00, 0x0A, 0x00, 0x00, 0x13, 0x15, 0x07, 0x23, 0x03, 0x21, 0x15, 0x07, - 0x23, 0x2F, 0x01, 0x96, 0x11, 0x45, 0x10, 0x01, 0x17, 0x12, 0x45, 0x0F, - 0x01, 0x02, 0xD1, 0x21, 0xE0, 0x01, 0x01, 0x21, 0xE0, 0xCF, 0x32, 0x00, - 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x02, 0x1E, 0x02, 0xB7, 0x00, 0x1B, - 0x00, 0x1F, 0x00, 0x00, 0x37, 0x35, 0x33, 0x37, 0x23, 0x35, 0x33, 0x37, - 0x33, 0x07, 0x33, 0x37, 0x33, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, - 0x23, 0x07, 0x23, 0x37, 0x23, 0x07, 0x23, 0x3F, 0x01, 0x33, 0x37, 0x23, - 0x11, 0x60, 0x14, 0x51, 0x61, 0x1D, 0x62, 0x1D, 0x73, 0x1D, 0x63, 0x1D, - 0x51, 0x61, 0x14, 0x52, 0x62, 0x1C, 0x62, 0x1C, 0x73, 0x1C, 0x63, 0x1C, - 0x73, 0x73, 0x14, 0x73, 0xB7, 0x63, 0x82, 0x63, 0xB8, 0xB8, 0xB8, 0xB8, - 0x63, 0x82, 0x63, 0xB7, 0xB7, 0xB7, 0xB7, 0x63, 0x82, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1C, 0xFF, 0x8B, 0x01, 0xE2, 0x03, 0x22, 0x00, 0x2C, - 0x00, 0x00, 0x25, 0x32, 0x35, 0x34, 0x2E, 0x02, 0x27, 0x26, 0x34, 0x36, - 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x07, 0x26, 0x22, 0x06, 0x14, 0x17, - 0x16, 0x17, 0x1E, 0x02, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x23, - 0x35, 0x2E, 0x01, 0x27, 0x3E, 0x02, 0x37, 0x16, 0x01, 0x12, 0x58, 0x41, - 0x86, 0x24, 0x1C, 0x34, 0x56, 0x51, 0x61, 0x46, 0x4A, 0x13, 0x6D, 0x76, - 0x29, 0x18, 0x20, 0x63, 0x1C, 0x45, 0x17, 0x0D, 0x1A, 0x5E, 0x4F, 0x60, - 0x2D, 0x5C, 0x30, 0x09, 0x0C, 0x08, 0x05, 0x73, 0x5C, 0x60, 0x29, 0x36, - 0x3E, 0x14, 0x17, 0x2B, 0x9F, 0x66, 0x0F, 0x5F, 0x5C, 0x07, 0x14, 0x62, - 0x15, 0x22, 0x54, 0x16, 0x1B, 0x2C, 0x0C, 0x29, 0x1A, 0x13, 0x24, 0x3A, - 0x53, 0x71, 0x0F, 0x6D, 0x6A, 0x05, 0x1D, 0x19, 0x1B, 0x21, 0x17, 0x0D, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2D, 0xFF, 0xF3, 0x02, 0xFF, - 0x02, 0xDD, 0x00, 0x05, 0x00, 0x0D, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1D, - 0x00, 0x00, 0x17, 0x1B, 0x01, 0x33, 0x0B, 0x01, 0x02, 0x22, 0x26, 0x34, - 0x36, 0x32, 0x16, 0x14, 0x00, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x14, - 0x00, 0x32, 0x34, 0x22, 0x00, 0x32, 0x34, 0x22, 0xAA, 0xCC, 0x9D, 0x66, - 0xBE, 0xAA, 0x03, 0x84, 0x5D, 0x5C, 0x86, 0x5C, 0x01, 0x38, 0x86, 0x5C, - 0x5C, 0x86, 0x5C, 0xFD, 0x8A, 0x87, 0x87, 0x01, 0x94, 0x86, 0x86, 0x09, - 0x01, 0x92, 0x01, 0x54, 0xFE, 0x7E, 0xFE, 0x9C, 0x01, 0x98, 0x4F, 0xA2, - 0x4D, 0x4D, 0xA2, 0xFE, 0x15, 0x4E, 0xA3, 0x4D, 0x4D, 0xA3, 0x01, 0xA7, - 0x8C, 0xFD, 0xD8, 0x8C, 0x00, 0x03, 0x00, 0x17, 0xFF, 0xF3, 0x02, 0x88, - 0x02, 0xC8, 0x00, 0x1B, 0x00, 0x24, 0x00, 0x2D, 0x00, 0x00, 0x17, 0x22, - 0x26, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, - 0x07, 0x16, 0x17, 0x36, 0x37, 0x17, 0x06, 0x07, 0x16, 0x17, 0x07, 0x26, - 0x27, 0x06, 0x26, 0x14, 0x16, 0x32, 0x36, 0x37, 0x26, 0x27, 0x06, 0x3E, - 0x01, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0xFD, 0x68, 0x7E, 0x52, - 0x36, 0x56, 0x6A, 0xBE, 0x62, 0x69, 0x4A, 0x34, 0x20, 0x1A, 0x63, 0x22, - 0x39, 0x33, 0x2B, 0x72, 0x0C, 0x28, 0x68, 0xEB, 0x3F, 0x60, 0x5A, 0x21, - 0x45, 0x60, 0x36, 0x61, 0x30, 0x28, 0x2A, 0x50, 0x4E, 0x0D, 0x7D, 0x97, - 0x63, 0x16, 0x39, 0x60, 0x4C, 0x63, 0x65, 0x46, 0x66, 0x3C, 0x32, 0x3F, - 0x38, 0x44, 0x1D, 0x59, 0x58, 0x4D, 0x74, 0x04, 0x28, 0x45, 0x6D, 0xFA, - 0x60, 0x3D, 0x38, 0x2C, 0x5A, 0x3A, 0x13, 0x88, 0x3A, 0x4B, 0x2C, 0x50, - 0x49, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0x01, 0xD2, 0x00, 0x9B, - 0x02, 0xD3, 0x00, 0x05, 0x00, 0x00, 0x13, 0x15, 0x07, 0x23, 0x2F, 0x01, - 0x9B, 0x11, 0x46, 0x0E, 0x01, 0x02, 0xD3, 0x22, 0xDF, 0xD1, 0x30, 0x00, - 0x00, 0x01, 0x00, 0x3D, 0xFF, 0x84, 0x01, 0x38, 0x03, 0x1C, 0x00, 0x09, - 0x00, 0x00, 0x13, 0x10, 0x37, 0x17, 0x06, 0x10, 0x17, 0x07, 0x2E, 0x01, - 0x3D, 0xC9, 0x32, 0x85, 0x85, 0x32, 0x59, 0x70, 0x01, 0x50, 0x01, 0x5A, - 0x72, 0x44, 0x57, 0xFD, 0xA0, 0x59, 0x44, 0x32, 0xDF, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x17, 0xFF, 0x84, 0x01, 0x12, 0x03, 0x1C, 0x00, 0x07, - 0x00, 0x00, 0x17, 0x36, 0x10, 0x27, 0x37, 0x16, 0x10, 0x07, 0x17, 0x85, - 0x85, 0x33, 0xC8, 0xC8, 0x38, 0x59, 0x02, 0x60, 0x57, 0x44, 0x73, 0xFD, - 0x4E, 0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1C, 0x01, 0x69, 0x01, 0x87, - 0x02, 0xCB, 0x00, 0x18, 0x00, 0x00, 0x13, 0x33, 0x15, 0x07, 0x3F, 0x01, - 0x17, 0x0F, 0x01, 0x1F, 0x01, 0x07, 0x2F, 0x01, 0x0F, 0x01, 0x27, 0x3F, - 0x01, 0x2F, 0x01, 0x37, 0x1F, 0x01, 0x27, 0x9E, 0x67, 0x12, 0x61, 0x14, - 0x1F, 0x14, 0x70, 0x59, 0x0E, 0x4F, 0x0B, 0x3F, 0x40, 0x0C, 0x4C, 0x0D, - 0x58, 0x6F, 0x13, 0x1F, 0x14, 0x61, 0x12, 0x02, 0xCB, 0x14, 0x69, 0x30, - 0x07, 0x63, 0x06, 0x10, 0x51, 0x0E, 0x43, 0x10, 0x67, 0x68, 0x10, 0x43, - 0x0F, 0x51, 0x10, 0x06, 0x63, 0x07, 0x30, 0x69, 0x00, 0x01, 0x00, 0x2C, - 0x00, 0x13, 0x02, 0x49, 0x02, 0x34, 0x00, 0x0B, 0x00, 0x00, 0x25, 0x35, - 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x01, 0x08, - 0xDC, 0xDC, 0x65, 0xDC, 0xDC, 0x13, 0xE0, 0x63, 0xDE, 0xDE, 0x63, 0xE0, - 0x00, 0x01, 0x00, 0x38, 0xFF, 0x56, 0x00, 0xCB, 0x00, 0x6A, 0x00, 0x07, - 0x00, 0x00, 0x17, 0x35, 0x33, 0x15, 0x14, 0x07, 0x27, 0x36, 0x58, 0x73, - 0x54, 0x3F, 0x20, 0x14, 0x7E, 0x36, 0x9C, 0x42, 0x24, 0x29, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x26, 0x01, 0x16, 0x01, 0x19, 0x01, 0x78, 0x00, 0x03, - 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x26, 0xF3, 0x01, 0x16, 0x62, 0x62, - 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x70, 0x00, 0x03, - 0x00, 0x00, 0x33, 0x35, 0x33, 0x15, 0x44, 0x8A, 0x70, 0x70, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFC, 0xFF, 0x9E, 0x01, 0xBF, 0x02, 0xBB, 0x00, 0x05, - 0x00, 0x00, 0x07, 0x1B, 0x01, 0x33, 0x0B, 0x01, 0x04, 0xB8, 0x99, 0x72, - 0xB3, 0x9E, 0x62, 0x01, 0xA7, 0x01, 0x76, 0xFE, 0x62, 0xFE, 0x81, 0x00, - 0x00, 0x02, 0x00, 0x34, 0xFF, 0xF3, 0x02, 0x1F, 0x02, 0xC8, 0x00, 0x11, - 0x00, 0x1C, 0x00, 0x00, 0x04, 0x22, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, - 0x3E, 0x01, 0x32, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x24, 0x16, - 0x32, 0x36, 0x10, 0x2E, 0x01, 0x22, 0x07, 0x06, 0x15, 0x01, 0x62, 0x70, - 0x53, 0x23, 0x48, 0x48, 0x23, 0x53, 0x70, 0x53, 0x23, 0x47, 0x47, 0x23, - 0xFE, 0xF7, 0x3C, 0x85, 0x3B, 0x20, 0x33, 0x57, 0x1A, 0x38, 0x0D, 0x20, - 0x27, 0x4F, 0xD5, 0xD4, 0x50, 0x26, 0x20, 0x20, 0x26, 0x4F, 0xD5, 0xD6, - 0x4E, 0x27, 0xB5, 0x70, 0x6E, 0x01, 0x02, 0x76, 0x25, 0x13, 0x2A, 0xC6, - 0x00, 0x01, 0x00, 0x23, 0x00, 0x00, 0x01, 0xFD, 0x02, 0xC2, 0x00, 0x0B, - 0x00, 0x00, 0x33, 0x35, 0x17, 0x13, 0x23, 0x07, 0x27, 0x37, 0x17, 0x11, - 0x37, 0x15, 0x49, 0xAA, 0x06, 0x05, 0x85, 0x4C, 0xD1, 0x74, 0x95, 0x64, - 0x02, 0x01, 0xE3, 0x8A, 0x4C, 0xBB, 0x08, 0xFD, 0xA8, 0x02, 0x64, 0x00, - 0x00, 0x01, 0x00, 0x2B, 0x00, 0x00, 0x01, 0xFD, 0x02, 0xC8, 0x00, 0x19, - 0x00, 0x00, 0x33, 0x35, 0x3E, 0x03, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, - 0x27, 0x3E, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0F, 0x01, 0x15, - 0x25, 0x15, 0x33, 0x43, 0xA4, 0x2B, 0x33, 0x4B, 0x2C, 0x75, 0x31, 0x30, - 0x25, 0x85, 0x45, 0x5D, 0x77, 0x43, 0x39, 0x96, 0x01, 0x21, 0x57, 0x47, - 0xC3, 0x38, 0x61, 0x25, 0x41, 0x2A, 0x1F, 0x57, 0x1F, 0x3B, 0x61, 0x51, - 0x3A, 0x79, 0x47, 0xB6, 0x06, 0x06, 0x66, 0x00, 0x00, 0x01, 0x00, 0x08, - 0xFF, 0xF3, 0x01, 0xD9, 0x02, 0xC8, 0x00, 0x21, 0x00, 0x00, 0x25, 0x32, - 0x36, 0x34, 0x26, 0x2B, 0x01, 0x35, 0x36, 0x37, 0x36, 0x34, 0x26, 0x22, - 0x07, 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x07, 0x15, 0x16, 0x15, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x2F, 0x01, 0x37, 0x16, 0x01, 0x02, 0x34, 0x28, - 0x39, 0x41, 0x6E, 0x87, 0x20, 0x2F, 0x2D, 0x7C, 0x68, 0x0E, 0x50, 0x5E, - 0xE8, 0x5F, 0x75, 0x6F, 0x76, 0x39, 0x76, 0x1F, 0x1E, 0x27, 0x7A, 0x59, - 0x31, 0x7E, 0x39, 0x5F, 0x0B, 0x0C, 0x11, 0x78, 0x23, 0x0D, 0x5E, 0x14, - 0xB6, 0x6F, 0x29, 0x05, 0x20, 0x8D, 0x5E, 0x77, 0x20, 0x10, 0x10, 0x56, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, 0x00, 0x00, 0x02, 0x07, - 0x02, 0xC7, 0x00, 0x0F, 0x00, 0x00, 0x37, 0x35, 0x13, 0x17, 0x03, 0x15, - 0x37, 0x13, 0x33, 0x11, 0x37, 0x15, 0x23, 0x17, 0x23, 0x37, 0x15, 0xA5, - 0x70, 0x99, 0xC3, 0x1A, 0x58, 0x41, 0x41, 0x01, 0x75, 0x02, 0x98, 0x50, - 0x01, 0xDF, 0x0F, 0xFE, 0x43, 0x05, 0x05, 0x01, 0x03, 0xFE, 0xFF, 0x02, - 0x67, 0x98, 0x98, 0x00, 0x00, 0x01, 0x00, 0x14, 0xFF, 0xF3, 0x01, 0xE4, - 0x02, 0xBB, 0x00, 0x19, 0x00, 0x00, 0x25, 0x32, 0x36, 0x34, 0x26, 0x23, - 0x07, 0x13, 0x21, 0x15, 0x27, 0x07, 0x1E, 0x01, 0x17, 0x16, 0x15, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x2F, 0x01, 0x37, 0x16, 0x01, 0x0D, 0x35, 0x29, - 0x38, 0x8E, 0x60, 0x37, 0x01, 0x49, 0xE8, 0x19, 0x44, 0x5F, 0x29, 0x54, - 0x7A, 0x6A, 0x3B, 0x76, 0x1D, 0x1E, 0x26, 0x7A, 0x59, 0x36, 0x86, 0x33, - 0x02, 0x01, 0x75, 0x63, 0x04, 0xB1, 0x04, 0x14, 0x17, 0x2D, 0x7B, 0x6A, - 0x77, 0x26, 0x13, 0x13, 0x56, 0x3C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x34, - 0xFF, 0xF3, 0x02, 0x0A, 0x02, 0xC8, 0x00, 0x15, 0x00, 0x20, 0x00, 0x00, - 0x01, 0x26, 0x22, 0x06, 0x07, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x22, - 0x26, 0x35, 0x34, 0x37, 0x3E, 0x01, 0x33, 0x32, 0x1F, 0x01, 0x01, 0x14, - 0x17, 0x16, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x07, 0x01, 0xD0, 0x56, - 0x87, 0x3B, 0x08, 0x33, 0x28, 0x7C, 0x83, 0x7A, 0xE1, 0x7B, 0x53, 0x28, - 0x5E, 0x33, 0x5A, 0x3C, 0x14, 0xFE, 0xC3, 0x25, 0x1C, 0x7A, 0x2F, 0x30, - 0x47, 0x31, 0x42, 0x02, 0x4C, 0x15, 0x48, 0x70, 0x05, 0x63, 0xE0, 0x78, - 0xA0, 0xB9, 0xDD, 0x55, 0x28, 0x22, 0x16, 0x08, 0xFE, 0x54, 0x70, 0x22, - 0x17, 0x3A, 0x8B, 0x31, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1B, - 0xFF, 0xF8, 0x01, 0xE8, 0x02, 0xBB, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, - 0x15, 0x01, 0x27, 0x01, 0x35, 0x05, 0x1B, 0x01, 0xCD, 0xFE, 0xDC, 0x7B, - 0x01, 0x24, 0xFE, 0xAE, 0x02, 0xBB, 0x48, 0xFD, 0x85, 0x0A, 0x02, 0x54, - 0x06, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x27, 0xFF, 0xF3, 0x02, 0x0B, - 0x02, 0xC8, 0x00, 0x12, 0x00, 0x1B, 0x00, 0x23, 0x00, 0x00, 0x13, 0x34, - 0x36, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x37, 0x26, 0x17, 0x14, 0x32, 0x35, 0x34, 0x26, 0x27, - 0x0E, 0x01, 0x13, 0x34, 0x22, 0x15, 0x14, 0x16, 0x17, 0x36, 0x40, 0x70, - 0xD2, 0x70, 0x62, 0x7B, 0x86, 0xDF, 0x7F, 0x41, 0x2D, 0x55, 0x61, 0xF1, - 0x41, 0x54, 0x2F, 0x2D, 0xDD, 0xCB, 0x36, 0x40, 0x55, 0x02, 0x13, 0x51, - 0x64, 0x66, 0x50, 0x6C, 0x3D, 0x42, 0x6B, 0x53, 0x76, 0x7D, 0x54, 0x39, - 0x5D, 0x17, 0x3E, 0xEF, 0x6A, 0x5F, 0x32, 0x3A, 0x1C, 0x12, 0x37, 0x01, - 0x19, 0x5D, 0x53, 0x2C, 0x3B, 0x1A, 0x21, 0x00, 0x00, 0x02, 0x00, 0x34, - 0xFF, 0xF3, 0x02, 0x08, 0x02, 0xC8, 0x00, 0x15, 0x00, 0x1F, 0x00, 0x00, - 0x25, 0x32, 0x37, 0x36, 0x37, 0x06, 0x23, 0x22, 0x26, 0x34, 0x36, 0x32, - 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x2F, 0x01, 0x37, 0x16, 0x13, 0x26, - 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x37, 0x34, 0x01, 0x1C, 0x2F, 0x15, - 0x2B, 0x03, 0x42, 0x36, 0x6A, 0x78, 0x79, 0xDF, 0x7C, 0x74, 0x7F, 0x2F, - 0x68, 0x1C, 0x1C, 0x24, 0x64, 0x94, 0x19, 0x76, 0x2B, 0x27, 0x43, 0x36, - 0x46, 0x56, 0x15, 0x29, 0x86, 0x0C, 0x69, 0xD8, 0x79, 0xA2, 0xFE, 0x89, - 0xBC, 0x1F, 0x10, 0x10, 0x57, 0x33, 0x02, 0x00, 0x0F, 0x3D, 0x80, 0x35, - 0x14, 0xB6, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x00, 0xEE, - 0x02, 0x29, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, - 0x03, 0x35, 0x33, 0x15, 0x64, 0x8A, 0x8A, 0x8A, 0x01, 0xB9, 0x70, 0x70, - 0xFE, 0x47, 0x70, 0x70, 0x00, 0x02, 0x00, 0x4F, 0xFF, 0x56, 0x00, 0xEE, - 0x02, 0x29, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x00, 0x17, 0x35, 0x33, 0x15, - 0x14, 0x07, 0x27, 0x36, 0x03, 0x35, 0x33, 0x15, 0x6F, 0x73, 0x54, 0x3F, - 0x20, 0x0B, 0x8A, 0x14, 0x7E, 0x36, 0x9C, 0x42, 0x24, 0x29, 0x02, 0x16, - 0x70, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x0B, 0x02, 0x60, - 0x02, 0x41, 0x00, 0x07, 0x00, 0x00, 0x37, 0x35, 0x25, 0x15, 0x05, 0x15, - 0x05, 0x15, 0x43, 0x02, 0x1D, 0xFE, 0x74, 0x01, 0x8C, 0xFB, 0x56, 0xF0, - 0x70, 0xA8, 0x06, 0xA9, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2C, - 0x00, 0x8F, 0x02, 0x50, 0x01, 0xB8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, - 0x13, 0x35, 0x21, 0x15, 0x05, 0x35, 0x21, 0x15, 0x2C, 0x02, 0x24, 0xFD, - 0xDC, 0x02, 0x24, 0x01, 0x54, 0x64, 0x64, 0xC5, 0x63, 0x63, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x39, 0x00, 0x0B, 0x02, 0x55, 0x02, 0x41, 0x00, 0x07, - 0x00, 0x00, 0x37, 0x35, 0x25, 0x35, 0x25, 0x35, 0x05, 0x15, 0x39, 0x01, - 0x8B, 0xFE, 0x75, 0x02, 0x1C, 0x0B, 0x6F, 0xA9, 0x06, 0xA8, 0x70, 0xF0, - 0x56, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x01, 0xCA, - 0x02, 0xC8, 0x00, 0x1D, 0x00, 0x21, 0x00, 0x00, 0x13, 0x27, 0x3E, 0x02, - 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x0E, 0x04, 0x07, 0x23, 0x34, 0x35, - 0x34, 0x3E, 0x01, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x13, 0x35, - 0x33, 0x15, 0x3E, 0x27, 0x0C, 0x28, 0x72, 0x33, 0x60, 0x7A, 0x2B, 0x17, - 0x1F, 0x3D, 0x1D, 0x1C, 0x01, 0x67, 0x26, 0x3B, 0x1E, 0x48, 0x59, 0x25, - 0x5D, 0x05, 0x89, 0x02, 0x2F, 0x5A, 0x07, 0x15, 0x23, 0x6B, 0x53, 0x4C, - 0x2F, 0x19, 0x1A, 0x2B, 0x1A, 0x33, 0x20, 0x05, 0x05, 0x34, 0x51, 0x30, - 0x15, 0x32, 0x45, 0x50, 0x18, 0xFD, 0xB9, 0x6D, 0x6D, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x3A, 0xFF, 0xD0, 0x03, 0x00, 0x02, 0xBE, 0x00, 0x2E, - 0x00, 0x37, 0x00, 0x00, 0x05, 0x06, 0x22, 0x2E, 0x02, 0x34, 0x36, 0x37, - 0x36, 0x20, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x23, 0x06, - 0x23, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x17, 0x06, 0x14, 0x1E, 0x02, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, - 0x37, 0x03, 0x26, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x02, 0x03, - 0x2D, 0x7D, 0x7C, 0x66, 0x3D, 0x41, 0x35, 0x6F, 0x01, 0x18, 0xC9, 0x7B, - 0x49, 0x29, 0x24, 0x04, 0x04, 0x38, 0x43, 0x2E, 0x49, 0x51, 0x54, 0x3B, - 0x66, 0x02, 0x01, 0x04, 0x05, 0x05, 0x1F, 0x48, 0x89, 0xF9, 0x9F, 0x9E, - 0x73, 0x1C, 0x3E, 0x19, 0x18, 0x5C, 0x17, 0x21, 0x23, 0x47, 0x21, 0x0F, - 0x2F, 0x5A, 0x91, 0xB7, 0x95, 0x2C, 0x5C, 0xAA, 0x91, 0x70, 0x9F, 0x36, - 0x34, 0x6A, 0x65, 0xEC, 0x61, 0x1B, 0x8B, 0x77, 0x29, 0x18, 0x05, 0x6C, - 0x50, 0x6D, 0x80, 0x95, 0xFE, 0xE9, 0xA1, 0x0B, 0x01, 0x9E, 0x08, 0x2F, - 0x51, 0x82, 0xAB, 0x00, 0x00, 0x02, 0xFF, 0xFD, 0x00, 0x00, 0x02, 0x18, - 0x02, 0xBB, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x00, 0x23, 0x13, 0x33, 0x13, - 0x23, 0x27, 0x23, 0x07, 0x13, 0x33, 0x03, 0x23, 0x03, 0xC7, 0x8E, 0xC6, - 0x79, 0x2C, 0xD0, 0x2D, 0x43, 0xA4, 0x4F, 0x06, 0x02, 0xBB, 0xFD, 0x45, - 0xAC, 0xAC, 0x01, 0x0E, 0x01, 0x46, 0x00, 0x00, 0x00, 0x03, 0x00, 0x61, - 0xFF, 0xF3, 0x02, 0x31, 0x02, 0xC8, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, - 0x00, 0x00, 0x01, 0x32, 0x15, 0x14, 0x0E, 0x01, 0x07, 0x06, 0x07, 0x15, - 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x13, 0x03, 0x36, 0x03, - 0x16, 0x32, 0x36, 0x34, 0x26, 0x23, 0x27, 0x35, 0x16, 0x32, 0x36, 0x34, - 0x26, 0x23, 0x07, 0x01, 0x48, 0xD7, 0x19, 0x10, 0x0C, 0x14, 0x1A, 0x75, - 0x47, 0x3F, 0x5C, 0x4F, 0x9F, 0x05, 0x05, 0x85, 0x10, 0x48, 0x70, 0x28, - 0x3A, 0x36, 0x70, 0x48, 0x62, 0x27, 0x2D, 0x35, 0x6F, 0x02, 0xC8, 0xC0, - 0x30, 0x2F, 0x16, 0x09, 0x0E, 0x0C, 0x04, 0x1F, 0x7C, 0x80, 0x33, 0x2B, - 0x11, 0x01, 0x42, 0x01, 0x75, 0x0D, 0xFD, 0x90, 0x09, 0x3A, 0x88, 0x2E, - 0x01, 0x59, 0x01, 0x30, 0x77, 0x2F, 0x06, 0x00, 0x00, 0x01, 0x00, 0x40, - 0xFF, 0xF3, 0x02, 0x2A, 0x02, 0xC8, 0x00, 0x19, 0x00, 0x00, 0x05, 0x22, - 0x26, 0x35, 0x34, 0x37, 0x3E, 0x01, 0x32, 0x17, 0x07, 0x26, 0x22, 0x07, - 0x06, 0x15, 0x14, 0x1E, 0x01, 0x32, 0x36, 0x37, 0x17, 0x0E, 0x02, 0x01, - 0x44, 0x7A, 0x8A, 0x70, 0x24, 0x4E, 0x99, 0x52, 0x0D, 0x5E, 0x9F, 0x16, - 0x31, 0x22, 0x2F, 0x5B, 0x64, 0x3A, 0x24, 0x0B, 0x27, 0x78, 0x0D, 0xAA, - 0xB9, 0xFD, 0x4B, 0x18, 0x12, 0x14, 0x62, 0x0E, 0x17, 0x33, 0xC3, 0x5B, - 0x79, 0x29, 0x1C, 0x1B, 0x59, 0x07, 0x16, 0x24, 0x00, 0x02, 0x00, 0x61, - 0xFF, 0xF3, 0x02, 0x4E, 0x02, 0xC8, 0x00, 0x0B, 0x00, 0x16, 0x00, 0x00, - 0x13, 0x36, 0x32, 0x1E, 0x01, 0x17, 0x16, 0x15, 0x10, 0x21, 0x22, 0x27, - 0x37, 0x32, 0x37, 0x36, 0x10, 0x27, 0x26, 0x23, 0x07, 0x13, 0x16, 0x61, - 0x96, 0x8E, 0x60, 0x3A, 0x11, 0x1E, 0xFE, 0xEB, 0x2D, 0xAB, 0xD6, 0x4B, - 0x1A, 0x33, 0x30, 0x17, 0x41, 0x72, 0x01, 0x36, 0x02, 0xBB, 0x0D, 0x27, - 0x3F, 0x2F, 0x4F, 0x7E, 0xFE, 0x8D, 0x0D, 0x58, 0x18, 0x2F, 0x01, 0x8B, - 0x26, 0x13, 0x06, 0xFE, 0x03, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, - 0x00, 0x00, 0x01, 0xDB, 0x02, 0xBB, 0x00, 0x0B, 0x00, 0x00, 0x33, 0x11, - 0x21, 0x15, 0x25, 0x07, 0x33, 0x15, 0x23, 0x17, 0x25, 0x15, 0x61, 0x01, - 0x7A, 0xFE, 0xFB, 0x05, 0xF1, 0xF1, 0x05, 0x01, 0x05, 0x02, 0xBB, 0x66, - 0x03, 0xC4, 0x63, 0xCD, 0x02, 0x66, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, - 0x00, 0x00, 0x01, 0xDB, 0x02, 0xBB, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, - 0x21, 0x15, 0x25, 0x07, 0x33, 0x15, 0x23, 0x13, 0x61, 0x01, 0x7A, 0xFE, - 0xFA, 0x04, 0xEA, 0xEA, 0x05, 0x02, 0xBB, 0x69, 0x03, 0xC3, 0x62, 0xFE, - 0xD0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0xFF, 0xF3, 0x02, 0x26, - 0x02, 0xC8, 0x00, 0x1D, 0x00, 0x00, 0x01, 0x33, 0x11, 0x06, 0x23, 0x22, - 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3E, 0x01, 0x32, 0x17, 0x07, - 0x26, 0x23, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x32, 0x37, 0x35, 0x27, - 0x01, 0x4D, 0xD9, 0x58, 0x79, 0x30, 0x4D, 0x49, 0x19, 0x36, 0x52, 0x29, - 0x63, 0xA9, 0x5D, 0x0E, 0x89, 0x2E, 0x5D, 0x17, 0x2F, 0x31, 0x1A, 0x8F, - 0x1F, 0x68, 0x01, 0x79, 0xFE, 0xA4, 0x2A, 0x11, 0x30, 0x28, 0x59, 0xAB, - 0xD9, 0x4C, 0x26, 0x1D, 0x15, 0x61, 0x0E, 0x18, 0x2F, 0xFE, 0x8D, 0x34, - 0x1C, 0x0B, 0xBD, 0x06, 0x00, 0x01, 0x00, 0x61, 0x00, 0x00, 0x02, 0x4F, - 0x02, 0xBB, 0x00, 0x0B, 0x00, 0x00, 0x33, 0x11, 0x33, 0x03, 0x21, 0x03, - 0x33, 0x11, 0x23, 0x13, 0x21, 0x13, 0x61, 0x75, 0x03, 0x01, 0x0A, 0x03, - 0x75, 0x75, 0x03, 0xFE, 0xF7, 0x02, 0x02, 0xBB, 0xFE, 0xDB, 0x01, 0x25, - 0xFD, 0x45, 0x01, 0x31, 0xFE, 0xCF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, - 0xFF, 0xFF, 0x00, 0xD7, 0x02, 0xBB, 0x00, 0x05, 0x00, 0x00, 0x17, 0x13, - 0x03, 0x33, 0x03, 0x13, 0x61, 0x04, 0x04, 0x76, 0x04, 0x04, 0x01, 0x01, - 0x42, 0x01, 0x7A, 0xFE, 0xCA, 0xFE, 0x7A, 0x00, 0x00, 0x01, 0xFF, 0xF3, - 0xFF, 0xF3, 0x00, 0xF9, 0x02, 0xBB, 0x00, 0x0C, 0x00, 0x00, 0x35, 0x16, - 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x23, 0x22, 0x27, 0x23, - 0x3F, 0x0A, 0x19, 0x74, 0xB6, 0x21, 0x2F, 0x5F, 0x08, 0x09, 0x13, 0x76, - 0x01, 0xD2, 0xFE, 0x36, 0xFE, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, - 0x00, 0x00, 0x02, 0x77, 0x02, 0xBB, 0x00, 0x06, 0x00, 0x0B, 0x00, 0x00, - 0x21, 0x01, 0x13, 0x33, 0x01, 0x15, 0x09, 0x01, 0x11, 0x23, 0x13, 0x03, - 0x01, 0xE4, 0xFE, 0xF5, 0xF7, 0x8C, 0xFE, 0xFA, 0x01, 0x21, 0xFE, 0x60, - 0x76, 0x05, 0x05, 0x01, 0x68, 0x01, 0x53, 0xFE, 0xB2, 0x06, 0xFE, 0x99, - 0x02, 0xBB, 0xFD, 0x45, 0x01, 0x63, 0x01, 0x58, 0x00, 0x01, 0x00, 0x61, - 0x00, 0x00, 0x01, 0xD0, 0x02, 0xBB, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, - 0x33, 0x03, 0x25, 0x15, 0x61, 0x75, 0x05, 0x00, 0xFF, 0x02, 0xBB, 0xFD, - 0xAB, 0x02, 0x68, 0x00, 0x00, 0x01, 0x00, 0x5D, 0x00, 0x00, 0x02, 0xD7, - 0x02, 0xBB, 0x00, 0x0F, 0x00, 0x00, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, - 0x33, 0x13, 0x23, 0x03, 0x23, 0x03, 0x23, 0x03, 0x23, 0x13, 0x5D, 0x17, - 0x9E, 0x85, 0x06, 0x83, 0x9F, 0x18, 0x74, 0x02, 0x05, 0x83, 0x7C, 0x86, - 0x06, 0x01, 0x02, 0xBB, 0xFE, 0x58, 0x01, 0xA8, 0xFD, 0x45, 0x02, 0x48, - 0xFE, 0x64, 0x01, 0x9C, 0xFD, 0xB8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, - 0x00, 0x00, 0x02, 0x5B, 0x02, 0xBB, 0x00, 0x0B, 0x00, 0x00, 0x33, 0x11, - 0x33, 0x13, 0x33, 0x03, 0x33, 0x11, 0x23, 0x03, 0x23, 0x13, 0x61, 0x99, - 0xFB, 0x05, 0x0E, 0x6F, 0x99, 0xFA, 0x05, 0x0D, 0x02, 0xBB, 0xFD, 0xCC, - 0x02, 0x34, 0xFD, 0x45, 0x02, 0x33, 0xFD, 0xCD, 0x00, 0x02, 0x00, 0x40, - 0xFF, 0xF3, 0x02, 0x68, 0x02, 0xC8, 0x00, 0x12, 0x00, 0x23, 0x00, 0x00, - 0x05, 0x22, 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3E, 0x01, 0x32, - 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x26, 0x16, 0x32, 0x37, 0x36, - 0x35, 0x34, 0x2E, 0x02, 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x01, 0x01, 0x54, - 0x30, 0x4E, 0x48, 0x18, 0x36, 0x52, 0x28, 0x5D, 0x7A, 0x5D, 0x28, 0x52, - 0x72, 0x40, 0xB1, 0x2D, 0x5C, 0x1E, 0x42, 0x10, 0x29, 0x35, 0x58, 0x34, - 0x29, 0x10, 0x0C, 0x16, 0x0D, 0x13, 0x31, 0x28, 0x57, 0xA9, 0xD5, 0x4E, - 0x26, 0x20, 0x20, 0x26, 0x4E, 0xD5, 0xF3, 0x4E, 0x2B, 0x73, 0x0B, 0x11, - 0x25, 0xCB, 0x54, 0x66, 0x38, 0x12, 0x12, 0x38, 0x66, 0x97, 0x5C, 0x39, - 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x02, 0x28, 0x02, 0xC8, 0x00, 0x0C, - 0x00, 0x15, 0x00, 0x00, 0x13, 0x36, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, - 0x23, 0x27, 0x15, 0x23, 0x13, 0x37, 0x16, 0x32, 0x36, 0x34, 0x27, 0x26, - 0x22, 0x07, 0x61, 0x8D, 0xD0, 0x6A, 0x48, 0x3E, 0x5D, 0x6F, 0x75, 0x04, - 0x71, 0x3A, 0x7E, 0x20, 0x1C, 0x12, 0x78, 0x32, 0x02, 0xBA, 0x0E, 0x7A, - 0x76, 0x90, 0x38, 0x32, 0x05, 0xE3, 0x01, 0x45, 0x06, 0x0A, 0x39, 0xCD, - 0x15, 0x0F, 0x08, 0x00, 0x00, 0x02, 0x00, 0x40, 0xFF, 0x9F, 0x02, 0x93, - 0x02, 0xC8, 0x00, 0x12, 0x00, 0x23, 0x00, 0x00, 0x05, 0x06, 0x22, 0x2E, - 0x02, 0x34, 0x3E, 0x02, 0x32, 0x16, 0x17, 0x16, 0x10, 0x07, 0x15, 0x17, - 0x07, 0x24, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2E, 0x02, 0x22, 0x0E, - 0x02, 0x14, 0x1E, 0x01, 0x01, 0xA6, 0x28, 0x69, 0x5C, 0x4F, 0x2A, 0x2A, - 0x50, 0x5E, 0x7A, 0x5C, 0x28, 0x52, 0x5F, 0x8A, 0x26, 0xFE, 0x98, 0x2D, - 0x5C, 0x1E, 0x42, 0x10, 0x29, 0x34, 0x58, 0x35, 0x29, 0x10, 0x0C, 0x16, - 0x04, 0x09, 0x20, 0x4E, 0x94, 0xD4, 0x93, 0x4C, 0x20, 0x20, 0x26, 0x4E, - 0xFE, 0x59, 0x5A, 0x06, 0x2A, 0x64, 0xC7, 0x0B, 0x11, 0x25, 0xCB, 0x54, - 0x66, 0x38, 0x12, 0x12, 0x38, 0x66, 0x97, 0x5C, 0x39, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x02, 0x56, 0x02, 0xC8, 0x00, 0x0E, - 0x00, 0x17, 0x00, 0x00, 0x01, 0x32, 0x15, 0x14, 0x07, 0x15, 0x13, 0x23, - 0x03, 0x27, 0x11, 0x23, 0x13, 0x03, 0x36, 0x13, 0x16, 0x32, 0x36, 0x34, - 0x27, 0x26, 0x22, 0x07, 0x01, 0x54, 0xF1, 0x92, 0xA3, 0x89, 0x88, 0x6E, - 0x76, 0x05, 0x03, 0x70, 0x03, 0x4F, 0x77, 0x2F, 0x18, 0x15, 0x83, 0x44, - 0x02, 0xC8, 0xE1, 0xA6, 0x29, 0x05, 0xFE, 0xED, 0x01, 0x08, 0x04, 0xFE, - 0xF4, 0x01, 0x48, 0x01, 0x72, 0x0E, 0xFE, 0xA8, 0x09, 0x3B, 0x99, 0x1B, - 0x16, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x25, 0xFF, 0xF3, 0x01, 0xEB, - 0x02, 0xC8, 0x00, 0x2D, 0x00, 0x00, 0x25, 0x32, 0x35, 0x34, 0x2E, 0x05, - 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1F, 0x01, 0x07, 0x26, 0x22, - 0x06, 0x14, 0x1E, 0x06, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, - 0x2F, 0x01, 0x3E, 0x02, 0x37, 0x16, 0x01, 0x1B, 0x58, 0x42, 0x75, 0x11, - 0x2C, 0x11, 0x1F, 0x06, 0x11, 0x75, 0x6C, 0x4F, 0x4D, 0x1B, 0x13, 0x6D, - 0x73, 0x2C, 0x37, 0x49, 0x2D, 0x17, 0x28, 0x16, 0x1E, 0x07, 0x13, 0x7E, - 0x66, 0x34, 0x71, 0x1E, 0x1F, 0x09, 0x0C, 0x08, 0x05, 0x73, 0x5C, 0x60, - 0x29, 0x38, 0x35, 0x09, 0x18, 0x10, 0x1F, 0x10, 0x2B, 0x29, 0x55, 0x6D, - 0x16, 0x07, 0x62, 0x15, 0x25, 0x51, 0x2D, 0x23, 0x14, 0x0B, 0x17, 0x13, - 0x1F, 0x10, 0x27, 0x2D, 0x61, 0x78, 0x1E, 0x0F, 0x10, 0x1B, 0x21, 0x17, - 0x0D, 0x34, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0x01, 0xF1, - 0x02, 0xBB, 0x00, 0x07, 0x00, 0x00, 0x03, 0x21, 0x15, 0x27, 0x13, 0x23, - 0x13, 0x07, 0x04, 0x01, 0xF5, 0xC3, 0x02, 0x74, 0x03, 0xC3, 0x02, 0xBB, - 0x67, 0x03, 0xFD, 0xA9, 0x02, 0x57, 0x03, 0x00, 0x00, 0x01, 0x00, 0x61, - 0xFF, 0xF3, 0x02, 0x4B, 0x02, 0xBB, 0x00, 0x14, 0x00, 0x00, 0x13, 0x11, - 0x33, 0x11, 0x14, 0x1E, 0x01, 0x3E, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, - 0x07, 0x0E, 0x01, 0x23, 0x22, 0x26, 0x61, 0x75, 0x17, 0x32, 0x6F, 0x31, - 0x17, 0x75, 0x40, 0x21, 0x56, 0x3E, 0x7C, 0x79, 0x01, 0x31, 0x01, 0x8A, - 0xFE, 0x91, 0x6D, 0x65, 0x20, 0x01, 0x1F, 0x64, 0x6E, 0x01, 0x6F, 0xFE, - 0x7F, 0xBE, 0x46, 0x25, 0x1E, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, - 0x00, 0x00, 0x02, 0x22, 0x02, 0xBB, 0x00, 0x07, 0x00, 0x00, 0x33, 0x03, - 0x33, 0x13, 0x33, 0x13, 0x33, 0x03, 0xCF, 0xBF, 0x7B, 0x8A, 0x06, 0x8B, - 0x7C, 0xC1, 0x02, 0xBB, 0xFD, 0xAC, 0x02, 0x54, 0xFD, 0x45, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x02, 0xE8, 0x02, 0xBB, 0x00, 0x0F, - 0x00, 0x00, 0x33, 0x03, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, - 0x33, 0x03, 0x23, 0x03, 0x23, 0x03, 0x81, 0x65, 0x75, 0x40, 0x06, 0x62, - 0x92, 0x62, 0x06, 0x3F, 0x76, 0x67, 0x97, 0x65, 0x06, 0x64, 0x02, 0xBB, - 0xFD, 0xB7, 0x01, 0xA1, 0xFE, 0x5F, 0x02, 0x49, 0xFD, 0x45, 0x01, 0xAC, - 0xFE, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x02, 0x37, - 0x02, 0xBB, 0x00, 0x0D, 0x00, 0x00, 0x33, 0x13, 0x03, 0x33, 0x13, 0x33, - 0x13, 0x33, 0x03, 0x13, 0x23, 0x03, 0x23, 0x03, 0x05, 0xCE, 0xC7, 0x85, - 0x89, 0x06, 0x8A, 0x85, 0xC7, 0xCF, 0x86, 0x8F, 0x05, 0x92, 0x01, 0x5E, - 0x01, 0x5D, 0xFE, 0xED, 0x01, 0x13, 0xFE, 0xA1, 0xFE, 0xA4, 0x01, 0x0F, - 0xFE, 0xF1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x02, 0x19, - 0x02, 0xBB, 0x00, 0x09, 0x00, 0x00, 0x33, 0x13, 0x03, 0x33, 0x13, 0x33, - 0x13, 0x33, 0x03, 0x13, 0xD2, 0x03, 0xD2, 0x7F, 0x89, 0x05, 0x8A, 0x7F, - 0xD2, 0x02, 0x01, 0x00, 0x01, 0xBB, 0xFE, 0xA5, 0x01, 0x5B, 0xFE, 0x45, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x00, 0x02, 0x08, - 0x02, 0xBB, 0x00, 0x0B, 0x00, 0x00, 0x33, 0x35, 0x01, 0x35, 0x05, 0x35, - 0x21, 0x15, 0x01, 0x15, 0x25, 0x15, 0x1D, 0x01, 0x5F, 0xFE, 0xB6, 0x01, - 0xD2, 0xFE, 0xA6, 0x01, 0x5E, 0x62, 0x01, 0xF2, 0x07, 0x07, 0x67, 0x62, - 0xFE, 0x0D, 0x05, 0x05, 0x66, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x62, - 0xFF, 0x84, 0x01, 0x28, 0x03, 0x13, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, - 0x33, 0x15, 0x27, 0x11, 0x37, 0x15, 0x62, 0xC6, 0x5B, 0x5B, 0x7C, 0x03, - 0x8F, 0x5A, 0x03, 0xFD, 0x1F, 0x02, 0x59, 0x00, 0x00, 0x01, 0x00, 0x0F, - 0xFF, 0x9E, 0x01, 0xD1, 0x02, 0xBB, 0x00, 0x05, 0x00, 0x00, 0x05, 0x0B, - 0x01, 0x33, 0x1B, 0x01, 0x01, 0x60, 0x9E, 0xB3, 0x72, 0x98, 0xB8, 0x62, - 0x01, 0x7F, 0x01, 0x9E, 0xFE, 0x8A, 0xFE, 0x59, 0x00, 0x01, 0x00, 0x21, - 0xFF, 0x84, 0x00, 0xE7, 0x03, 0x13, 0x00, 0x07, 0x00, 0x00, 0x17, 0x35, - 0x17, 0x11, 0x07, 0x35, 0x33, 0x11, 0x21, 0x5D, 0x5D, 0xC6, 0x7C, 0x59, - 0x02, 0x02, 0xE1, 0x03, 0x5A, 0xFC, 0x71, 0x00, 0x00, 0x01, 0x00, 0x32, - 0x01, 0x3A, 0x01, 0xD5, 0x02, 0xBC, 0x00, 0x07, 0x00, 0x00, 0x1B, 0x01, - 0x33, 0x13, 0x07, 0x03, 0x23, 0x03, 0x32, 0x96, 0x78, 0x95, 0x6A, 0x64, - 0x06, 0x64, 0x01, 0x45, 0x01, 0x77, 0xFE, 0x89, 0x0B, 0x01, 0x24, 0xFE, - 0xDC, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0D, 0xFF, 0x5D, 0x02, 0x1F, - 0xFF, 0xAF, 0x00, 0x03, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x0D, 0x02, - 0x12, 0xA3, 0x52, 0x52, 0x00, 0x01, 0x00, 0xA2, 0x02, 0x8C, 0x01, 0xC8, - 0x03, 0x2D, 0x00, 0x03, 0x00, 0x00, 0x13, 0x37, 0x05, 0x07, 0xA2, 0x20, - 0x01, 0x06, 0x16, 0x02, 0xD1, 0x5C, 0x5D, 0x44, 0x00, 0x02, 0x00, 0x2E, - 0xFF, 0xF3, 0x01, 0xF5, 0x02, 0x56, 0x00, 0x19, 0x00, 0x23, 0x00, 0x00, - 0x17, 0x22, 0x26, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x22, 0x06, 0x07, - 0x27, 0x3E, 0x02, 0x33, 0x32, 0x15, 0x11, 0x23, 0x27, 0x23, 0x0E, 0x02, - 0x13, 0x26, 0x22, 0x07, 0x06, 0x14, 0x16, 0x32, 0x36, 0x37, 0xD8, 0x4D, - 0x5D, 0x7D, 0x76, 0x60, 0x1F, 0x5A, 0x6F, 0x3E, 0x1F, 0x0E, 0x2F, 0x80, - 0x35, 0xC7, 0x4A, 0x10, 0x05, 0x0B, 0x25, 0x65, 0x80, 0x29, 0x8C, 0x11, - 0x16, 0x1D, 0x41, 0x4F, 0x2F, 0x0D, 0x61, 0xC1, 0x58, 0x01, 0x61, 0x29, - 0x16, 0x17, 0x55, 0x06, 0x13, 0x1F, 0xD8, 0xFE, 0x82, 0x3F, 0x09, 0x19, - 0x2A, 0x01, 0x1B, 0x06, 0x11, 0x14, 0x71, 0x29, 0x17, 0x16, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x52, 0xFF, 0xF3, 0x02, 0x19, 0x02, 0xF5, 0x00, 0x0B, - 0x00, 0x19, 0x00, 0x00, 0x13, 0x33, 0x15, 0x36, 0x33, 0x32, 0x11, 0x10, - 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, - 0x2E, 0x02, 0x23, 0x22, 0x07, 0x52, 0x74, 0x54, 0x39, 0xC6, 0xD9, 0x2E, - 0x8E, 0x32, 0x74, 0x3A, 0x68, 0x10, 0x29, 0x0C, 0x05, 0x1C, 0x16, 0x1B, - 0x37, 0x46, 0x02, 0xF5, 0xB2, 0x13, 0xFE, 0xD7, 0xFE, 0xC6, 0x18, 0x11, - 0x45, 0x0E, 0x0F, 0x22, 0xBA, 0x60, 0x2E, 0x14, 0x11, 0x03, 0x14, 0x00, - 0x00, 0x01, 0x00, 0x3E, 0xFF, 0xF3, 0x01, 0xF5, 0x02, 0x56, 0x00, 0x19, - 0x00, 0x00, 0x25, 0x16, 0x17, 0x0E, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x37, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x22, 0x07, 0x06, 0x10, 0x17, - 0x16, 0x32, 0x36, 0x01, 0xD3, 0x0B, 0x17, 0x09, 0x1F, 0x64, 0x34, 0x73, - 0x84, 0x50, 0x48, 0x76, 0x4E, 0x4C, 0x0D, 0x6D, 0x74, 0x18, 0x2A, 0x39, - 0x15, 0x43, 0x56, 0x81, 0x22, 0x33, 0x06, 0x13, 0x20, 0x96, 0x9D, 0xAE, - 0x45, 0x3D, 0x13, 0x5B, 0x0E, 0x18, 0x2D, 0xFE, 0xDA, 0x2A, 0x0F, 0x18, - 0x00, 0x02, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x0A, 0x02, 0xF5, 0x00, 0x12, - 0x00, 0x1E, 0x00, 0x00, 0x05, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, - 0x32, 0x17, 0x35, 0x33, 0x11, 0x23, 0x27, 0x23, 0x0E, 0x02, 0x13, 0x26, - 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x3F, 0x01, 0x00, 0xFF, - 0x57, 0x6A, 0x62, 0x33, 0x48, 0x31, 0x4A, 0x74, 0x4C, 0x0D, 0x06, 0x1D, - 0x26, 0x47, 0x75, 0x3D, 0x71, 0x11, 0x21, 0x26, 0x0D, 0x1F, 0x3A, 0x3F, - 0x15, 0x0D, 0x95, 0x94, 0xCE, 0x48, 0x24, 0x13, 0xB2, 0xFD, 0x0B, 0x3B, - 0x16, 0x18, 0x1A, 0x01, 0xE9, 0x19, 0x15, 0x2A, 0xFE, 0xCD, 0x20, 0x0C, - 0x21, 0x0B, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x14, - 0x02, 0x56, 0x00, 0x11, 0x00, 0x21, 0x00, 0x00, 0x05, 0x22, 0x10, 0x33, - 0x32, 0x16, 0x1D, 0x01, 0x21, 0x14, 0x17, 0x16, 0x33, 0x32, 0x3F, 0x01, - 0x17, 0x06, 0x03, 0x34, 0x2E, 0x05, 0x27, 0x26, 0x22, 0x0E, 0x02, 0x07, - 0x37, 0x01, 0x38, 0xFA, 0xF8, 0x6F, 0x6F, 0xFE, 0xA3, 0x26, 0x19, 0x2A, - 0x51, 0x5A, 0x1F, 0x1C, 0x62, 0x06, 0x02, 0x02, 0x05, 0x07, 0x0B, 0x0E, - 0x09, 0x0E, 0x4F, 0x33, 0x1B, 0x08, 0x01, 0xE6, 0x0D, 0x02, 0x63, 0x80, - 0x94, 0x48, 0x6F, 0x23, 0x16, 0x1E, 0x0B, 0x58, 0x30, 0x01, 0x81, 0x06, - 0x29, 0x09, 0x1F, 0x07, 0x14, 0x05, 0x05, 0x07, 0x12, 0x2E, 0x36, 0x30, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x00, 0x01, 0x76, - 0x03, 0x02, 0x00, 0x12, 0x00, 0x00, 0x33, 0x11, 0x23, 0x35, 0x37, 0x3E, - 0x01, 0x33, 0x17, 0x07, 0x26, 0x22, 0x07, 0x06, 0x15, 0x33, 0x15, 0x23, - 0x11, 0x6D, 0x43, 0x43, 0x06, 0x63, 0x58, 0x48, 0x08, 0x32, 0x34, 0x0C, - 0x1B, 0x81, 0x81, 0x01, 0xD2, 0x47, 0x0E, 0x78, 0x63, 0x03, 0x5E, 0x03, - 0x07, 0x10, 0x64, 0x5A, 0xFE, 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x27, - 0xFF, 0x4D, 0x02, 0x08, 0x02, 0x56, 0x00, 0x21, 0x00, 0x2D, 0x00, 0x00, - 0x17, 0x16, 0x32, 0x35, 0x34, 0x2E, 0x01, 0x35, 0x37, 0x26, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x17, 0x15, 0x07, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, - 0x14, 0x1E, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2F, 0x01, 0x12, 0x06, - 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x42, 0xAE, - 0xA3, 0x35, 0xD0, 0x29, 0x90, 0x8B, 0x70, 0x3E, 0xA8, 0x40, 0x1E, 0x7B, - 0x6C, 0x04, 0xB9, 0x41, 0x81, 0x6A, 0x61, 0x58, 0x1C, 0x94, 0x39, 0x35, - 0x7F, 0x32, 0x0E, 0x03, 0x06, 0x4F, 0x3B, 0x1A, 0x19, 0x10, 0x20, 0x57, - 0x02, 0x73, 0x2F, 0x91, 0x71, 0x65, 0x0C, 0x46, 0x0A, 0x42, 0x3B, 0x58, - 0x6E, 0x01, 0x27, 0x0A, 0x4C, 0x39, 0x2C, 0x40, 0x47, 0x16, 0x07, 0x02, - 0x90, 0x32, 0x86, 0x30, 0x2F, 0x40, 0x40, 0x2F, 0x02, 0x04, 0x04, 0x00, - 0x00, 0x01, 0x00, 0x4D, 0x00, 0x00, 0x02, 0x0F, 0x02, 0xF5, 0x00, 0x11, - 0x00, 0x00, 0x33, 0x11, 0x33, 0x15, 0x36, 0x32, 0x16, 0x15, 0x11, 0x23, - 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x4D, 0x74, 0x6F, 0x9C, - 0x43, 0x74, 0x1C, 0x2A, 0x1A, 0x4A, 0x30, 0x02, 0xF5, 0xD1, 0x33, 0x6B, - 0x6A, 0xFE, 0x7E, 0x01, 0x66, 0x55, 0x34, 0x13, 0x14, 0xFE, 0x38, 0x00, - 0x00, 0x02, 0x00, 0x58, 0x00, 0x00, 0x00, 0xDE, 0x02, 0xF5, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x03, 0x35, 0x33, 0x15, - 0x61, 0x74, 0x7D, 0x86, 0x02, 0x49, 0xFD, 0xB7, 0x02, 0x97, 0x5E, 0x5E, - 0x00, 0x02, 0xFF, 0xE7, 0xFF, 0x4E, 0x00, 0xF0, 0x02, 0xF5, 0x00, 0x0B, - 0x00, 0x0F, 0x00, 0x00, 0x07, 0x16, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x06, 0x23, 0x27, 0x13, 0x35, 0x33, 0x15, 0x0C, 0x27, 0x44, 0x14, - 0x74, 0x60, 0x4E, 0x52, 0x83, 0x86, 0x4A, 0x06, 0x2F, 0x5D, 0x02, 0x0D, - 0xFD, 0xF4, 0x7F, 0x70, 0x07, 0x03, 0x42, 0x5E, 0x5E, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x52, 0x00, 0x00, 0x02, 0x4C, 0x02, 0xF1, 0x00, 0x04, - 0x00, 0x0B, 0x00, 0x00, 0x13, 0x11, 0x23, 0x13, 0x03, 0x01, 0x03, 0x13, - 0x33, 0x03, 0x15, 0x01, 0xC6, 0x74, 0x05, 0x05, 0x01, 0x64, 0xEF, 0xDF, - 0x94, 0xF5, 0x01, 0x07, 0x02, 0xF1, 0xFD, 0x0F, 0x01, 0x41, 0x01, 0xB0, - 0xFD, 0x0F, 0x01, 0x3A, 0x01, 0x0C, 0xFE, 0xF9, 0x05, 0xFE, 0xC6, 0x00, - 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x00, 0xC6, 0x02, 0xF5, 0x00, 0x03, - 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x52, 0x74, 0x02, 0xF5, 0xFD, 0x0B, - 0x00, 0x01, 0x00, 0x5D, 0x00, 0x00, 0x03, 0x5D, 0x02, 0x57, 0x00, 0x22, - 0x00, 0x00, 0x33, 0x11, 0x33, 0x17, 0x33, 0x36, 0x32, 0x17, 0x3E, 0x02, - 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x22, 0x06, 0x07, - 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x11, - 0x5D, 0x4C, 0x0D, 0x05, 0x79, 0xAC, 0x20, 0x27, 0x2C, 0x52, 0x25, 0x51, - 0x42, 0x74, 0x17, 0x4F, 0x57, 0x19, 0x04, 0x74, 0x1A, 0x0C, 0x19, 0x3E, - 0x55, 0x02, 0x49, 0x3A, 0x48, 0x4C, 0x18, 0x19, 0x1B, 0x6F, 0x68, 0xFE, - 0x80, 0x01, 0x64, 0x53, 0x37, 0x22, 0x10, 0x28, 0x16, 0xFE, 0x82, 0x01, - 0x66, 0x6F, 0x11, 0x08, 0x2F, 0xFE, 0x41, 0x00, 0x00, 0x01, 0x00, 0x5D, - 0x00, 0x00, 0x02, 0x1C, 0x02, 0x56, 0x00, 0x11, 0x00, 0x00, 0x33, 0x11, - 0x33, 0x17, 0x33, 0x36, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, - 0x22, 0x06, 0x07, 0x11, 0x5D, 0x4C, 0x0D, 0x05, 0x7B, 0xA9, 0x3D, 0x74, - 0x17, 0x4E, 0x59, 0x19, 0x02, 0x49, 0x3A, 0x47, 0x6E, 0x66, 0xFE, 0x7E, - 0x01, 0x65, 0x59, 0x2F, 0x20, 0x10, 0xFE, 0x43, 0x00, 0x02, 0x00, 0x3E, - 0xFF, 0xF3, 0x02, 0x18, 0x02, 0x56, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x00, - 0x24, 0x06, 0x20, 0x26, 0x10, 0x36, 0x20, 0x16, 0x00, 0x32, 0x36, 0x10, - 0x26, 0x22, 0x06, 0x10, 0x02, 0x18, 0x6C, 0xFE, 0xFF, 0x6D, 0x6D, 0x01, - 0x01, 0x6C, 0xFE, 0xCF, 0x8A, 0x30, 0x30, 0x8A, 0x31, 0x8E, 0x9B, 0x9B, - 0x01, 0x2C, 0x9C, 0x9C, 0xFE, 0x95, 0x53, 0x01, 0x05, 0x52, 0x52, 0xFE, - 0xFB, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x52, 0xFF, 0x5A, 0x02, 0x1F, - 0x02, 0x56, 0x00, 0x13, 0x00, 0x20, 0x00, 0x00, 0x17, 0x11, 0x33, 0x17, - 0x33, 0x3E, 0x03, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x10, 0x23, 0x22, - 0x27, 0x15, 0x11, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2E, 0x02, 0x22, - 0x06, 0x07, 0x52, 0x4C, 0x0E, 0x05, 0x02, 0x1F, 0x11, 0x25, 0x0F, 0x2A, - 0x23, 0x57, 0x64, 0xE4, 0x2B, 0x4A, 0x44, 0x60, 0x13, 0x2A, 0x07, 0x17, - 0x15, 0x37, 0x4B, 0x2C, 0xA6, 0x02, 0xEF, 0x3C, 0x01, 0x16, 0x0B, 0x14, - 0x05, 0x0E, 0x91, 0x96, 0xFE, 0xC4, 0x0C, 0xA5, 0x01, 0x0C, 0x12, 0x0E, - 0x21, 0xB6, 0x43, 0x4C, 0x22, 0x06, 0x18, 0x17, 0x00, 0x02, 0x00, 0x3E, - 0xFF, 0x5A, 0x02, 0x06, 0x02, 0x56, 0x00, 0x0D, 0x00, 0x19, 0x00, 0x00, - 0x05, 0x35, 0x06, 0x22, 0x26, 0x27, 0x26, 0x10, 0x36, 0x33, 0x32, 0x16, - 0x17, 0x11, 0x03, 0x26, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x01, 0x92, 0x41, 0x6D, 0x45, 0x1F, 0x42, 0x71, 0x74, 0x2E, - 0x71, 0x44, 0x74, 0x38, 0x75, 0x12, 0x1D, 0x23, 0x12, 0x21, 0x3E, 0x48, - 0xA6, 0xB5, 0x1C, 0x1D, 0x21, 0x46, 0x01, 0x59, 0x86, 0x12, 0x12, 0xFD, - 0x28, 0x02, 0x8D, 0x0E, 0x12, 0x22, 0x93, 0xAC, 0x1D, 0x0F, 0x18, 0x00, - 0x00, 0x01, 0x00, 0x5D, 0x00, 0x00, 0x01, 0x90, 0x02, 0x56, 0x00, 0x0F, - 0x00, 0x00, 0x00, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x11, 0x23, - 0x11, 0x33, 0x16, 0x17, 0x33, 0x36, 0x01, 0x3E, 0x3A, 0x18, 0x09, 0x19, - 0x14, 0x4B, 0x3E, 0x74, 0x49, 0x09, 0x06, 0x06, 0x24, 0x02, 0x56, 0x08, - 0x68, 0x02, 0x2C, 0xFE, 0x44, 0x02, 0x49, 0x2F, 0x0E, 0x1D, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2F, 0xFF, 0xF3, 0x01, 0xCE, 0x02, 0x56, 0x00, 0x26, - 0x00, 0x00, 0x25, 0x32, 0x36, 0x34, 0x2E, 0x05, 0x27, 0x26, 0x35, 0x34, - 0x36, 0x32, 0x17, 0x07, 0x26, 0x22, 0x06, 0x14, 0x1E, 0x05, 0x17, 0x16, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x01, 0x0E, 0x27, - 0x28, 0x34, 0x46, 0x08, 0x26, 0x22, 0x35, 0x0C, 0x21, 0x65, 0xC1, 0x5D, - 0x12, 0x68, 0x7D, 0x1D, 0x39, 0x69, 0x16, 0x2E, 0x13, 0x1E, 0x07, 0x10, - 0x69, 0x60, 0x30, 0x6B, 0x3B, 0x1C, 0x75, 0x53, 0x24, 0x50, 0x23, 0x15, - 0x03, 0x0C, 0x0C, 0x1C, 0x10, 0x28, 0x3C, 0x4F, 0x5D, 0x20, 0x5C, 0x19, - 0x21, 0x3C, 0x25, 0x1F, 0x07, 0x11, 0x0E, 0x19, 0x0F, 0x24, 0x2C, 0x58, - 0x69, 0x1A, 0x1A, 0x5E, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x25, - 0xFF, 0xF5, 0x01, 0x52, 0x02, 0xB1, 0x00, 0x14, 0x00, 0x00, 0x37, 0x11, - 0x23, 0x35, 0x3F, 0x01, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, - 0x33, 0x37, 0x15, 0x06, 0x23, 0x22, 0x26, 0x68, 0x43, 0x48, 0x17, 0x59, - 0x75, 0x76, 0x11, 0x24, 0x40, 0x22, 0x2D, 0x4F, 0x4B, 0xBE, 0x01, 0x13, - 0x48, 0x0E, 0x8A, 0x88, 0x5A, 0xFE, 0xEA, 0x43, 0x1F, 0x03, 0x5D, 0x08, - 0x53, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0xFF, 0xF3, 0x02, 0x0E, - 0x02, 0x49, 0x00, 0x17, 0x00, 0x00, 0x37, 0x11, 0x33, 0x11, 0x14, 0x17, - 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x27, 0x23, 0x0E, 0x03, - 0x07, 0x06, 0x23, 0x22, 0x50, 0x74, 0x0D, 0x0E, 0x25, 0x3C, 0x5A, 0x74, - 0x4C, 0x0E, 0x05, 0x01, 0x2B, 0x11, 0x2C, 0x0F, 0x2A, 0x22, 0x9B, 0xC7, - 0x01, 0x82, 0xFE, 0x95, 0x60, 0x13, 0x11, 0x30, 0x01, 0xBF, 0xFD, 0xB7, - 0x3A, 0x01, 0x18, 0x08, 0x15, 0x04, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x06, - 0x00, 0x00, 0x01, 0xE8, 0x02, 0x49, 0x00, 0x07, 0x00, 0x00, 0x33, 0x03, - 0x33, 0x13, 0x33, 0x13, 0x33, 0x03, 0xB0, 0xAA, 0x78, 0x75, 0x06, 0x77, - 0x78, 0xAD, 0x02, 0x49, 0xFE, 0x18, 0x01, 0xE8, 0xFD, 0xB7, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x0D, 0x00, 0x00, 0x02, 0xDE, 0x02, 0x49, 0x00, 0x0F, - 0x00, 0x00, 0x33, 0x03, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, - 0x33, 0x03, 0x23, 0x03, 0x23, 0x03, 0x82, 0x75, 0x74, 0x4E, 0x05, 0x56, - 0x97, 0x56, 0x06, 0x4C, 0x75, 0x75, 0x9C, 0x55, 0x06, 0x55, 0x02, 0x49, - 0xFE, 0x05, 0x01, 0xAC, 0xFE, 0x54, 0x01, 0xFB, 0xFD, 0xB7, 0x01, 0xAE, - 0xFE, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0xFF, - 0x02, 0x49, 0x00, 0x0D, 0x00, 0x00, 0x33, 0x13, 0x03, 0x33, 0x17, 0x33, - 0x37, 0x33, 0x03, 0x13, 0x23, 0x27, 0x23, 0x07, 0x09, 0xB6, 0xB0, 0x80, - 0x73, 0x06, 0x71, 0x80, 0xB0, 0xB6, 0x84, 0x75, 0x06, 0x73, 0x01, 0x32, - 0x01, 0x17, 0xD7, 0xD7, 0xFE, 0xE8, 0xFE, 0xCF, 0xEC, 0xEC, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFB, 0xFF, 0x5A, 0x01, 0xF1, 0x02, 0x49, 0x00, 0x09, - 0x00, 0x00, 0x17, 0x37, 0x03, 0x33, 0x13, 0x33, 0x13, 0x33, 0x03, 0x07, - 0x75, 0x52, 0xCC, 0x81, 0x7C, 0x05, 0x7A, 0x7A, 0xCD, 0x37, 0xA6, 0xDC, - 0x02, 0x13, 0xFE, 0x64, 0x01, 0x9C, 0xFD, 0xD9, 0xC8, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1A, 0x00, 0x00, 0x01, 0xCC, 0x02, 0x49, 0x00, 0x0B, - 0x00, 0x00, 0x33, 0x35, 0x01, 0x35, 0x05, 0x35, 0x21, 0x15, 0x01, 0x15, - 0x25, 0x15, 0x1A, 0x01, 0x25, 0xFE, 0xE8, 0x01, 0x9F, 0xFE, 0xDC, 0x01, - 0x2A, 0x54, 0x01, 0x95, 0x06, 0x07, 0x61, 0x54, 0xFE, 0x6A, 0x06, 0x07, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0xFF, 0x85, 0x01, 0xA0, - 0x03, 0x12, 0x00, 0x23, 0x00, 0x00, 0x37, 0x35, 0x34, 0x26, 0x27, 0x35, - 0x3E, 0x01, 0x3D, 0x01, 0x34, 0x36, 0x33, 0x17, 0x07, 0x26, 0x22, 0x06, - 0x1D, 0x01, 0x14, 0x07, 0x06, 0x07, 0x15, 0x16, 0x1D, 0x01, 0x14, 0x16, - 0x33, 0x37, 0x17, 0x06, 0x23, 0x22, 0xAB, 0x2D, 0x4E, 0x4C, 0x2F, 0x54, - 0x60, 0x41, 0x05, 0x35, 0x31, 0x17, 0x23, 0x1B, 0x1C, 0x5A, 0x14, 0x1E, - 0x4B, 0x05, 0x2B, 0x16, 0xB4, 0x46, 0x78, 0x3B, 0x24, 0x0C, 0x57, 0x0B, - 0x26, 0x3A, 0x61, 0x5F, 0x67, 0x03, 0x55, 0x03, 0x2B, 0x48, 0x60, 0x4D, - 0x23, 0x1B, 0x08, 0x06, 0x21, 0x75, 0x6A, 0x45, 0x31, 0x03, 0x57, 0x02, - 0x00, 0x01, 0x00, 0x5F, 0xFF, 0xA9, 0x00, 0xBD, 0x02, 0xFA, 0x00, 0x03, - 0x00, 0x00, 0x17, 0x11, 0x33, 0x11, 0x5F, 0x5E, 0x57, 0x03, 0x51, 0xFC, - 0xAF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1A, 0xFF, 0x85, 0x01, 0x8A, - 0x03, 0x12, 0x00, 0x23, 0x00, 0x00, 0x17, 0x16, 0x32, 0x36, 0x3D, 0x01, - 0x34, 0x37, 0x35, 0x26, 0x27, 0x26, 0x3D, 0x01, 0x34, 0x26, 0x23, 0x07, - 0x27, 0x36, 0x33, 0x32, 0x16, 0x1D, 0x01, 0x14, 0x16, 0x17, 0x15, 0x0E, - 0x01, 0x1D, 0x01, 0x14, 0x23, 0x27, 0x1F, 0x22, 0x47, 0x14, 0x5A, 0x1C, - 0x16, 0x28, 0x17, 0x1F, 0x47, 0x05, 0x2B, 0x16, 0x60, 0x54, 0x2F, 0x4C, - 0x4E, 0x2D, 0xB4, 0x41, 0x22, 0x03, 0x31, 0x45, 0x6A, 0x75, 0x21, 0x06, - 0x08, 0x15, 0x29, 0x4D, 0x60, 0x48, 0x2B, 0x03, 0x55, 0x03, 0x67, 0x5F, - 0x61, 0x3A, 0x26, 0x0B, 0x57, 0x0C, 0x24, 0x3B, 0x78, 0xC1, 0x02, 0x00, - 0x00, 0x01, 0x00, 0x13, 0x00, 0xCC, 0x01, 0xFE, 0x01, 0x74, 0x00, 0x0D, - 0x00, 0x00, 0x13, 0x32, 0x16, 0x32, 0x37, 0x17, 0x0E, 0x01, 0x22, 0x26, - 0x22, 0x07, 0x27, 0x36, 0x8E, 0x27, 0xB8, 0x3D, 0x31, 0x23, 0x11, 0x3F, - 0x45, 0xBF, 0x41, 0x31, 0x25, 0x42, 0x01, 0x74, 0x44, 0x1C, 0x3D, 0x19, - 0x2A, 0x44, 0x22, 0x3E, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4A, - 0xFF, 0x8F, 0x00, 0xD4, 0x02, 0x49, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, - 0x17, 0x13, 0x33, 0x13, 0x03, 0x35, 0x33, 0x15, 0x50, 0x0F, 0x60, 0x0F, - 0x84, 0x8A, 0x71, 0x01, 0xF6, 0xFE, 0x0A, 0x02, 0x4C, 0x6E, 0x6E, 0x00, - 0x00, 0x01, 0x00, 0x3E, 0xFF, 0x8B, 0x01, 0xF5, 0x02, 0xB6, 0x00, 0x18, - 0x00, 0x00, 0x05, 0x35, 0x26, 0x10, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, - 0x07, 0x26, 0x23, 0x22, 0x06, 0x10, 0x17, 0x16, 0x32, 0x36, 0x37, 0x17, - 0x06, 0x07, 0x15, 0x01, 0x07, 0xC9, 0xC9, 0x60, 0x3C, 0x43, 0x0D, 0x6D, - 0x31, 0x50, 0x35, 0x39, 0x15, 0x43, 0x56, 0x36, 0x22, 0x39, 0x55, 0x75, - 0x6C, 0x1C, 0x02, 0x1B, 0x22, 0x66, 0x61, 0x02, 0x10, 0x5B, 0x0E, 0x57, - 0xFE, 0xEC, 0x2A, 0x0F, 0x18, 0x17, 0x55, 0x2A, 0x0B, 0x6C, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x02, 0x16, 0x02, 0xC8, 0x00, 0x17, - 0x00, 0x00, 0x33, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x3E, 0x01, 0x33, - 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x07, 0x33, 0x15, 0x23, 0x15, - 0x37, 0x15, 0x40, 0x5A, 0x5A, 0x5B, 0x06, 0x7F, 0x6C, 0x42, 0x48, 0x0C, - 0x64, 0x25, 0x43, 0x2C, 0x03, 0xB7, 0xB8, 0xF9, 0x64, 0xED, 0x57, 0x9F, - 0x81, 0x14, 0x5E, 0x0E, 0x45, 0x77, 0x57, 0xEC, 0x02, 0x67, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x43, 0x00, 0x58, 0x02, 0x52, 0x02, 0x65, 0x00, 0x17, - 0x00, 0x1F, 0x00, 0x00, 0x37, 0x26, 0x34, 0x37, 0x27, 0x37, 0x17, 0x36, - 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, - 0x22, 0x27, 0x07, 0x27, 0x36, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, - 0x7E, 0x26, 0x27, 0x3A, 0x42, 0x3C, 0x41, 0x8F, 0x3E, 0x3D, 0x42, 0x3B, - 0x2A, 0x28, 0x3B, 0x43, 0x3B, 0x41, 0x90, 0x43, 0x3B, 0x42, 0x78, 0x4E, - 0x8E, 0x45, 0x4D, 0x86, 0x4E, 0xD6, 0x3B, 0x98, 0x3E, 0x3B, 0x43, 0x3C, - 0x28, 0x27, 0x3B, 0x42, 0x3A, 0x3D, 0x9B, 0x3D, 0x3A, 0x42, 0x3A, 0x28, - 0x2A, 0x3C, 0x43, 0x76, 0x49, 0x46, 0x9C, 0x49, 0x49, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x02, 0x27, 0x02, 0xBB, 0x00, 0x0B, - 0x00, 0x13, 0x00, 0x00, 0x13, 0x35, 0x17, 0x03, 0x33, 0x13, 0x33, 0x13, - 0x33, 0x03, 0x37, 0x15, 0x05, 0x35, 0x21, 0x15, 0x23, 0x15, 0x23, 0x35, - 0x31, 0x84, 0xA4, 0x7F, 0x8A, 0x06, 0x88, 0x7F, 0xA4, 0x84, 0xFE, 0x2A, - 0x01, 0xD6, 0xB1, 0x75, 0x01, 0x15, 0x51, 0x02, 0x01, 0x57, 0xFE, 0xAB, - 0x01, 0x55, 0xFE, 0xA9, 0x02, 0x51, 0x8B, 0x51, 0x51, 0x8A, 0x8A, 0x00, - 0x00, 0x02, 0x00, 0x5F, 0xFF, 0xA9, 0x00, 0xBD, 0x02, 0xFA, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, - 0x5F, 0x5E, 0x5E, 0x5E, 0x01, 0x93, 0x01, 0x67, 0xFE, 0x99, 0xFE, 0x16, - 0x01, 0x67, 0xFE, 0x99, 0x00, 0x02, 0x00, 0x32, 0xFF, 0xA3, 0x01, 0xF8, - 0x02, 0xC7, 0x00, 0x2A, 0x00, 0x38, 0x00, 0x00, 0x25, 0x32, 0x37, 0x36, - 0x35, 0x34, 0x27, 0x2E, 0x03, 0x35, 0x34, 0x37, 0x26, 0x34, 0x36, 0x32, - 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x14, 0x1E, 0x03, 0x15, 0x14, 0x07, - 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2F, 0x01, 0x37, 0x16, 0x37, - 0x36, 0x34, 0x2E, 0x01, 0x27, 0x26, 0x27, 0x06, 0x15, 0x14, 0x17, 0x1E, - 0x01, 0x01, 0x17, 0x2C, 0x10, 0x14, 0x2E, 0x23, 0x56, 0x53, 0x39, 0x3F, - 0x2A, 0x6A, 0xBC, 0x4B, 0x13, 0x54, 0x50, 0x26, 0x25, 0x42, 0x5E, 0x5E, - 0x42, 0x41, 0x21, 0x77, 0x58, 0x33, 0x6C, 0x1C, 0x1C, 0x1F, 0x71, 0xA5, - 0x22, 0x2D, 0x42, 0x18, 0x2C, 0x15, 0x1E, 0x24, 0x16, 0x6E, 0x06, 0x0C, - 0x0E, 0x2B, 0x27, 0x15, 0x10, 0x17, 0x20, 0x44, 0x34, 0x4B, 0x2F, 0x27, - 0x8A, 0x56, 0x1A, 0x60, 0x19, 0x19, 0x43, 0x2A, 0x19, 0x1F, 0x44, 0x33, - 0x45, 0x37, 0x25, 0x3B, 0x54, 0x5E, 0x1B, 0x0E, 0x0D, 0x60, 0x33, 0xE0, - 0x22, 0x35, 0x1D, 0x14, 0x08, 0x0D, 0x09, 0x1C, 0x26, 0x1F, 0x10, 0x0A, - 0x21, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0x02, 0xA5, 0x01, 0xCD, - 0x03, 0x02, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, - 0x33, 0x35, 0x33, 0x15, 0x7F, 0x7C, 0x57, 0x7B, 0x02, 0xA5, 0x5D, 0x5D, - 0x5D, 0x5D, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, 0xFF, 0xDB, 0x03, 0x06, - 0x02, 0xA7, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x26, 0x00, 0x00, 0x24, 0x06, - 0x20, 0x26, 0x10, 0x36, 0x20, 0x16, 0x00, 0x16, 0x20, 0x36, 0x10, 0x26, - 0x22, 0x06, 0x01, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, - 0x16, 0x17, 0x07, 0x26, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x37, 0x03, 0x06, 0xC8, 0xFE, 0xC9, 0xC7, 0xCD, 0x01, 0x31, 0xC8, 0xFD, - 0x8B, 0x91, 0x01, 0x01, 0x92, 0x92, 0xFC, 0x96, 0x01, 0x96, 0x34, 0xA1, - 0x61, 0x39, 0x31, 0x51, 0x16, 0x47, 0x0E, 0x0A, 0x3B, 0x49, 0x0F, 0x20, - 0x21, 0x1B, 0x38, 0x43, 0xA5, 0xCA, 0xCA, 0x01, 0x36, 0xCC, 0xCA, 0xFE, - 0xE2, 0x95, 0x96, 0x01, 0x02, 0x96, 0x97, 0xFE, 0xCC, 0x23, 0x66, 0x6D, - 0x85, 0x2F, 0x29, 0x0B, 0x06, 0x4F, 0x09, 0x07, 0x10, 0x6F, 0x4C, 0x2F, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2A, 0x01, 0x21, 0x01, 0x6C, - 0x02, 0xC3, 0x00, 0x18, 0x00, 0x21, 0x00, 0x00, 0x01, 0x06, 0x23, 0x22, - 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x34, 0x26, 0x23, 0x22, 0x0F, - 0x01, 0x27, 0x36, 0x33, 0x32, 0x15, 0x11, 0x23, 0x2F, 0x01, 0x26, 0x22, - 0x06, 0x14, 0x16, 0x33, 0x32, 0x37, 0x01, 0x1B, 0x45, 0x38, 0x74, 0x2E, - 0x23, 0x51, 0x1B, 0x2C, 0x18, 0x23, 0x40, 0x39, 0x13, 0x15, 0x59, 0x4A, - 0x92, 0x3F, 0x0E, 0x0C, 0x19, 0x58, 0x1D, 0x17, 0x16, 0x27, 0x3A, 0x01, - 0x50, 0x2F, 0x87, 0x41, 0x1F, 0x18, 0x04, 0x02, 0x31, 0x1D, 0x16, 0x08, - 0x4B, 0x22, 0x96, 0xFE, 0xFD, 0x26, 0x8A, 0x02, 0x18, 0x3B, 0x18, 0x1C, - 0x00, 0x02, 0x00, 0x20, 0x00, 0x52, 0x01, 0xEA, 0x02, 0x50, 0x00, 0x06, - 0x00, 0x0D, 0x00, 0x00, 0x37, 0x03, 0x13, 0x17, 0x07, 0x15, 0x1F, 0x01, - 0x27, 0x37, 0x17, 0x07, 0x15, 0x17, 0xB6, 0x96, 0x96, 0x56, 0x7B, 0x7B, - 0x89, 0x95, 0x95, 0x55, 0x79, 0x79, 0x52, 0x00, 0xFF, 0x00, 0xFF, 0x33, - 0xC9, 0x06, 0xC9, 0x32, 0xFE, 0xFD, 0x33, 0xC7, 0x06, 0xC7, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x14, 0x00, 0x76, 0x02, 0x31, 0x01, 0x57, 0x00, 0x05, - 0x00, 0x00, 0x37, 0x35, 0x21, 0x15, 0x23, 0x35, 0x14, 0x02, 0x1D, 0x66, - 0xF3, 0x64, 0xE1, 0x7D, 0x00, 0x01, 0x00, 0x36, 0x01, 0x03, 0x01, 0x28, - 0x01, 0x66, 0x00, 0x03, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x36, 0xF2, - 0x01, 0x03, 0x63, 0x63, 0x00, 0x04, 0x00, 0x40, 0xFF, 0xDB, 0x03, 0x06, - 0x02, 0xA7, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x27, 0x00, 0x00, - 0x24, 0x06, 0x20, 0x26, 0x10, 0x36, 0x20, 0x16, 0x00, 0x16, 0x20, 0x36, - 0x10, 0x26, 0x22, 0x06, 0x05, 0x27, 0x15, 0x23, 0x37, 0x27, 0x36, 0x33, - 0x32, 0x15, 0x14, 0x06, 0x07, 0x15, 0x17, 0x23, 0x03, 0x0F, 0x01, 0x16, - 0x32, 0x36, 0x34, 0x26, 0x03, 0x06, 0xC8, 0xFE, 0xC9, 0xC7, 0xCD, 0x01, - 0x31, 0xC8, 0xFD, 0x8B, 0x91, 0x01, 0x01, 0x92, 0x92, 0xFC, 0x96, 0x01, - 0x0D, 0x35, 0x5C, 0x03, 0x02, 0x54, 0x47, 0x97, 0x2B, 0x21, 0x50, 0x6A, - 0x2F, 0x41, 0x01, 0x1E, 0x42, 0x16, 0x16, 0xA5, 0xCA, 0xCA, 0x01, 0x36, - 0xCC, 0xCA, 0xFE, 0xE2, 0x95, 0x96, 0x01, 0x02, 0x96, 0x97, 0xBC, 0x01, - 0x8F, 0xBF, 0xD5, 0x08, 0x84, 0x34, 0x40, 0x0C, 0x03, 0x95, 0x01, 0x4E, - 0x04, 0x6B, 0x03, 0x1B, 0x3F, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x89, - 0x02, 0xA8, 0x01, 0xC7, 0x02, 0xF5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x35, - 0x21, 0x15, 0x89, 0x01, 0x3E, 0x02, 0xA8, 0x4D, 0x4D, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x12, 0x01, 0x8F, 0x01, 0x50, 0x02, 0xCD, 0x00, 0x07, - 0x00, 0x0B, 0x00, 0x00, 0x12, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x14, - 0x26, 0x32, 0x34, 0x22, 0xF3, 0x84, 0x5D, 0x5C, 0x86, 0x5C, 0xE2, 0x86, - 0x86, 0x01, 0x8F, 0x4F, 0xA2, 0x4D, 0x4D, 0xA2, 0x0A, 0x8C, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x2C, 0x00, 0x09, 0x02, 0x17, 0x02, 0x41, 0x00, 0x03, - 0x00, 0x0F, 0x00, 0x00, 0x37, 0x35, 0x21, 0x15, 0x01, 0x35, 0x33, 0x35, - 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x2C, 0x01, 0xEB, 0xFE, - 0x15, 0xC3, 0x65, 0xC3, 0xC3, 0x65, 0x09, 0x63, 0x63, 0x01, 0x3E, 0x62, - 0x98, 0x98, 0x62, 0x9E, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, - 0x01, 0x2A, 0x01, 0x4D, 0x02, 0xC4, 0x00, 0x14, 0x00, 0x00, 0x13, 0x35, - 0x36, 0x37, 0x36, 0x34, 0x23, 0x22, 0x07, 0x27, 0x3E, 0x01, 0x32, 0x16, - 0x15, 0x14, 0x0F, 0x01, 0x15, 0x37, 0x15, 0x3B, 0x40, 0x26, 0x49, 0x20, - 0x33, 0x45, 0x22, 0x17, 0x55, 0x60, 0x47, 0x7C, 0x0E, 0x94, 0x01, 0x2A, - 0x3F, 0x46, 0x2E, 0x55, 0x41, 0x28, 0x4A, 0x10, 0x1F, 0x3B, 0x31, 0x47, - 0x89, 0x10, 0x04, 0x06, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, - 0x01, 0x22, 0x01, 0x3D, 0x02, 0xC4, 0x00, 0x22, 0x00, 0x00, 0x13, 0x16, - 0x32, 0x36, 0x34, 0x26, 0x2B, 0x01, 0x35, 0x3E, 0x01, 0x34, 0x27, 0x26, - 0x23, 0x06, 0x07, 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x07, - 0x15, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x3E, 0x47, 0x47, - 0x13, 0x1F, 0x26, 0x34, 0x4A, 0x26, 0x08, 0x09, 0x32, 0x2B, 0x23, 0x08, - 0x3E, 0x2D, 0x89, 0x26, 0x05, 0x0B, 0x42, 0x3F, 0x47, 0x21, 0x48, 0x26, - 0x01, 0x8B, 0x19, 0x17, 0x39, 0x16, 0x46, 0x05, 0x10, 0x30, 0x07, 0x0A, - 0x02, 0x05, 0x4C, 0x0B, 0x6D, 0x34, 0x17, 0x03, 0x05, 0x04, 0x12, 0x4C, - 0x3A, 0x46, 0x10, 0x0F, 0x00, 0x01, 0x00, 0xA7, 0x02, 0x8C, 0x01, 0xCD, - 0x03, 0x2D, 0x00, 0x03, 0x00, 0x00, 0x13, 0x27, 0x25, 0x17, 0xBD, 0x16, - 0x01, 0x06, 0x20, 0x02, 0x8C, 0x44, 0x5D, 0x5C, 0x00, 0x01, 0x00, 0x50, - 0xFF, 0x5A, 0x02, 0x0E, 0x02, 0x49, 0x00, 0x15, 0x00, 0x00, 0x17, 0x11, - 0x33, 0x11, 0x14, 0x17, 0x16, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, - 0x27, 0x23, 0x06, 0x23, 0x22, 0x27, 0x07, 0x17, 0x50, 0x74, 0x0D, 0x10, - 0x49, 0x58, 0x18, 0x74, 0x4B, 0x0E, 0x06, 0x7D, 0x42, 0x22, 0x18, 0x04, - 0x0A, 0xA6, 0x02, 0xEF, 0xFE, 0xA0, 0x69, 0x13, 0x13, 0x21, 0x0F, 0x01, - 0xBF, 0xFD, 0xB7, 0x3A, 0x47, 0x0D, 0x04, 0xA2, 0x00, 0x01, 0x00, 0x29, - 0xFF, 0x5C, 0x02, 0x5F, 0x02, 0xBB, 0x00, 0x0C, 0x00, 0x00, 0x05, 0x11, - 0x2E, 0x01, 0x10, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, - 0x07, 0x6D, 0x71, 0x79, 0x75, 0x01, 0x48, 0x74, 0x70, 0xA4, 0x01, 0x5C, - 0x03, 0x76, 0x01, 0x16, 0x74, 0xFC, 0xA1, 0x02, 0xFA, 0xFD, 0x06, 0x00, - 0x00, 0x01, 0x00, 0x58, 0x01, 0x0C, 0x00, 0xF2, 0x01, 0xA5, 0x00, 0x08, - 0x00, 0x00, 0x12, 0x26, 0x34, 0x36, 0x33, 0x32, 0x15, 0x14, 0x06, 0x86, - 0x2E, 0x2D, 0x20, 0x4D, 0x2D, 0x01, 0x0C, 0x26, 0x50, 0x23, 0x4C, 0x27, - 0x26, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xBF, 0xFF, 0x4D, 0x01, 0x81, - 0x00, 0x17, 0x00, 0x0C, 0x00, 0x00, 0x17, 0x16, 0x32, 0x36, 0x34, 0x27, - 0x37, 0x16, 0x14, 0x06, 0x23, 0x22, 0x27, 0xBF, 0x2D, 0x33, 0x15, 0x0D, - 0x46, 0x14, 0x3E, 0x34, 0x1F, 0x31, 0x5E, 0x05, 0x0C, 0x2F, 0x34, 0x0B, - 0x37, 0x5A, 0x39, 0x09, 0x00, 0x01, 0x00, 0x24, 0x01, 0x2A, 0x01, 0x59, - 0x02, 0xC3, 0x00, 0x0B, 0x00, 0x00, 0x13, 0x35, 0x33, 0x35, 0x23, 0x07, - 0x27, 0x37, 0x17, 0x11, 0x33, 0x15, 0x43, 0x64, 0x04, 0x51, 0x2E, 0x8C, - 0x52, 0x57, 0x01, 0x2A, 0x50, 0xE9, 0x40, 0x40, 0x60, 0x06, 0xFE, 0xBD, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x01, 0x21, 0x01, 0x64, - 0x02, 0xC3, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 0x22, 0x26, - 0x34, 0x36, 0x32, 0x16, 0x06, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, - 0x01, 0x64, 0x4D, 0xBA, 0x4D, 0x4D, 0xBA, 0x4D, 0xF5, 0x20, 0x55, 0x21, - 0x21, 0x55, 0x20, 0x01, 0x8B, 0x6A, 0x6A, 0xCE, 0x6A, 0x6A, 0xB4, 0x32, - 0x32, 0x9B, 0x32, 0x32, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x52, 0x01, 0xE9, - 0x02, 0x50, 0x00, 0x06, 0x00, 0x0D, 0x00, 0x00, 0x3F, 0x01, 0x35, 0x27, - 0x37, 0x17, 0x07, 0x25, 0x37, 0x35, 0x27, 0x37, 0x17, 0x07, 0xFD, 0x7B, - 0x7B, 0x56, 0x96, 0x96, 0xFE, 0xCC, 0x7A, 0x7A, 0x56, 0x95, 0x95, 0x85, - 0xC9, 0x06, 0xC9, 0x33, 0xFF, 0xFF, 0x35, 0xC7, 0x06, 0xC7, 0x33, 0xFD, - 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x24, 0xFF, 0xF7, 0x03, 0x83, - 0x02, 0xDD, 0x00, 0x05, 0x00, 0x16, 0x00, 0x22, 0x00, 0x00, 0x05, 0x1B, - 0x01, 0x33, 0x0B, 0x01, 0x37, 0x35, 0x34, 0x37, 0x13, 0x17, 0x07, 0x3F, - 0x01, 0x33, 0x15, 0x37, 0x15, 0x23, 0x15, 0x23, 0x37, 0x25, 0x35, 0x33, - 0x35, 0x23, 0x07, 0x27, 0x37, 0x17, 0x11, 0x33, 0x15, 0x01, 0x04, 0xCE, - 0x9D, 0x69, 0xBE, 0xAB, 0xDA, 0x02, 0x63, 0x51, 0x5E, 0x64, 0x0C, 0x4A, - 0x28, 0x28, 0x58, 0x01, 0xFD, 0x3F, 0x64, 0x04, 0x51, 0x2E, 0x8C, 0x52, - 0x57, 0x09, 0x01, 0x92, 0x01, 0x54, 0xFE, 0x7E, 0xFE, 0x9C, 0x58, 0x39, - 0x09, 0x06, 0x01, 0x0B, 0x09, 0xFE, 0x03, 0x93, 0x93, 0x01, 0x50, 0x4F, - 0x4F, 0xDB, 0x50, 0xE9, 0x40, 0x40, 0x60, 0x06, 0xFE, 0xBD, 0x50, 0x00, - 0x00, 0x03, 0x00, 0x24, 0xFF, 0xF7, 0x03, 0x89, 0x02, 0xDD, 0x00, 0x05, - 0x00, 0x11, 0x00, 0x26, 0x00, 0x00, 0x05, 0x1B, 0x01, 0x33, 0x0B, 0x01, - 0x01, 0x35, 0x33, 0x35, 0x23, 0x07, 0x27, 0x37, 0x17, 0x11, 0x33, 0x15, - 0x01, 0x35, 0x36, 0x37, 0x36, 0x34, 0x23, 0x22, 0x07, 0x27, 0x3E, 0x01, - 0x32, 0x16, 0x15, 0x14, 0x0F, 0x01, 0x15, 0x37, 0x15, 0x01, 0x05, 0xCD, - 0x9D, 0x6A, 0xBF, 0xAA, 0xFE, 0xD3, 0x64, 0x04, 0x51, 0x2E, 0x8C, 0x52, - 0x57, 0x01, 0x1E, 0x40, 0x26, 0x49, 0x20, 0x33, 0x45, 0x22, 0x17, 0x55, - 0x60, 0x47, 0x7C, 0x0E, 0x94, 0x09, 0x01, 0x92, 0x01, 0x54, 0xFE, 0x7E, - 0xFE, 0x9C, 0x01, 0x33, 0x50, 0xE9, 0x40, 0x40, 0x60, 0x06, 0xFE, 0xBD, - 0x50, 0xFE, 0xD6, 0x3F, 0x46, 0x2E, 0x55, 0x41, 0x28, 0x4A, 0x10, 0x1F, - 0x3B, 0x31, 0x47, 0x89, 0x10, 0x04, 0x06, 0x50, 0x00, 0x03, 0x00, 0x27, - 0xFF, 0xF7, 0x03, 0x53, 0x02, 0xDD, 0x00, 0x05, 0x00, 0x28, 0x00, 0x39, - 0x00, 0x00, 0x17, 0x1B, 0x01, 0x33, 0x0B, 0x01, 0x01, 0x16, 0x32, 0x36, - 0x34, 0x26, 0x2B, 0x01, 0x35, 0x3E, 0x01, 0x34, 0x27, 0x26, 0x23, 0x06, - 0x07, 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x07, 0x15, 0x16, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x2F, 0x01, 0x05, 0x35, 0x34, 0x37, 0x13, - 0x17, 0x07, 0x3F, 0x01, 0x33, 0x15, 0x37, 0x15, 0x23, 0x15, 0x23, 0x37, - 0xD9, 0xCE, 0x9D, 0x69, 0xBE, 0xAB, 0xFE, 0xFA, 0x46, 0x47, 0x13, 0x1F, - 0x26, 0x34, 0x4A, 0x26, 0x07, 0x0A, 0x32, 0x2C, 0x22, 0x08, 0x3E, 0x2D, - 0x89, 0x26, 0x06, 0x0A, 0x42, 0x3F, 0x47, 0x3E, 0x3E, 0x13, 0x01, 0xF2, - 0x02, 0x62, 0x52, 0x5E, 0x63, 0x0D, 0x4A, 0x28, 0x28, 0x59, 0x02, 0x09, - 0x01, 0x92, 0x01, 0x54, 0xFE, 0x7E, 0xFE, 0x9C, 0x01, 0x94, 0x19, 0x17, - 0x39, 0x16, 0x46, 0x05, 0x10, 0x30, 0x07, 0x0A, 0x02, 0x05, 0x4C, 0x0B, - 0x6D, 0x36, 0x17, 0x03, 0x04, 0x04, 0x12, 0x4B, 0x3A, 0x46, 0x18, 0x07, - 0xF2, 0x39, 0x09, 0x06, 0x01, 0x0B, 0x09, 0xFE, 0x03, 0x93, 0x93, 0x01, - 0x50, 0x4F, 0x4F, 0x00, 0x00, 0x02, 0x00, 0x16, 0xFF, 0x82, 0x01, 0xCA, - 0x02, 0x49, 0x00, 0x1E, 0x00, 0x22, 0x00, 0x00, 0x25, 0x16, 0x17, 0x0E, - 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x3E, 0x03, 0x37, 0x33, 0x14, - 0x15, 0x14, 0x0E, 0x01, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x36, - 0x03, 0x35, 0x33, 0x15, 0x01, 0xA3, 0x0D, 0x1A, 0x0C, 0x28, 0x73, 0x32, - 0x60, 0x7B, 0x3B, 0x1C, 0x47, 0x1E, 0x1B, 0x02, 0x67, 0x26, 0x3B, 0x1E, - 0x48, 0x20, 0x12, 0x4C, 0x5D, 0x8D, 0x8A, 0x1B, 0x1A, 0x41, 0x07, 0x15, - 0x22, 0x6A, 0x53, 0x54, 0x38, 0x1B, 0x32, 0x1A, 0x33, 0x20, 0x05, 0x05, - 0x34, 0x51, 0x30, 0x15, 0x32, 0x44, 0x30, 0x15, 0x0C, 0x18, 0x01, 0xDA, - 0x6D, 0x6D, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, 0x00, 0x00, 0x02, 0x18, - 0x03, 0x76, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x0F, 0x00, 0x00, 0x23, 0x13, - 0x33, 0x13, 0x23, 0x27, 0x23, 0x07, 0x13, 0x33, 0x03, 0x23, 0x27, 0x37, - 0x05, 0x07, 0x03, 0xC7, 0x8E, 0xC6, 0x79, 0x2C, 0xD0, 0x2D, 0x43, 0xA4, - 0x4F, 0x06, 0x88, 0x1A, 0x01, 0x02, 0x12, 0x02, 0xBB, 0xFD, 0x45, 0xAC, - 0xAC, 0x01, 0x0E, 0x01, 0x46, 0xCA, 0x58, 0x4D, 0x42, 0x00, 0x00, 0x00, - 0x00, 0x03, 0xFF, 0xFD, 0x00, 0x00, 0x02, 0x18, 0x03, 0x77, 0x00, 0x07, - 0x00, 0x0B, 0x00, 0x0F, 0x00, 0x00, 0x23, 0x13, 0x33, 0x13, 0x23, 0x27, - 0x23, 0x07, 0x13, 0x33, 0x03, 0x23, 0x2F, 0x01, 0x25, 0x17, 0x03, 0xC7, - 0x8E, 0xC6, 0x79, 0x2C, 0xD0, 0x2D, 0x43, 0xA4, 0x4F, 0x06, 0x6B, 0x13, - 0x01, 0x00, 0x1C, 0x02, 0xBB, 0xFD, 0x45, 0xAC, 0xAC, 0x01, 0x0E, 0x01, - 0x46, 0x92, 0x42, 0x4F, 0x59, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, - 0x00, 0x00, 0x02, 0x18, 0x03, 0x74, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x14, - 0x00, 0x00, 0x23, 0x13, 0x33, 0x13, 0x23, 0x27, 0x23, 0x07, 0x13, 0x33, - 0x03, 0x23, 0x2F, 0x01, 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, 0x06, 0x03, - 0xC7, 0x8E, 0xC6, 0x79, 0x2C, 0xD0, 0x2D, 0x43, 0xA4, 0x4F, 0x06, 0x8A, - 0x1E, 0x8D, 0x3D, 0x8E, 0x1E, 0x8B, 0x07, 0x08, 0x02, 0xBB, 0xFD, 0x45, - 0xAC, 0xAC, 0x01, 0x0E, 0x01, 0x46, 0x8E, 0x30, 0x62, 0x62, 0x30, 0x3C, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, 0x00, 0x00, 0x02, 0x18, - 0x03, 0x66, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x1B, 0x00, 0x00, 0x23, 0x13, - 0x33, 0x13, 0x23, 0x27, 0x23, 0x07, 0x13, 0x33, 0x03, 0x23, 0x03, 0x32, - 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x22, 0x06, 0x07, - 0x27, 0x34, 0x03, 0xC7, 0x8E, 0xC6, 0x79, 0x2C, 0xD0, 0x2D, 0x43, 0xA4, - 0x4F, 0x06, 0x63, 0x1D, 0xA2, 0x07, 0x0D, 0x10, 0x3F, 0x01, 0x51, 0x1D, - 0xA3, 0x0E, 0x0F, 0x08, 0x3E, 0x02, 0xBB, 0xFD, 0x45, 0xAC, 0xAC, 0x01, - 0x0E, 0x01, 0x46, 0x01, 0x12, 0x2D, 0x2A, 0x09, 0x70, 0x2F, 0x15, 0x16, - 0x08, 0x70, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFD, 0x00, 0x00, 0x02, 0x18, - 0x03, 0x59, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x0F, 0x00, 0x13, 0x00, 0x00, - 0x23, 0x13, 0x33, 0x13, 0x23, 0x27, 0x23, 0x07, 0x13, 0x33, 0x03, 0x23, - 0x27, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x03, 0xC7, 0x8E, 0xC6, - 0x79, 0x2C, 0xD0, 0x2D, 0x43, 0xA4, 0x4F, 0x06, 0xA1, 0x78, 0x5D, 0x78, - 0x02, 0xBB, 0xFD, 0x45, 0xAC, 0xAC, 0x01, 0x0E, 0x01, 0x46, 0xA8, 0x5D, - 0x5D, 0x5D, 0x5D, 0x00, 0x00, 0x04, 0xFF, 0xFD, 0x00, 0x00, 0x02, 0x18, - 0x03, 0x87, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x13, 0x00, 0x1B, 0x00, 0x00, - 0x23, 0x13, 0x33, 0x13, 0x23, 0x27, 0x23, 0x07, 0x13, 0x33, 0x03, 0x23, - 0x2E, 0x01, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x26, 0x06, 0x14, 0x16, - 0x32, 0x36, 0x34, 0x26, 0x03, 0xC7, 0x8E, 0xC6, 0x79, 0x2C, 0xD0, 0x2D, - 0x43, 0xA4, 0x4F, 0x06, 0x24, 0x36, 0x36, 0x51, 0x35, 0x36, 0x3B, 0x11, - 0x11, 0x27, 0x0F, 0x0F, 0x02, 0xBB, 0xFD, 0x45, 0xAC, 0xAC, 0x01, 0x0E, - 0x01, 0x46, 0x83, 0x29, 0x5E, 0x29, 0x29, 0x5E, 0x29, 0x79, 0x0D, 0x28, - 0x0E, 0x0D, 0x29, 0x0D, 0x00, 0x02, 0xFF, 0xF9, 0x00, 0x00, 0x02, 0xEB, - 0x02, 0xBB, 0x00, 0x0F, 0x00, 0x13, 0x00, 0x00, 0x01, 0x15, 0x25, 0x07, - 0x33, 0x15, 0x23, 0x17, 0x25, 0x15, 0x21, 0x35, 0x23, 0x07, 0x23, 0x01, - 0x13, 0x11, 0x23, 0x03, 0x02, 0xEB, 0xFE, 0xFA, 0x04, 0xF2, 0xF2, 0x04, - 0x01, 0x06, 0xFE, 0x87, 0xB7, 0x49, 0x79, 0x01, 0x34, 0x45, 0x12, 0x87, - 0x02, 0xBB, 0x67, 0x03, 0xC3, 0x63, 0xCD, 0x02, 0x66, 0xAB, 0xAB, 0x02, - 0xBB, 0xFE, 0x53, 0x01, 0x42, 0xFE, 0xBE, 0x00, 0x00, 0x01, 0x00, 0x40, - 0xFF, 0x4D, 0x02, 0x2A, 0x02, 0xC8, 0x00, 0x23, 0x00, 0x00, 0x17, 0x16, - 0x32, 0x36, 0x34, 0x27, 0x20, 0x11, 0x34, 0x37, 0x3E, 0x01, 0x32, 0x17, - 0x07, 0x26, 0x22, 0x07, 0x06, 0x15, 0x14, 0x1E, 0x01, 0x32, 0x36, 0x37, - 0x17, 0x06, 0x07, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0xD8, 0x2C, - 0x34, 0x14, 0x07, 0xFE, 0xFB, 0x70, 0x24, 0x4E, 0x99, 0x52, 0x0D, 0x5E, - 0x9F, 0x16, 0x31, 0x22, 0x2F, 0x5B, 0x64, 0x3A, 0x24, 0x3E, 0x5D, 0x0A, - 0x3E, 0x34, 0x1D, 0x32, 0x5E, 0x05, 0x0C, 0x2E, 0x1C, 0x01, 0x63, 0xFD, - 0x4B, 0x18, 0x12, 0x14, 0x62, 0x0E, 0x17, 0x33, 0xC3, 0x5B, 0x79, 0x29, - 0x1C, 0x1B, 0x59, 0x2A, 0x10, 0x28, 0x1C, 0x30, 0x39, 0x09, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x01, 0xDB, 0x03, 0x76, 0x00, 0x0B, - 0x00, 0x0F, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x25, 0x07, 0x33, 0x15, - 0x23, 0x17, 0x25, 0x15, 0x01, 0x37, 0x05, 0x07, 0x61, 0x01, 0x7A, 0xFE, - 0xFB, 0x05, 0xF1, 0xF1, 0x05, 0x01, 0x05, 0xFE, 0xAD, 0x1A, 0x01, 0x03, - 0x13, 0x02, 0xBB, 0x67, 0x03, 0xC3, 0x63, 0xCD, 0x02, 0x66, 0x03, 0x1E, - 0x58, 0x4D, 0x42, 0x00, 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x01, 0xDB, - 0x03, 0x77, 0x00, 0x0B, 0x00, 0x0F, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, - 0x25, 0x07, 0x33, 0x15, 0x23, 0x17, 0x25, 0x15, 0x01, 0x27, 0x25, 0x17, - 0x61, 0x01, 0x7A, 0xFE, 0xFB, 0x05, 0xF1, 0xF1, 0x05, 0x01, 0x05, 0xFE, - 0xCB, 0x13, 0x01, 0x00, 0x1C, 0x02, 0xBB, 0x67, 0x03, 0xC3, 0x63, 0xCD, - 0x02, 0x66, 0x02, 0xE6, 0x42, 0x4F, 0x59, 0x00, 0x00, 0x02, 0x00, 0x61, - 0x00, 0x00, 0x01, 0xDB, 0x03, 0x74, 0x00, 0x0B, 0x00, 0x13, 0x00, 0x00, - 0x33, 0x11, 0x21, 0x15, 0x25, 0x07, 0x33, 0x15, 0x23, 0x17, 0x25, 0x15, - 0x03, 0x07, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x61, 0x01, 0x7A, 0xFE, - 0xFB, 0x05, 0xF1, 0xF1, 0x05, 0x01, 0x05, 0xC3, 0x8B, 0x1E, 0x8E, 0x3D, - 0x8D, 0x1E, 0x8A, 0x02, 0xBB, 0x67, 0x03, 0xC3, 0x63, 0xCD, 0x02, 0x66, - 0x03, 0x1E, 0x3C, 0x30, 0x62, 0x62, 0x30, 0x3C, 0x00, 0x03, 0x00, 0x61, - 0x00, 0x00, 0x01, 0xDB, 0x03, 0x59, 0x00, 0x0B, 0x00, 0x0F, 0x00, 0x13, - 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x25, 0x07, 0x33, 0x15, 0x23, 0x17, - 0x25, 0x15, 0x01, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x61, 0x01, - 0x7A, 0xFE, 0xFB, 0x05, 0xF1, 0xF1, 0x05, 0x01, 0x05, 0xFE, 0x9F, 0x79, - 0x5C, 0x78, 0x02, 0xBB, 0x67, 0x03, 0xC3, 0x63, 0xCD, 0x02, 0x66, 0x02, - 0xFC, 0x5D, 0x5D, 0x5D, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFD, - 0xFF, 0xFF, 0x01, 0x0C, 0x03, 0x76, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, - 0x03, 0x37, 0x17, 0x07, 0x03, 0x07, 0x13, 0x03, 0x33, 0x03, 0x03, 0x1A, - 0xF5, 0x13, 0x22, 0x76, 0x04, 0x04, 0x76, 0x04, 0x03, 0x1D, 0x59, 0x4D, - 0x42, 0xFD, 0x19, 0x01, 0x01, 0x42, 0x01, 0x7A, 0xFE, 0xCA, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x2D, 0xFF, 0xFF, 0x01, 0x3C, 0x03, 0x77, 0x00, 0x03, - 0x00, 0x09, 0x00, 0x00, 0x13, 0x27, 0x37, 0x17, 0x03, 0x07, 0x13, 0x03, - 0x33, 0x03, 0x3F, 0x12, 0xF3, 0x1C, 0x65, 0x76, 0x04, 0x04, 0x76, 0x04, - 0x02, 0xE6, 0x43, 0x4E, 0x5A, 0xFC, 0xE3, 0x01, 0x01, 0x42, 0x01, 0x7A, - 0xFE, 0xCA, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0xFF, 0xFF, 0x01, 0x3C, - 0x03, 0x74, 0x00, 0x07, 0x00, 0x0D, 0x00, 0x00, 0x13, 0x27, 0x37, 0x33, - 0x17, 0x07, 0x27, 0x23, 0x13, 0x07, 0x13, 0x03, 0x33, 0x03, 0x19, 0x1D, - 0x82, 0x3D, 0x81, 0x1D, 0x7F, 0x07, 0x3E, 0x76, 0x04, 0x04, 0x76, 0x04, - 0x02, 0xE5, 0x33, 0x5C, 0x5C, 0x33, 0x39, 0xFC, 0xE2, 0x01, 0x01, 0x42, - 0x01, 0x7A, 0xFE, 0xCA, 0x00, 0x03, 0x00, 0x03, 0xFF, 0xFF, 0x01, 0x36, - 0x03, 0x59, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0D, 0x00, 0x00, 0x13, 0x35, - 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x03, 0x07, 0x13, 0x03, 0x33, 0x03, - 0x03, 0x77, 0x45, 0x77, 0x5F, 0x76, 0x04, 0x04, 0x76, 0x04, 0x02, 0xFC, - 0x5D, 0x5D, 0x5D, 0x5D, 0xFD, 0x04, 0x01, 0x01, 0x42, 0x01, 0x7A, 0xFE, - 0xCA, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2C, 0xFF, 0xF3, 0x02, 0x5B, - 0x02, 0xC8, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x00, 0x13, 0x23, 0x35, 0x33, - 0x11, 0x36, 0x32, 0x1E, 0x01, 0x17, 0x16, 0x15, 0x10, 0x21, 0x22, 0x27, - 0x13, 0x15, 0x16, 0x33, 0x32, 0x37, 0x36, 0x10, 0x27, 0x26, 0x23, 0x07, - 0x15, 0x33, 0x15, 0x6E, 0x42, 0x42, 0x95, 0x8E, 0x60, 0x3A, 0x11, 0x1F, - 0xFE, 0xEB, 0x2F, 0xA9, 0x74, 0x36, 0x2B, 0x4D, 0x19, 0x33, 0x31, 0x15, - 0x43, 0x71, 0x72, 0x01, 0x37, 0x5B, 0x01, 0x29, 0x0D, 0x27, 0x3F, 0x2F, - 0x52, 0x7B, 0xFE, 0x8D, 0x0D, 0x01, 0x37, 0xD8, 0x07, 0x17, 0x31, 0x01, - 0x8A, 0x26, 0x13, 0x07, 0xCA, 0x5B, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, - 0x00, 0x00, 0x02, 0x5B, 0x03, 0x66, 0x00, 0x0B, 0x00, 0x1B, 0x00, 0x00, - 0x33, 0x11, 0x33, 0x13, 0x33, 0x03, 0x33, 0x11, 0x23, 0x03, 0x23, 0x1B, - 0x01, 0x32, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x22, - 0x06, 0x07, 0x27, 0x36, 0x61, 0x99, 0xFB, 0x05, 0x0E, 0x6F, 0x99, 0xFA, - 0x05, 0x0D, 0x2A, 0x1D, 0xA1, 0x07, 0x0D, 0x10, 0x3F, 0x01, 0x51, 0x1D, - 0xA3, 0x0D, 0x0F, 0x08, 0x3F, 0x01, 0x02, 0xBB, 0xFD, 0xCC, 0x02, 0x34, - 0xFD, 0x45, 0x02, 0x33, 0xFD, 0xCD, 0x03, 0x66, 0x2D, 0x2A, 0x09, 0x70, - 0x2F, 0x15, 0x16, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, - 0xFF, 0xF3, 0x02, 0x68, 0x03, 0x76, 0x00, 0x12, 0x00, 0x23, 0x00, 0x27, - 0x00, 0x00, 0x05, 0x22, 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3E, - 0x01, 0x32, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x26, 0x16, 0x32, - 0x37, 0x36, 0x35, 0x34, 0x2E, 0x02, 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x01, - 0x03, 0x37, 0x05, 0x07, 0x01, 0x54, 0x30, 0x4E, 0x48, 0x18, 0x36, 0x52, - 0x28, 0x5D, 0x7A, 0x5D, 0x28, 0x52, 0x72, 0x40, 0xB1, 0x2D, 0x5C, 0x1E, - 0x42, 0x10, 0x29, 0x35, 0x58, 0x34, 0x29, 0x10, 0x0C, 0x16, 0x0D, 0x1A, - 0x01, 0x03, 0x13, 0x0D, 0x13, 0x31, 0x28, 0x57, 0xA9, 0xD5, 0x4E, 0x26, - 0x20, 0x20, 0x26, 0x4E, 0xD5, 0xF3, 0x4E, 0x2B, 0x73, 0x0B, 0x11, 0x25, - 0xCB, 0x54, 0x66, 0x38, 0x12, 0x12, 0x38, 0x66, 0x97, 0x5C, 0x39, 0x02, - 0x9A, 0x58, 0x4D, 0x42, 0x00, 0x03, 0x00, 0x40, 0xFF, 0xF3, 0x02, 0x68, - 0x03, 0x77, 0x00, 0x12, 0x00, 0x23, 0x00, 0x27, 0x00, 0x00, 0x05, 0x22, - 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3E, 0x01, 0x32, 0x16, 0x17, - 0x16, 0x15, 0x14, 0x07, 0x06, 0x26, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, - 0x2E, 0x02, 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x01, 0x13, 0x27, 0x25, 0x17, - 0x01, 0x54, 0x30, 0x4E, 0x48, 0x18, 0x36, 0x52, 0x28, 0x5D, 0x7A, 0x5D, - 0x28, 0x52, 0x72, 0x40, 0xB1, 0x2D, 0x5C, 0x1E, 0x42, 0x10, 0x29, 0x35, - 0x58, 0x34, 0x29, 0x10, 0x0C, 0x16, 0x10, 0x13, 0x01, 0x00, 0x1C, 0x0D, - 0x13, 0x31, 0x28, 0x57, 0xA9, 0xD5, 0x4E, 0x26, 0x20, 0x20, 0x26, 0x4E, - 0xD5, 0xF3, 0x4E, 0x2B, 0x73, 0x0B, 0x11, 0x25, 0xCB, 0x54, 0x66, 0x38, - 0x12, 0x12, 0x38, 0x66, 0x97, 0x5C, 0x39, 0x02, 0x62, 0x42, 0x4F, 0x59, - 0x00, 0x03, 0x00, 0x40, 0xFF, 0xF3, 0x02, 0x68, 0x03, 0x74, 0x00, 0x12, - 0x00, 0x23, 0x00, 0x2B, 0x00, 0x00, 0x05, 0x22, 0x2E, 0x01, 0x27, 0x26, - 0x35, 0x34, 0x37, 0x3E, 0x01, 0x32, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, - 0x06, 0x26, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2E, 0x02, 0x22, 0x0E, - 0x02, 0x14, 0x1E, 0x01, 0x03, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, - 0x01, 0x54, 0x30, 0x4E, 0x48, 0x18, 0x36, 0x52, 0x28, 0x5D, 0x7A, 0x5D, - 0x28, 0x52, 0x72, 0x40, 0xB1, 0x2D, 0x5C, 0x1E, 0x42, 0x10, 0x29, 0x35, - 0x58, 0x34, 0x29, 0x10, 0x0C, 0x16, 0x13, 0x1F, 0x8E, 0x3D, 0x8E, 0x1E, - 0x8B, 0x07, 0x0D, 0x13, 0x31, 0x28, 0x57, 0xA9, 0xD5, 0x4E, 0x26, 0x20, - 0x20, 0x26, 0x4E, 0xD5, 0xF3, 0x4E, 0x2B, 0x73, 0x0B, 0x11, 0x25, 0xCB, - 0x54, 0x66, 0x38, 0x12, 0x12, 0x38, 0x66, 0x97, 0x5C, 0x39, 0x02, 0x5E, - 0x30, 0x62, 0x62, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, - 0xFF, 0xF3, 0x02, 0x68, 0x03, 0x66, 0x00, 0x12, 0x00, 0x23, 0x00, 0x33, - 0x00, 0x00, 0x05, 0x22, 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3E, - 0x01, 0x32, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x26, 0x16, 0x32, - 0x37, 0x36, 0x35, 0x34, 0x2E, 0x02, 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x01, - 0x13, 0x32, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x22, - 0x06, 0x07, 0x27, 0x36, 0x01, 0x54, 0x30, 0x4E, 0x48, 0x18, 0x36, 0x52, - 0x28, 0x5D, 0x7A, 0x5D, 0x28, 0x52, 0x72, 0x40, 0xB1, 0x2D, 0x5C, 0x1E, - 0x42, 0x10, 0x29, 0x35, 0x58, 0x34, 0x29, 0x10, 0x0C, 0x16, 0x11, 0x1E, - 0xA0, 0x08, 0x0D, 0x10, 0x3F, 0x01, 0x51, 0x1D, 0xA3, 0x0E, 0x0F, 0x08, - 0x3F, 0x01, 0x0D, 0x13, 0x31, 0x28, 0x57, 0xA9, 0xD5, 0x4E, 0x26, 0x20, - 0x20, 0x26, 0x4E, 0xD5, 0xF3, 0x4E, 0x2B, 0x73, 0x0B, 0x11, 0x25, 0xCB, - 0x54, 0x66, 0x38, 0x12, 0x12, 0x38, 0x66, 0x97, 0x5C, 0x39, 0x02, 0xE2, - 0x2D, 0x2A, 0x09, 0x70, 0x2F, 0x15, 0x16, 0x08, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x40, 0xFF, 0xF3, 0x02, 0x68, 0x03, 0x59, 0x00, 0x12, - 0x00, 0x23, 0x00, 0x27, 0x00, 0x2B, 0x00, 0x00, 0x05, 0x22, 0x2E, 0x01, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x3E, 0x01, 0x32, 0x16, 0x17, 0x16, 0x15, - 0x14, 0x07, 0x06, 0x26, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2E, 0x02, - 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x01, 0x03, 0x35, 0x33, 0x15, 0x33, 0x35, - 0x33, 0x15, 0x01, 0x54, 0x30, 0x4E, 0x48, 0x18, 0x36, 0x52, 0x28, 0x5D, - 0x7A, 0x5D, 0x28, 0x52, 0x72, 0x40, 0xB1, 0x2D, 0x5C, 0x1E, 0x42, 0x10, - 0x29, 0x35, 0x58, 0x34, 0x29, 0x10, 0x0C, 0x16, 0x2D, 0x79, 0x5C, 0x78, - 0x0D, 0x13, 0x31, 0x28, 0x57, 0xA9, 0xD5, 0x4E, 0x26, 0x20, 0x20, 0x26, - 0x4E, 0xD5, 0xF3, 0x4E, 0x2B, 0x73, 0x0B, 0x11, 0x25, 0xCB, 0x54, 0x66, - 0x38, 0x12, 0x12, 0x38, 0x66, 0x97, 0x5C, 0x39, 0x02, 0x78, 0x5D, 0x5D, - 0x5D, 0x5D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2F, 0x00, 0x30, 0x02, 0x1C, - 0x02, 0x1E, 0x00, 0x0B, 0x00, 0x00, 0x37, 0x27, 0x37, 0x27, 0x37, 0x17, - 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x75, 0x46, 0xB0, 0xAF, 0x45, 0xAF, - 0xB2, 0x46, 0xB1, 0xAF, 0x45, 0xAF, 0x30, 0x47, 0xB0, 0xAF, 0x46, 0xB0, - 0xB2, 0x47, 0xB1, 0xAF, 0x46, 0xAF, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, - 0xFF, 0xD9, 0x02, 0x68, 0x02, 0xD9, 0x00, 0x14, 0x00, 0x1D, 0x00, 0x26, - 0x00, 0x00, 0x13, 0x3E, 0x01, 0x32, 0x17, 0x37, 0x33, 0x07, 0x16, 0x15, - 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x07, 0x23, 0x37, 0x26, 0x10, 0x13, - 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x07, 0x13, 0x26, 0x22, 0x07, - 0x06, 0x15, 0x14, 0x17, 0x37, 0x92, 0x28, 0x5D, 0x7D, 0x32, 0x10, 0x60, - 0x27, 0x59, 0x72, 0x40, 0x62, 0x41, 0x2F, 0x14, 0x61, 0x2B, 0x5A, 0xCF, - 0x1E, 0x61, 0x1E, 0x42, 0x16, 0x61, 0x24, 0x1A, 0x67, 0x1E, 0x41, 0x17, - 0x4F, 0x02, 0x82, 0x26, 0x20, 0x14, 0x25, 0x52, 0x54, 0xD4, 0xF3, 0x4E, - 0x2B, 0x12, 0x2C, 0x58, 0x57, 0x01, 0xAC, 0xFE, 0x30, 0x09, 0x11, 0x25, - 0xCB, 0x80, 0x38, 0xCC, 0x01, 0x0D, 0x0B, 0x12, 0x25, 0xCD, 0x7E, 0x39, - 0xA2, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, 0xFF, 0xF3, 0x02, 0x4B, - 0x03, 0x76, 0x00, 0x14, 0x00, 0x18, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, - 0x14, 0x1E, 0x01, 0x3E, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x0E, - 0x01, 0x23, 0x22, 0x26, 0x13, 0x37, 0x05, 0x07, 0x61, 0x75, 0x17, 0x32, - 0x6F, 0x31, 0x17, 0x75, 0x40, 0x21, 0x56, 0x3E, 0x7C, 0x79, 0x58, 0x1A, - 0x01, 0x03, 0x13, 0x01, 0x31, 0x01, 0x8A, 0xFE, 0x91, 0x6D, 0x65, 0x20, - 0x01, 0x1F, 0x64, 0x6E, 0x01, 0x6F, 0xFE, 0x7F, 0xBE, 0x46, 0x25, 0x1E, - 0x8C, 0x02, 0x9F, 0x58, 0x4D, 0x42, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, - 0xFF, 0xF3, 0x02, 0x4B, 0x03, 0x77, 0x00, 0x14, 0x00, 0x18, 0x00, 0x00, - 0x13, 0x11, 0x33, 0x11, 0x14, 0x1E, 0x01, 0x3E, 0x02, 0x35, 0x11, 0x33, - 0x11, 0x14, 0x07, 0x0E, 0x01, 0x23, 0x22, 0x26, 0x13, 0x27, 0x25, 0x17, - 0x61, 0x75, 0x17, 0x32, 0x6F, 0x31, 0x17, 0x75, 0x40, 0x21, 0x56, 0x3E, - 0x7C, 0x79, 0x8A, 0x12, 0x01, 0x00, 0x1C, 0x01, 0x31, 0x01, 0x8A, 0xFE, - 0x91, 0x6D, 0x65, 0x20, 0x01, 0x1F, 0x64, 0x6E, 0x01, 0x6F, 0xFE, 0x7F, - 0xBE, 0x46, 0x25, 0x1E, 0x8C, 0x02, 0x67, 0x42, 0x4F, 0x59, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x61, 0xFF, 0xF3, 0x02, 0x4B, 0x03, 0x74, 0x00, 0x14, - 0x00, 0x1C, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x1E, 0x01, 0x3E, - 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x0E, 0x01, 0x23, 0x22, 0x26, - 0x13, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, 0x61, 0x75, 0x17, 0x32, - 0x6F, 0x31, 0x17, 0x75, 0x40, 0x21, 0x56, 0x3E, 0x7C, 0x79, 0x68, 0x1F, - 0x8E, 0x3D, 0x8E, 0x1F, 0x8A, 0x07, 0x01, 0x31, 0x01, 0x8A, 0xFE, 0x91, - 0x6D, 0x65, 0x20, 0x01, 0x1F, 0x64, 0x6E, 0x01, 0x6F, 0xFE, 0x7F, 0xBE, - 0x46, 0x25, 0x1E, 0x8C, 0x02, 0x63, 0x30, 0x62, 0x62, 0x30, 0x3C, 0x00, - 0x00, 0x03, 0x00, 0x61, 0xFF, 0xF3, 0x02, 0x4B, 0x03, 0x58, 0x00, 0x14, - 0x00, 0x18, 0x00, 0x1C, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x1E, - 0x01, 0x3E, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x0E, 0x01, 0x23, - 0x22, 0x26, 0x13, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x61, 0x75, - 0x17, 0x32, 0x6F, 0x31, 0x17, 0x75, 0x40, 0x21, 0x56, 0x3E, 0x7C, 0x79, - 0x4F, 0x78, 0x5D, 0x78, 0x01, 0x31, 0x01, 0x8A, 0xFE, 0x91, 0x6D, 0x65, - 0x20, 0x01, 0x1F, 0x64, 0x6E, 0x01, 0x6F, 0xFE, 0x7F, 0xBE, 0x46, 0x25, - 0x1E, 0x8C, 0x02, 0x7B, 0x5E, 0x5E, 0x5E, 0x5E, 0x00, 0x02, 0x00, 0x03, - 0x00, 0x00, 0x02, 0x19, 0x03, 0x77, 0x00, 0x09, 0x00, 0x0D, 0x00, 0x00, - 0x33, 0x13, 0x03, 0x33, 0x13, 0x33, 0x13, 0x33, 0x03, 0x13, 0x03, 0x27, - 0x25, 0x17, 0xD2, 0x03, 0xD2, 0x7F, 0x89, 0x05, 0x8A, 0x7F, 0xD2, 0x02, - 0xA1, 0x12, 0x01, 0x00, 0x1C, 0x01, 0x00, 0x01, 0xBB, 0xFE, 0xA5, 0x01, - 0x5B, 0xFE, 0x45, 0xFF, 0x00, 0x02, 0xE6, 0x42, 0x4F, 0x59, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x5F, 0x00, 0x00, 0x02, 0x30, 0x02, 0xBB, 0x00, 0x0F, - 0x00, 0x18, 0x00, 0x00, 0x13, 0x03, 0x33, 0x15, 0x36, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x07, 0x06, 0x23, 0x27, 0x15, 0x23, 0x37, 0x16, 0x32, 0x36, - 0x34, 0x27, 0x26, 0x22, 0x07, 0x63, 0x04, 0x75, 0x56, 0x32, 0x66, 0x6E, - 0x4A, 0x41, 0x60, 0x71, 0x75, 0x74, 0x3F, 0x83, 0x22, 0x1F, 0x12, 0x7D, - 0x36, 0x01, 0x57, 0x01, 0x64, 0x58, 0x06, 0x79, 0x76, 0x8F, 0x39, 0x31, - 0x05, 0x86, 0xEE, 0x0A, 0x3A, 0xCC, 0x13, 0x0F, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x61, 0xFF, 0xF3, 0x02, 0x3D, 0x02, 0xC8, 0x00, 0x23, - 0x00, 0x00, 0x33, 0x11, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, - 0x15, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, 0x32, 0x36, - 0x34, 0x26, 0x2B, 0x01, 0x35, 0x3E, 0x01, 0x35, 0x34, 0x23, 0x22, 0x06, - 0x15, 0x11, 0x61, 0x7E, 0xB9, 0x81, 0x38, 0x22, 0x7E, 0x76, 0x5C, 0x24, - 0x2C, 0x0C, 0x18, 0x57, 0x2D, 0x38, 0x41, 0x17, 0x40, 0x33, 0x69, 0x36, - 0x31, 0x01, 0xDA, 0x77, 0x77, 0x63, 0x5A, 0x3F, 0x49, 0x0C, 0x06, 0x1F, - 0x8B, 0x67, 0x6D, 0x08, 0x59, 0x04, 0x36, 0x82, 0x3B, 0x56, 0x05, 0x31, - 0x37, 0x68, 0x43, 0x4B, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, - 0xFF, 0xF3, 0x01, 0xF5, 0x03, 0x2D, 0x00, 0x19, 0x00, 0x23, 0x00, 0x27, - 0x00, 0x00, 0x17, 0x22, 0x26, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x22, - 0x06, 0x07, 0x27, 0x3E, 0x02, 0x33, 0x32, 0x15, 0x11, 0x23, 0x27, 0x23, - 0x0E, 0x02, 0x13, 0x26, 0x22, 0x07, 0x06, 0x14, 0x16, 0x32, 0x36, 0x37, - 0x03, 0x37, 0x05, 0x07, 0xD8, 0x4D, 0x5D, 0x7D, 0x76, 0x60, 0x1F, 0x5A, - 0x6F, 0x3E, 0x1F, 0x0E, 0x2F, 0x80, 0x35, 0xC7, 0x4A, 0x10, 0x05, 0x0B, - 0x25, 0x65, 0x80, 0x29, 0x8C, 0x11, 0x16, 0x1D, 0x41, 0x4F, 0x2F, 0xEE, - 0x20, 0x01, 0x06, 0x16, 0x0D, 0x61, 0xC1, 0x58, 0x01, 0x61, 0x29, 0x16, - 0x17, 0x55, 0x06, 0x13, 0x1F, 0xD8, 0xFE, 0x82, 0x3F, 0x09, 0x19, 0x2A, - 0x01, 0x1B, 0x06, 0x11, 0x14, 0x71, 0x29, 0x17, 0x16, 0x02, 0x4F, 0x5C, - 0x5D, 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2E, 0xFF, 0xF3, 0x01, 0xF5, - 0x03, 0x2D, 0x00, 0x19, 0x00, 0x23, 0x00, 0x27, 0x00, 0x00, 0x17, 0x22, - 0x26, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x22, 0x06, 0x07, 0x27, 0x3E, - 0x02, 0x33, 0x32, 0x15, 0x11, 0x23, 0x27, 0x23, 0x0E, 0x02, 0x13, 0x26, - 0x22, 0x07, 0x06, 0x14, 0x16, 0x32, 0x36, 0x37, 0x03, 0x27, 0x25, 0x17, - 0xD8, 0x4D, 0x5D, 0x7D, 0x76, 0x60, 0x1F, 0x5A, 0x6F, 0x3E, 0x1F, 0x0E, - 0x2F, 0x80, 0x35, 0xC7, 0x4A, 0x10, 0x05, 0x0B, 0x25, 0x65, 0x80, 0x29, - 0x8C, 0x11, 0x16, 0x1D, 0x41, 0x4F, 0x2F, 0xD8, 0x16, 0x01, 0x06, 0x20, - 0x0D, 0x61, 0xC1, 0x58, 0x01, 0x61, 0x29, 0x16, 0x17, 0x55, 0x06, 0x13, - 0x1F, 0xD8, 0xFE, 0x82, 0x3F, 0x09, 0x19, 0x2A, 0x01, 0x1B, 0x06, 0x11, - 0x14, 0x71, 0x29, 0x17, 0x16, 0x02, 0x0A, 0x44, 0x5D, 0x5C, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x2E, 0xFF, 0xF3, 0x01, 0xF5, 0x03, 0x24, 0x00, 0x19, - 0x00, 0x23, 0x00, 0x2B, 0x00, 0x00, 0x17, 0x22, 0x26, 0x34, 0x36, 0x33, - 0x17, 0x34, 0x26, 0x22, 0x06, 0x07, 0x27, 0x3E, 0x02, 0x33, 0x32, 0x15, - 0x11, 0x23, 0x27, 0x23, 0x0E, 0x02, 0x13, 0x26, 0x22, 0x07, 0x06, 0x14, - 0x16, 0x32, 0x36, 0x37, 0x03, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, - 0xD8, 0x4D, 0x5D, 0x7D, 0x76, 0x60, 0x1F, 0x5A, 0x6F, 0x3E, 0x1F, 0x0E, - 0x2F, 0x80, 0x35, 0xC7, 0x4A, 0x10, 0x05, 0x0B, 0x25, 0x65, 0x80, 0x29, - 0x8C, 0x11, 0x16, 0x1D, 0x41, 0x4F, 0x2F, 0xEB, 0x21, 0x92, 0x3D, 0x93, - 0x23, 0x8B, 0x07, 0x0D, 0x61, 0xC1, 0x58, 0x01, 0x61, 0x29, 0x16, 0x17, - 0x55, 0x06, 0x13, 0x1F, 0xD8, 0xFE, 0x82, 0x3F, 0x09, 0x19, 0x2A, 0x01, - 0x1B, 0x06, 0x11, 0x14, 0x71, 0x29, 0x17, 0x16, 0x02, 0x05, 0x32, 0x6B, - 0x6B, 0x32, 0x45, 0x00, 0x00, 0x03, 0x00, 0x2E, 0xFF, 0xF3, 0x01, 0xF5, - 0x03, 0x12, 0x00, 0x19, 0x00, 0x23, 0x00, 0x33, 0x00, 0x00, 0x17, 0x22, - 0x26, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x22, 0x06, 0x07, 0x27, 0x3E, - 0x02, 0x33, 0x32, 0x15, 0x11, 0x23, 0x27, 0x23, 0x0E, 0x02, 0x13, 0x26, - 0x22, 0x07, 0x06, 0x14, 0x16, 0x32, 0x36, 0x37, 0x03, 0x32, 0x16, 0x33, - 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, - 0xD8, 0x4D, 0x5D, 0x7D, 0x76, 0x60, 0x1F, 0x5A, 0x6F, 0x3E, 0x1F, 0x0E, - 0x2F, 0x80, 0x35, 0xC7, 0x4A, 0x10, 0x05, 0x0B, 0x25, 0x65, 0x80, 0x29, - 0x8C, 0x11, 0x16, 0x1D, 0x41, 0x4F, 0x2F, 0xC2, 0x1E, 0xA1, 0x07, 0x0D, - 0x10, 0x3F, 0x01, 0x51, 0x1D, 0xA3, 0x07, 0x0E, 0x10, 0x3F, 0x01, 0x0D, - 0x61, 0xC1, 0x58, 0x01, 0x61, 0x29, 0x16, 0x17, 0x55, 0x06, 0x13, 0x1F, - 0xD8, 0xFE, 0x82, 0x3F, 0x09, 0x19, 0x2A, 0x01, 0x1B, 0x06, 0x11, 0x14, - 0x71, 0x29, 0x17, 0x16, 0x02, 0x90, 0x2B, 0x2A, 0x09, 0x73, 0x2D, 0x2B, - 0x08, 0x73, 0x00, 0x00, 0x00, 0x04, 0x00, 0x2E, 0xFF, 0xF3, 0x01, 0xF5, - 0x03, 0x02, 0x00, 0x19, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2B, 0x00, 0x00, - 0x17, 0x22, 0x26, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x22, 0x06, 0x07, - 0x27, 0x3E, 0x02, 0x33, 0x32, 0x15, 0x11, 0x23, 0x27, 0x23, 0x0E, 0x02, - 0x13, 0x26, 0x22, 0x07, 0x06, 0x14, 0x16, 0x32, 0x36, 0x37, 0x01, 0x35, - 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0xD8, 0x4D, 0x5D, 0x7D, 0x76, 0x60, - 0x1F, 0x5A, 0x6F, 0x3E, 0x1F, 0x0E, 0x2F, 0x80, 0x35, 0xC7, 0x4A, 0x10, - 0x05, 0x0B, 0x25, 0x65, 0x80, 0x29, 0x8C, 0x11, 0x16, 0x1D, 0x41, 0x4F, - 0x2F, 0xFE, 0xFE, 0x7C, 0x57, 0x7B, 0x0D, 0x61, 0xC1, 0x58, 0x01, 0x61, - 0x29, 0x16, 0x17, 0x55, 0x06, 0x13, 0x1F, 0xD8, 0xFE, 0x82, 0x3F, 0x09, - 0x19, 0x2A, 0x01, 0x1B, 0x06, 0x11, 0x14, 0x71, 0x29, 0x17, 0x16, 0x02, - 0x23, 0x5D, 0x5D, 0x5D, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x2E, - 0xFF, 0xF3, 0x01, 0xF5, 0x03, 0x35, 0x00, 0x19, 0x00, 0x23, 0x00, 0x2B, - 0x00, 0x33, 0x00, 0x00, 0x17, 0x22, 0x26, 0x34, 0x36, 0x33, 0x17, 0x34, - 0x26, 0x22, 0x06, 0x07, 0x27, 0x3E, 0x02, 0x33, 0x32, 0x15, 0x11, 0x23, - 0x27, 0x23, 0x0E, 0x02, 0x13, 0x26, 0x22, 0x07, 0x06, 0x14, 0x16, 0x32, - 0x36, 0x37, 0x03, 0x34, 0x32, 0x15, 0x14, 0x06, 0x22, 0x26, 0x36, 0x06, - 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0xD8, 0x4D, 0x5D, 0x7D, 0x76, 0x60, - 0x1F, 0x5A, 0x6F, 0x3E, 0x1F, 0x0E, 0x2F, 0x80, 0x35, 0xC7, 0x4A, 0x10, - 0x05, 0x0B, 0x25, 0x65, 0x80, 0x29, 0x8C, 0x11, 0x16, 0x1D, 0x41, 0x4F, - 0x2F, 0xC5, 0xBB, 0x35, 0x50, 0x36, 0x49, 0x11, 0x12, 0x27, 0x11, 0x10, - 0x0D, 0x61, 0xC1, 0x58, 0x01, 0x61, 0x29, 0x16, 0x17, 0x55, 0x06, 0x13, - 0x1F, 0xD8, 0xFE, 0x82, 0x3F, 0x09, 0x19, 0x2A, 0x01, 0x1B, 0x06, 0x11, - 0x14, 0x71, 0x29, 0x17, 0x16, 0x02, 0x59, 0x5A, 0x5A, 0x30, 0x29, 0x29, - 0x55, 0x0F, 0x2B, 0x10, 0x10, 0x2B, 0x0F, 0x00, 0x00, 0x03, 0x00, 0x39, - 0xFF, 0xF3, 0x03, 0x5D, 0x02, 0x56, 0x00, 0x28, 0x00, 0x32, 0x00, 0x3A, - 0x00, 0x00, 0x17, 0x22, 0x26, 0x34, 0x36, 0x3B, 0x01, 0x34, 0x26, 0x22, - 0x06, 0x07, 0x27, 0x3E, 0x01, 0x33, 0x32, 0x17, 0x33, 0x36, 0x32, 0x16, - 0x1D, 0x01, 0x21, 0x14, 0x17, 0x1E, 0x01, 0x32, 0x36, 0x37, 0x17, 0x0E, - 0x01, 0x23, 0x22, 0x27, 0x23, 0x0E, 0x01, 0x13, 0x26, 0x22, 0x06, 0x14, - 0x16, 0x33, 0x32, 0x3F, 0x01, 0x13, 0x22, 0x06, 0x07, 0x37, 0x34, 0x27, - 0x26, 0xE1, 0x4D, 0x5B, 0x81, 0x76, 0x5C, 0x1E, 0x5D, 0x6C, 0x3F, 0x1F, - 0x2C, 0x8A, 0x33, 0x71, 0x32, 0x04, 0x3C, 0xDC, 0x6E, 0xFE, 0xA5, 0x1F, - 0x11, 0x23, 0x41, 0x5F, 0x3E, 0x1D, 0x2A, 0x75, 0x30, 0x84, 0x3B, 0x04, - 0x2F, 0x80, 0x7D, 0x26, 0x8A, 0x2C, 0x22, 0x22, 0x3E, 0x44, 0x16, 0xF7, - 0x4F, 0x30, 0x02, 0xE5, 0x15, 0x1C, 0x0D, 0x61, 0xBC, 0x52, 0x68, 0x2C, - 0x16, 0x17, 0x56, 0x14, 0x23, 0x40, 0x40, 0x7D, 0x91, 0x46, 0x78, 0x1E, - 0x11, 0x09, 0x14, 0x15, 0x58, 0x13, 0x1D, 0x54, 0x26, 0x2E, 0x01, 0x11, - 0x06, 0x20, 0x6C, 0x29, 0x21, 0x0B, 0x01, 0x76, 0x46, 0x58, 0x04, 0x6E, - 0x13, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0xFF, 0x4D, 0x01, 0xF5, - 0x02, 0x56, 0x00, 0x23, 0x00, 0x00, 0x17, 0x16, 0x32, 0x36, 0x34, 0x27, - 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x22, - 0x07, 0x06, 0x10, 0x17, 0x16, 0x32, 0x36, 0x37, 0x17, 0x06, 0x07, 0x16, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0xC9, 0x2D, 0x33, 0x15, 0x07, 0x73, - 0x86, 0x50, 0x48, 0x76, 0x4E, 0x4C, 0x0D, 0x6D, 0x74, 0x18, 0x2A, 0x39, - 0x15, 0x43, 0x56, 0x36, 0x22, 0x2D, 0x48, 0x0B, 0x3E, 0x34, 0x1E, 0x32, - 0x5E, 0x05, 0x0C, 0x2E, 0x1C, 0x94, 0x9F, 0xAE, 0x45, 0x3D, 0x13, 0x5B, - 0x0E, 0x18, 0x2D, 0xFE, 0xDA, 0x2A, 0x0F, 0x18, 0x17, 0x55, 0x21, 0x10, - 0x2A, 0x1B, 0x30, 0x39, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, - 0xFF, 0xF3, 0x02, 0x14, 0x03, 0x2D, 0x00, 0x11, 0x00, 0x21, 0x00, 0x25, - 0x00, 0x00, 0x05, 0x22, 0x10, 0x33, 0x32, 0x16, 0x1D, 0x01, 0x21, 0x14, - 0x17, 0x16, 0x33, 0x32, 0x3F, 0x01, 0x17, 0x06, 0x03, 0x34, 0x2E, 0x05, - 0x27, 0x26, 0x22, 0x0E, 0x02, 0x07, 0x37, 0x01, 0x37, 0x05, 0x07, 0x01, - 0x38, 0xFA, 0xF8, 0x6F, 0x6F, 0xFE, 0xA3, 0x26, 0x19, 0x2A, 0x51, 0x5A, - 0x1F, 0x1C, 0x62, 0x06, 0x02, 0x02, 0x05, 0x07, 0x0B, 0x0E, 0x09, 0x0E, - 0x4F, 0x33, 0x1B, 0x08, 0x01, 0xE6, 0xFE, 0xF6, 0x20, 0x01, 0x06, 0x16, - 0x0D, 0x02, 0x63, 0x80, 0x94, 0x48, 0x6F, 0x23, 0x16, 0x1E, 0x0B, 0x58, - 0x30, 0x01, 0x81, 0x06, 0x29, 0x09, 0x1F, 0x07, 0x14, 0x05, 0x05, 0x07, - 0x12, 0x2E, 0x36, 0x30, 0x05, 0x01, 0x7B, 0x5C, 0x5D, 0x44, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x14, 0x03, 0x2D, 0x00, 0x11, - 0x00, 0x21, 0x00, 0x25, 0x00, 0x00, 0x05, 0x22, 0x10, 0x33, 0x32, 0x16, - 0x1D, 0x01, 0x21, 0x14, 0x17, 0x16, 0x33, 0x32, 0x3F, 0x01, 0x17, 0x06, - 0x03, 0x34, 0x2E, 0x05, 0x27, 0x26, 0x22, 0x0E, 0x02, 0x07, 0x37, 0x03, - 0x27, 0x25, 0x17, 0x01, 0x38, 0xFA, 0xF8, 0x6F, 0x6F, 0xFE, 0xA3, 0x26, - 0x19, 0x2A, 0x51, 0x5A, 0x1F, 0x1C, 0x62, 0x06, 0x02, 0x02, 0x05, 0x07, - 0x0B, 0x0E, 0x09, 0x0E, 0x4F, 0x33, 0x1B, 0x08, 0x01, 0xE6, 0xF4, 0x16, - 0x01, 0x06, 0x20, 0x0D, 0x02, 0x63, 0x80, 0x94, 0x48, 0x6F, 0x23, 0x16, - 0x1E, 0x0B, 0x58, 0x30, 0x01, 0x81, 0x06, 0x29, 0x09, 0x1F, 0x07, 0x14, - 0x05, 0x05, 0x07, 0x12, 0x2E, 0x36, 0x30, 0x05, 0x01, 0x36, 0x44, 0x5D, - 0x5C, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x14, - 0x03, 0x24, 0x00, 0x11, 0x00, 0x21, 0x00, 0x29, 0x00, 0x00, 0x05, 0x22, - 0x10, 0x33, 0x32, 0x16, 0x1D, 0x01, 0x21, 0x14, 0x17, 0x16, 0x33, 0x32, - 0x3F, 0x01, 0x17, 0x06, 0x03, 0x34, 0x2E, 0x05, 0x27, 0x26, 0x22, 0x0E, - 0x02, 0x07, 0x37, 0x01, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, 0x01, - 0x38, 0xFA, 0xF8, 0x6F, 0x6F, 0xFE, 0xA3, 0x26, 0x19, 0x2A, 0x51, 0x5A, - 0x1F, 0x1C, 0x62, 0x06, 0x02, 0x02, 0x05, 0x07, 0x0B, 0x0E, 0x09, 0x0E, - 0x4F, 0x33, 0x1B, 0x08, 0x01, 0xE6, 0xFE, 0xF8, 0x21, 0x92, 0x3D, 0x93, - 0x23, 0x8B, 0x07, 0x0D, 0x02, 0x63, 0x80, 0x94, 0x48, 0x6F, 0x23, 0x16, - 0x1E, 0x0B, 0x58, 0x30, 0x01, 0x81, 0x06, 0x29, 0x09, 0x1F, 0x07, 0x14, - 0x05, 0x05, 0x07, 0x12, 0x2E, 0x36, 0x30, 0x05, 0x01, 0x31, 0x32, 0x6B, - 0x6B, 0x32, 0x45, 0x00, 0x00, 0x04, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x14, - 0x03, 0x02, 0x00, 0x11, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, 0x00, 0x00, - 0x05, 0x22, 0x10, 0x33, 0x32, 0x16, 0x1D, 0x01, 0x21, 0x14, 0x17, 0x16, - 0x33, 0x32, 0x3F, 0x01, 0x17, 0x06, 0x03, 0x34, 0x2E, 0x05, 0x27, 0x26, - 0x22, 0x0E, 0x02, 0x07, 0x37, 0x01, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, - 0x15, 0x01, 0x38, 0xFA, 0xF8, 0x6F, 0x6F, 0xFE, 0xA3, 0x26, 0x19, 0x2A, - 0x51, 0x5A, 0x1F, 0x1C, 0x62, 0x06, 0x02, 0x02, 0x05, 0x07, 0x0B, 0x0E, - 0x09, 0x0E, 0x4F, 0x33, 0x1B, 0x08, 0x01, 0xE6, 0xFE, 0xE1, 0x7C, 0x57, - 0x7B, 0x0D, 0x02, 0x63, 0x80, 0x94, 0x48, 0x6F, 0x23, 0x16, 0x1E, 0x0B, - 0x58, 0x30, 0x01, 0x81, 0x06, 0x29, 0x09, 0x1F, 0x07, 0x14, 0x05, 0x05, - 0x07, 0x12, 0x2E, 0x36, 0x30, 0x05, 0x01, 0x4F, 0x5D, 0x5D, 0x5D, 0x5D, - 0x00, 0x02, 0xFF, 0xF7, 0x00, 0x00, 0x01, 0x13, 0x03, 0x2D, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x00, 0x03, 0x37, 0x17, 0x07, 0x03, 0x11, 0x33, 0x11, - 0x09, 0x20, 0xFC, 0x16, 0x9C, 0x74, 0x02, 0xD0, 0x5D, 0x5D, 0x44, 0xFD, - 0x74, 0x02, 0x49, 0xFD, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, - 0x00, 0x00, 0x01, 0x32, 0x03, 0x2D, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, - 0x13, 0x27, 0x37, 0x17, 0x03, 0x11, 0x33, 0x11, 0x2C, 0x16, 0xFC, 0x20, - 0xD1, 0x74, 0x02, 0x8C, 0x44, 0x5D, 0x5D, 0xFD, 0x30, 0x02, 0x49, 0xFD, - 0xB7, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF3, 0x00, 0x00, 0x01, 0x43, - 0x03, 0x24, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x00, 0x13, 0x27, 0x37, 0x33, - 0x17, 0x07, 0x27, 0x23, 0x03, 0x11, 0x33, 0x11, 0x14, 0x21, 0x89, 0x3D, - 0x8A, 0x23, 0x82, 0x07, 0x36, 0x74, 0x02, 0x89, 0x33, 0x68, 0x68, 0x33, - 0x43, 0xFD, 0x34, 0x02, 0x49, 0xFD, 0xB7, 0x00, 0x00, 0x03, 0x00, 0x01, - 0x00, 0x00, 0x01, 0x34, 0x03, 0x02, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0B, - 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x03, 0x11, - 0x33, 0x11, 0x01, 0x79, 0x42, 0x78, 0xD3, 0x74, 0x02, 0xA5, 0x5D, 0x5D, - 0x5D, 0x5D, 0xFD, 0x5B, 0x02, 0x49, 0xFD, 0xB7, 0x00, 0x02, 0x00, 0x41, - 0xFF, 0xF3, 0x02, 0x19, 0x03, 0x02, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x00, - 0x01, 0x27, 0x37, 0x16, 0x17, 0x37, 0x17, 0x07, 0x16, 0x17, 0x14, 0x07, - 0x0E, 0x01, 0x23, 0x22, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x26, - 0x27, 0x07, 0x27, 0x02, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, 0x01, - 0x26, 0x3E, 0x3C, 0x34, 0x2C, 0x67, 0x07, 0x39, 0x5B, 0x05, 0x01, 0x05, - 0x6D, 0x7A, 0xEB, 0x6C, 0x76, 0x4D, 0x3C, 0x05, 0x15, 0x3C, 0x6F, 0x08, - 0x33, 0x32, 0x8B, 0x30, 0x32, 0x87, 0x34, 0x02, 0x94, 0x2E, 0x40, 0x1C, - 0x23, 0x37, 0x51, 0x1E, 0x6A, 0xDA, 0x26, 0x12, 0x8B, 0x91, 0x01, 0x17, - 0x75, 0x8A, 0x29, 0x03, 0x40, 0x3C, 0x36, 0x4F, 0xFE, 0x22, 0x4B, 0x4B, - 0xCF, 0x43, 0x43, 0x00, 0x00, 0x02, 0x00, 0x5D, 0x00, 0x00, 0x02, 0x1C, - 0x03, 0x12, 0x00, 0x11, 0x00, 0x21, 0x00, 0x00, 0x33, 0x11, 0x33, 0x17, - 0x33, 0x36, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x22, 0x06, - 0x07, 0x11, 0x03, 0x32, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, - 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x5D, 0x4C, 0x0D, 0x05, 0x7B, 0xA9, - 0x3D, 0x74, 0x17, 0x4E, 0x59, 0x19, 0x02, 0x1D, 0xA2, 0x07, 0x0D, 0x10, - 0x3F, 0x01, 0x51, 0x1D, 0xA3, 0x07, 0x0E, 0x10, 0x3F, 0x01, 0x02, 0x49, - 0x3A, 0x47, 0x6E, 0x66, 0xFE, 0x7E, 0x01, 0x65, 0x59, 0x2F, 0x20, 0x10, - 0xFE, 0x43, 0x03, 0x12, 0x2B, 0x2A, 0x09, 0x73, 0x2D, 0x2B, 0x08, 0x73, - 0x00, 0x03, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x18, 0x03, 0x2D, 0x00, 0x07, - 0x00, 0x0F, 0x00, 0x13, 0x00, 0x00, 0x24, 0x06, 0x20, 0x26, 0x10, 0x36, - 0x20, 0x16, 0x00, 0x32, 0x36, 0x10, 0x26, 0x22, 0x06, 0x10, 0x03, 0x37, - 0x05, 0x07, 0x02, 0x18, 0x6C, 0xFE, 0xFF, 0x6D, 0x6D, 0x01, 0x01, 0x6C, - 0xFE, 0xCF, 0x8A, 0x30, 0x30, 0x8A, 0x31, 0x1E, 0x20, 0x01, 0x06, 0x16, - 0x8E, 0x9B, 0x9B, 0x01, 0x2C, 0x9C, 0x9C, 0xFE, 0x95, 0x53, 0x01, 0x05, - 0x52, 0x52, 0xFE, 0xFB, 0x02, 0x2F, 0x5C, 0x5D, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x18, 0x03, 0x2D, 0x00, 0x07, - 0x00, 0x0F, 0x00, 0x13, 0x00, 0x00, 0x24, 0x06, 0x20, 0x26, 0x10, 0x36, - 0x20, 0x16, 0x00, 0x32, 0x36, 0x10, 0x26, 0x22, 0x06, 0x10, 0x03, 0x27, - 0x25, 0x17, 0x02, 0x18, 0x6C, 0xFE, 0xFF, 0x6D, 0x6D, 0x01, 0x01, 0x6C, - 0xFE, 0xCF, 0x8A, 0x30, 0x30, 0x8A, 0x31, 0x08, 0x16, 0x01, 0x06, 0x20, - 0x8E, 0x9B, 0x9B, 0x01, 0x2C, 0x9C, 0x9C, 0xFE, 0x95, 0x53, 0x01, 0x05, - 0x52, 0x52, 0xFE, 0xFB, 0x01, 0xEA, 0x44, 0x5D, 0x5C, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x18, 0x03, 0x24, 0x00, 0x07, - 0x00, 0x0F, 0x00, 0x17, 0x00, 0x00, 0x24, 0x06, 0x20, 0x26, 0x10, 0x36, - 0x20, 0x16, 0x00, 0x32, 0x36, 0x10, 0x26, 0x22, 0x06, 0x10, 0x03, 0x27, - 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, 0x02, 0x18, 0x6C, 0xFE, 0xFF, 0x6D, - 0x6D, 0x01, 0x01, 0x6C, 0xFE, 0xCF, 0x8A, 0x30, 0x30, 0x8A, 0x31, 0x1B, - 0x21, 0x92, 0x3D, 0x93, 0x23, 0x8B, 0x07, 0x8E, 0x9B, 0x9B, 0x01, 0x2C, - 0x9C, 0x9C, 0xFE, 0x95, 0x53, 0x01, 0x05, 0x52, 0x52, 0xFE, 0xFB, 0x01, - 0xE5, 0x32, 0x6B, 0x6B, 0x32, 0x45, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, - 0xFF, 0xF3, 0x02, 0x18, 0x03, 0x12, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1F, - 0x00, 0x00, 0x24, 0x06, 0x20, 0x26, 0x10, 0x36, 0x20, 0x16, 0x00, 0x32, - 0x36, 0x10, 0x26, 0x22, 0x06, 0x10, 0x13, 0x32, 0x16, 0x33, 0x32, 0x37, - 0x17, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x02, 0x18, - 0x6C, 0xFE, 0xFF, 0x6D, 0x6D, 0x01, 0x01, 0x6C, 0xFE, 0xCF, 0x8A, 0x30, - 0x30, 0x8A, 0x31, 0x0E, 0x1E, 0xA0, 0x08, 0x0D, 0x10, 0x3F, 0x01, 0x51, - 0x1D, 0xA3, 0x07, 0x0E, 0x10, 0x3F, 0x01, 0x8E, 0x9B, 0x9B, 0x01, 0x2C, - 0x9C, 0x9C, 0xFE, 0x95, 0x53, 0x01, 0x05, 0x52, 0x52, 0xFE, 0xFB, 0x02, - 0x70, 0x2B, 0x2A, 0x09, 0x73, 0x2D, 0x2B, 0x08, 0x73, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x3E, 0xFF, 0xF3, 0x02, 0x18, 0x03, 0x02, 0x00, 0x07, - 0x00, 0x0F, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x24, 0x06, 0x20, 0x26, - 0x10, 0x36, 0x20, 0x16, 0x00, 0x32, 0x36, 0x10, 0x26, 0x22, 0x06, 0x10, - 0x03, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x02, 0x18, 0x6C, 0xFE, - 0xFF, 0x6D, 0x6D, 0x01, 0x01, 0x6C, 0xFE, 0xCF, 0x8A, 0x30, 0x30, 0x8A, - 0x31, 0x32, 0x7C, 0x57, 0x7B, 0x8E, 0x9B, 0x9B, 0x01, 0x2C, 0x9C, 0x9C, - 0xFE, 0x95, 0x53, 0x01, 0x05, 0x52, 0x52, 0xFE, 0xFB, 0x02, 0x03, 0x5D, - 0x5D, 0x5D, 0x5D, 0x00, 0x00, 0x03, 0x00, 0x2C, 0x00, 0x1C, 0x02, 0x50, - 0x02, 0x2F, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x00, 0x37, 0x35, - 0x21, 0x15, 0x05, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x2C, 0x02, - 0x24, 0xFE, 0xA8, 0x8B, 0x8B, 0x8B, 0xF3, 0x63, 0x63, 0xD7, 0x6D, 0x6D, - 0x01, 0xA5, 0x6E, 0x6E, 0x00, 0x03, 0x00, 0x3F, 0xFF, 0xDA, 0x02, 0x18, - 0x02, 0x73, 0x00, 0x12, 0x00, 0x1A, 0x00, 0x21, 0x00, 0x00, 0x37, 0x26, - 0x10, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x07, 0x16, 0x15, 0x14, 0x06, - 0x23, 0x22, 0x27, 0x07, 0x23, 0x01, 0x26, 0x22, 0x0E, 0x01, 0x14, 0x17, - 0x37, 0x17, 0x32, 0x36, 0x34, 0x27, 0x03, 0x16, 0x84, 0x45, 0x6D, 0x80, - 0x31, 0x24, 0x13, 0x59, 0x26, 0x51, 0x6C, 0x80, 0x39, 0x2C, 0x14, 0x59, - 0x01, 0x00, 0x10, 0x4C, 0x30, 0x17, 0x07, 0x4C, 0x22, 0x45, 0x2F, 0x10, - 0xA1, 0x12, 0x31, 0x48, 0x01, 0x41, 0x9C, 0x0C, 0x29, 0x4E, 0x47, 0xBA, - 0x96, 0x9B, 0x13, 0x2C, 0x02, 0x1A, 0x05, 0x20, 0x5B, 0xAE, 0x2A, 0x9E, - 0xF5, 0x52, 0xE8, 0x2C, 0xFE, 0xA6, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x50, - 0xFF, 0xF3, 0x02, 0x0E, 0x03, 0x2D, 0x00, 0x17, 0x00, 0x1B, 0x00, 0x00, - 0x37, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, - 0x11, 0x23, 0x27, 0x23, 0x0E, 0x03, 0x07, 0x06, 0x23, 0x22, 0x13, 0x37, - 0x05, 0x07, 0x50, 0x74, 0x0D, 0x0E, 0x25, 0x3C, 0x5A, 0x74, 0x4C, 0x0E, - 0x05, 0x01, 0x2B, 0x11, 0x2C, 0x0F, 0x2A, 0x22, 0x9B, 0x52, 0x20, 0x01, - 0x06, 0x16, 0xC7, 0x01, 0x82, 0xFE, 0x95, 0x60, 0x13, 0x11, 0x30, 0x01, - 0xBF, 0xFD, 0xB7, 0x3A, 0x01, 0x18, 0x08, 0x15, 0x04, 0x0D, 0x02, 0xDE, - 0x5C, 0x5D, 0x44, 0x00, 0x00, 0x02, 0x00, 0x50, 0xFF, 0xF3, 0x02, 0x0E, - 0x03, 0x2D, 0x00, 0x17, 0x00, 0x1B, 0x00, 0x00, 0x37, 0x11, 0x33, 0x11, - 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x27, 0x23, - 0x0E, 0x03, 0x07, 0x06, 0x23, 0x22, 0x13, 0x27, 0x25, 0x17, 0x50, 0x74, - 0x0D, 0x0E, 0x25, 0x3C, 0x5A, 0x74, 0x4C, 0x0E, 0x05, 0x01, 0x2B, 0x11, - 0x2C, 0x0F, 0x2A, 0x22, 0x9B, 0x69, 0x16, 0x01, 0x06, 0x20, 0xC7, 0x01, - 0x82, 0xFE, 0x95, 0x60, 0x13, 0x11, 0x30, 0x01, 0xBF, 0xFD, 0xB7, 0x3A, - 0x01, 0x18, 0x08, 0x15, 0x04, 0x0D, 0x02, 0x99, 0x44, 0x5D, 0x5C, 0x00, - 0x00, 0x02, 0x00, 0x50, 0xFF, 0xF3, 0x02, 0x0E, 0x03, 0x24, 0x00, 0x17, - 0x00, 0x1F, 0x00, 0x00, 0x37, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, - 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x27, 0x23, 0x0E, 0x03, 0x07, 0x06, - 0x23, 0x22, 0x13, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, 0x50, 0x74, - 0x0D, 0x0E, 0x25, 0x3C, 0x5A, 0x74, 0x4C, 0x0E, 0x05, 0x01, 0x2B, 0x11, - 0x2C, 0x0F, 0x2A, 0x22, 0x9B, 0x55, 0x21, 0x92, 0x3D, 0x93, 0x23, 0x8B, - 0x07, 0xC7, 0x01, 0x82, 0xFE, 0x95, 0x60, 0x13, 0x11, 0x30, 0x01, 0xBF, - 0xFD, 0xB7, 0x3A, 0x01, 0x18, 0x08, 0x15, 0x04, 0x0D, 0x02, 0x94, 0x32, - 0x6B, 0x6B, 0x32, 0x45, 0x00, 0x03, 0x00, 0x50, 0xFF, 0xF3, 0x02, 0x0E, - 0x03, 0x02, 0x00, 0x17, 0x00, 0x1B, 0x00, 0x1F, 0x00, 0x00, 0x37, 0x11, - 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, - 0x27, 0x23, 0x0E, 0x03, 0x07, 0x06, 0x23, 0x22, 0x13, 0x35, 0x33, 0x15, - 0x33, 0x35, 0x33, 0x15, 0x50, 0x74, 0x0D, 0x0E, 0x25, 0x3C, 0x5A, 0x74, - 0x4C, 0x0E, 0x05, 0x01, 0x2B, 0x11, 0x2C, 0x0F, 0x2A, 0x22, 0x9B, 0x3E, - 0x7C, 0x57, 0x7B, 0xC7, 0x01, 0x82, 0xFE, 0x95, 0x60, 0x13, 0x11, 0x30, - 0x01, 0xBF, 0xFD, 0xB7, 0x3A, 0x01, 0x18, 0x08, 0x15, 0x04, 0x0D, 0x02, - 0xB2, 0x5D, 0x5D, 0x5D, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFB, - 0xFF, 0x5A, 0x01, 0xF1, 0x03, 0x2D, 0x00, 0x09, 0x00, 0x0D, 0x00, 0x00, - 0x17, 0x37, 0x03, 0x33, 0x13, 0x33, 0x13, 0x33, 0x03, 0x07, 0x03, 0x27, - 0x25, 0x17, 0x75, 0x52, 0xCC, 0x81, 0x7C, 0x05, 0x7A, 0x7A, 0xCD, 0x37, - 0x70, 0x16, 0x01, 0x06, 0x20, 0xA6, 0xDC, 0x02, 0x13, 0xFE, 0x64, 0x01, - 0x9C, 0xFD, 0xD9, 0xC8, 0x03, 0x32, 0x44, 0x5D, 0x5C, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x60, 0xFF, 0x5A, 0x02, 0x26, 0x02, 0xF5, 0x00, 0x10, - 0x00, 0x1E, 0x00, 0x00, 0x37, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2E, - 0x05, 0x06, 0x23, 0x22, 0x07, 0x03, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, - 0x16, 0x15, 0x10, 0x23, 0x22, 0x27, 0x15, 0xD3, 0x4D, 0x54, 0x11, 0x2A, - 0x0D, 0x04, 0x0E, 0x06, 0x13, 0x08, 0x18, 0x11, 0x2B, 0x48, 0x73, 0x73, - 0x55, 0x37, 0x63, 0x64, 0xDE, 0x23, 0x52, 0x61, 0x0E, 0x0F, 0x23, 0xAD, - 0x68, 0x2F, 0x14, 0x0D, 0x07, 0x03, 0x01, 0x01, 0x14, 0xFD, 0x7A, 0x03, - 0x9B, 0xB2, 0x13, 0x91, 0x9C, 0xFE, 0xCA, 0x0D, 0xA6, 0x00, 0x00, 0x00, - 0x00, 0x03, 0xFF, 0xFB, 0xFF, 0x5A, 0x01, 0xF1, 0x03, 0x02, 0x00, 0x09, - 0x00, 0x0D, 0x00, 0x11, 0x00, 0x00, 0x17, 0x37, 0x03, 0x33, 0x13, 0x33, - 0x13, 0x33, 0x03, 0x07, 0x03, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, - 0x75, 0x52, 0xCC, 0x81, 0x7C, 0x05, 0x7A, 0x7A, 0xCD, 0x37, 0x9A, 0x7C, - 0x57, 0x7B, 0xA6, 0xDC, 0x02, 0x13, 0xFE, 0x64, 0x01, 0x9C, 0xFD, 0xD9, - 0xC8, 0x03, 0x4B, 0x5D, 0x5D, 0x5D, 0x5D, 0x00, 0x00, 0x01, 0x00, 0x08, - 0x00, 0x00, 0x02, 0x1B, 0x02, 0xF5, 0x00, 0x19, 0x00, 0x00, 0x33, 0x11, - 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x36, 0x32, - 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, - 0x59, 0x51, 0x51, 0x74, 0xB4, 0xB4, 0x6F, 0x9C, 0x43, 0x74, 0x1C, 0x2A, - 0x1A, 0x4A, 0x30, 0x02, 0x82, 0x50, 0x23, 0x23, 0x50, 0x5E, 0x33, 0x6B, - 0x6A, 0xFE, 0x7E, 0x01, 0x66, 0x55, 0x34, 0x13, 0x14, 0xFE, 0x38, 0x00, - 0x00, 0x02, 0xFF, 0xF9, 0xFF, 0xFF, 0x01, 0x40, 0x03, 0x66, 0x00, 0x0F, - 0x00, 0x15, 0x00, 0x00, 0x13, 0x32, 0x16, 0x32, 0x36, 0x37, 0x17, 0x06, - 0x23, 0x22, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x13, 0x07, 0x13, 0x03, - 0x33, 0x03, 0x47, 0x1B, 0x7C, 0x0E, 0x0E, 0x07, 0x3F, 0x01, 0x4C, 0x1B, - 0x7D, 0x07, 0x0C, 0x10, 0x3F, 0x01, 0xDD, 0x76, 0x04, 0x04, 0x76, 0x04, - 0x03, 0x66, 0x2C, 0x14, 0x15, 0x09, 0x70, 0x2E, 0x2A, 0x08, 0x70, 0xFC, - 0x9A, 0x01, 0x01, 0x42, 0x01, 0x7A, 0xFE, 0xCA, 0x00, 0x02, 0xFF, 0xEB, - 0x00, 0x00, 0x01, 0x39, 0x03, 0x12, 0x00, 0x0F, 0x00, 0x13, 0x00, 0x00, - 0x13, 0x32, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x23, - 0x22, 0x07, 0x27, 0x36, 0x13, 0x11, 0x33, 0x11, 0x34, 0x1A, 0x8E, 0x06, - 0x0C, 0x0A, 0x41, 0x01, 0x46, 0x1A, 0x8F, 0x06, 0x0B, 0x0C, 0x41, 0x01, - 0x75, 0x74, 0x03, 0x12, 0x29, 0x28, 0x09, 0x73, 0x2B, 0x29, 0x08, 0x73, - 0xFC, 0xEE, 0x02, 0x49, 0xFD, 0xB7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, - 0x00, 0x00, 0x00, 0xD5, 0x02, 0x49, 0x00, 0x03, 0x00, 0x00, 0x33, 0x11, - 0x33, 0x11, 0x61, 0x74, 0x02, 0x49, 0xFD, 0xB7, 0x00, 0x02, 0x00, 0x61, - 0xFF, 0xF3, 0x02, 0x1F, 0x02, 0xBB, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, - 0x33, 0x07, 0x13, 0x03, 0x33, 0x03, 0x13, 0x16, 0x32, 0x37, 0x36, 0x35, - 0x11, 0x33, 0x11, 0x14, 0x23, 0x22, 0x27, 0xD7, 0x76, 0x04, 0x04, 0x76, - 0x04, 0x53, 0x23, 0x3F, 0x0A, 0x19, 0x74, 0xB6, 0x21, 0x2F, 0x01, 0x01, - 0x42, 0x01, 0x7A, 0xFE, 0xCA, 0xFE, 0xDA, 0x08, 0x09, 0x13, 0x76, 0x01, - 0xD2, 0xFE, 0x36, 0xFE, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x58, - 0xFF, 0x4E, 0x02, 0x0B, 0x02, 0xF5, 0x00, 0x03, 0x00, 0x0E, 0x00, 0x12, - 0x00, 0x16, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x17, 0x16, 0x32, 0x36, - 0x35, 0x11, 0x33, 0x11, 0x14, 0x23, 0x27, 0x03, 0x35, 0x33, 0x15, 0x33, - 0x35, 0x33, 0x15, 0x63, 0x73, 0x39, 0x27, 0x45, 0x13, 0x73, 0xB0, 0x4E, - 0xAB, 0x87, 0xA5, 0x87, 0x02, 0x49, 0xFD, 0xB7, 0x4A, 0x06, 0x2F, 0x5D, - 0x02, 0x0A, 0xFD, 0xF7, 0xEF, 0x07, 0x03, 0x42, 0x5E, 0x5E, 0x5E, 0x5E, - 0x00, 0x02, 0xFF, 0xF3, 0xFF, 0xF3, 0x01, 0x5D, 0x03, 0x74, 0x00, 0x0C, - 0x00, 0x14, 0x00, 0x00, 0x35, 0x16, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, - 0x11, 0x14, 0x23, 0x22, 0x27, 0x13, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, - 0x23, 0x23, 0x3F, 0x0A, 0x19, 0x74, 0xB6, 0x21, 0x2F, 0x47, 0x1D, 0x82, - 0x3D, 0x81, 0x1D, 0x7F, 0x07, 0x5F, 0x08, 0x09, 0x13, 0x76, 0x01, 0xD2, - 0xFE, 0x36, 0xFE, 0x09, 0x02, 0xE9, 0x33, 0x5C, 0x5C, 0x33, 0x39, 0x00, - 0x00, 0x02, 0xFF, 0xE7, 0xFF, 0x4E, 0x01, 0x52, 0x03, 0x24, 0x00, 0x07, - 0x00, 0x13, 0x00, 0x00, 0x13, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, - 0x03, 0x16, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x23, 0x27, - 0x1F, 0x21, 0x8B, 0x3D, 0x8C, 0x23, 0x84, 0x07, 0xB0, 0x27, 0x44, 0x14, - 0x73, 0x60, 0x4D, 0x52, 0x02, 0x89, 0x33, 0x68, 0x68, 0x33, 0x43, 0xFC, - 0xEA, 0x06, 0x2F, 0x5D, 0x02, 0x0D, 0xFD, 0xF4, 0x7F, 0x70, 0x07, 0x00, - 0x00, 0x03, 0x00, 0x52, 0xFE, 0xFB, 0x02, 0x4C, 0x02, 0xF1, 0x00, 0x04, - 0x00, 0x0B, 0x00, 0x14, 0x00, 0x00, 0x13, 0x11, 0x23, 0x13, 0x03, 0x01, - 0x03, 0x13, 0x33, 0x03, 0x15, 0x01, 0x05, 0x35, 0x33, 0x15, 0x14, 0x07, - 0x27, 0x3E, 0x01, 0xC6, 0x74, 0x05, 0x05, 0x01, 0x6E, 0xF9, 0xE8, 0x8B, - 0xF7, 0x01, 0x09, 0xFE, 0xA6, 0x69, 0x65, 0x2A, 0x15, 0x11, 0x02, 0xF1, - 0xFD, 0x0F, 0x01, 0x41, 0x01, 0xB0, 0xFD, 0x0F, 0x01, 0x3A, 0x01, 0x0C, - 0xFE, 0xF9, 0x05, 0xFE, 0xC6, 0x7E, 0x47, 0x0A, 0x8E, 0x36, 0x25, 0x12, - 0x2B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5D, 0x00, 0x00, 0x02, 0x4C, - 0x02, 0x46, 0x00, 0x06, 0x00, 0x0B, 0x00, 0x00, 0x21, 0x03, 0x13, 0x33, - 0x03, 0x15, 0x01, 0x21, 0x11, 0x33, 0x17, 0x11, 0x01, 0xC0, 0xF9, 0xE8, - 0x8B, 0xF7, 0x01, 0x09, 0xFE, 0x11, 0x50, 0x1A, 0x01, 0x3A, 0x01, 0x0C, - 0xFE, 0xF9, 0x05, 0xFE, 0xC6, 0x02, 0x46, 0x4C, 0xFE, 0x06, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x01, 0xD0, 0x02, 0xBB, 0x00, 0x05, - 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x33, 0x03, 0x25, 0x15, 0x03, 0x35, - 0x33, 0x15, 0x61, 0x75, 0x05, 0x00, 0xFF, 0xA4, 0x82, 0x02, 0xBB, 0xFD, - 0xAB, 0x02, 0x68, 0x01, 0x55, 0x6C, 0x6C, 0x00, 0x00, 0x02, 0x00, 0x52, - 0x00, 0x00, 0x01, 0x91, 0x02, 0xF5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, - 0x33, 0x11, 0x33, 0x11, 0x13, 0x35, 0x33, 0x15, 0x52, 0x73, 0x4D, 0x7F, - 0x02, 0xF5, 0xFD, 0x0B, 0x01, 0x60, 0x70, 0x70, 0x00, 0x01, 0x00, 0x1F, - 0x00, 0x00, 0x01, 0xD0, 0x02, 0xBB, 0x00, 0x0D, 0x00, 0x00, 0x33, 0x35, - 0x07, 0x35, 0x37, 0x11, 0x33, 0x03, 0x37, 0x15, 0x0F, 0x01, 0x25, 0x15, - 0x61, 0x42, 0x42, 0x75, 0x03, 0x9C, 0x9C, 0x02, 0x00, 0xFF, 0xFD, 0x29, - 0x5E, 0x29, 0x01, 0x60, 0xFE, 0xE6, 0x64, 0x5F, 0x64, 0xDC, 0x02, 0x68, - 0x00, 0x01, 0x00, 0x15, 0x00, 0x00, 0x01, 0x31, 0x02, 0xF5, 0x00, 0x0B, - 0x00, 0x00, 0x33, 0x11, 0x07, 0x35, 0x37, 0x11, 0x33, 0x11, 0x37, 0x15, - 0x07, 0x11, 0x6C, 0x57, 0x57, 0x73, 0x52, 0x52, 0x01, 0x38, 0x36, 0x5F, - 0x36, 0x01, 0x5E, 0xFE, 0xEB, 0x34, 0x61, 0x33, 0xFE, 0x80, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x02, 0x5B, 0x03, 0x77, 0x00, 0x0B, - 0x00, 0x0F, 0x00, 0x00, 0x33, 0x11, 0x33, 0x13, 0x33, 0x03, 0x33, 0x11, - 0x23, 0x03, 0x23, 0x1B, 0x01, 0x27, 0x25, 0x17, 0x61, 0x99, 0xFB, 0x05, - 0x0E, 0x6F, 0x99, 0xFA, 0x05, 0x0D, 0x33, 0x13, 0x01, 0x00, 0x1C, 0x02, - 0xBB, 0xFD, 0xCC, 0x02, 0x34, 0xFD, 0x45, 0x02, 0x33, 0xFD, 0xCD, 0x02, - 0xE6, 0x42, 0x4F, 0x59, 0x00, 0x02, 0x00, 0x5D, 0x00, 0x00, 0x02, 0x1C, - 0x03, 0x2D, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x33, 0x11, 0x33, 0x17, - 0x33, 0x36, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x22, 0x06, - 0x07, 0x11, 0x03, 0x27, 0x25, 0x17, 0x5D, 0x4C, 0x0D, 0x05, 0x7B, 0xA9, - 0x3D, 0x74, 0x17, 0x4E, 0x59, 0x19, 0x0A, 0x16, 0x01, 0x06, 0x20, 0x02, - 0x49, 0x3A, 0x47, 0x6E, 0x66, 0xFE, 0x7E, 0x01, 0x65, 0x59, 0x2F, 0x20, - 0x10, 0xFE, 0x43, 0x02, 0x8C, 0x44, 0x5D, 0x5C, 0x00, 0x02, 0x00, 0x40, - 0xFF, 0xF3, 0x03, 0x71, 0x02, 0xC8, 0x00, 0x1B, 0x00, 0x2C, 0x00, 0x00, - 0x21, 0x35, 0x23, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3E, - 0x01, 0x33, 0x32, 0x17, 0x33, 0x35, 0x21, 0x15, 0x25, 0x07, 0x33, 0x15, - 0x23, 0x17, 0x25, 0x15, 0x24, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2E, - 0x02, 0x22, 0x0E, 0x02, 0x14, 0x1E, 0x01, 0x01, 0xF7, 0x04, 0x41, 0x5E, - 0x9C, 0x42, 0x36, 0x52, 0x28, 0x5D, 0x3D, 0x60, 0x3F, 0x04, 0x01, 0x7A, - 0xFE, 0xFA, 0x04, 0xF1, 0xF1, 0x04, 0x01, 0x06, 0xFD, 0x94, 0x2D, 0x5C, - 0x1E, 0x42, 0x10, 0x29, 0x35, 0x58, 0x34, 0x29, 0x10, 0x0C, 0x16, 0x29, - 0x36, 0x6C, 0x57, 0xA9, 0xD5, 0x4E, 0x26, 0x20, 0x35, 0x28, 0x67, 0x03, - 0xC3, 0x63, 0xCD, 0x02, 0x66, 0x66, 0x0B, 0x11, 0x25, 0xCB, 0x54, 0x66, - 0x38, 0x12, 0x12, 0x38, 0x66, 0x97, 0x5C, 0x39, 0x00, 0x03, 0x00, 0x3E, - 0xFF, 0xF3, 0x03, 0x78, 0x02, 0x56, 0x00, 0x19, 0x00, 0x21, 0x00, 0x2B, - 0x00, 0x00, 0x25, 0x06, 0x22, 0x26, 0x10, 0x36, 0x32, 0x17, 0x33, 0x36, - 0x32, 0x16, 0x1D, 0x01, 0x21, 0x14, 0x17, 0x16, 0x33, 0x32, 0x3F, 0x01, - 0x17, 0x06, 0x22, 0x27, 0x26, 0x32, 0x36, 0x10, 0x26, 0x22, 0x06, 0x10, - 0x25, 0x37, 0x26, 0x27, 0x26, 0x23, 0x22, 0x0E, 0x02, 0x01, 0xE0, 0x3A, - 0xFB, 0x6D, 0x6D, 0xFC, 0x39, 0x04, 0x3C, 0xE9, 0x6F, 0xFE, 0xA3, 0x26, - 0x19, 0x2A, 0x51, 0x5A, 0x1F, 0x1C, 0x62, 0xE7, 0x3D, 0xFD, 0x8A, 0x30, - 0x30, 0x8A, 0x31, 0x01, 0x66, 0xE6, 0x01, 0x0A, 0x14, 0x45, 0x2B, 0x33, - 0x1B, 0x08, 0x41, 0x4E, 0x9B, 0x01, 0x2C, 0x9C, 0x4F, 0x4F, 0x80, 0x94, - 0x48, 0x6F, 0x23, 0x16, 0x1E, 0x0B, 0x58, 0x30, 0x4E, 0x0E, 0x53, 0x01, - 0x05, 0x52, 0x52, 0xFE, 0xFB, 0xAF, 0x05, 0x5E, 0x19, 0x2A, 0x12, 0x2E, - 0x36, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x61, 0x00, 0x00, 0x02, 0x56, - 0x03, 0x7C, 0x00, 0x0E, 0x00, 0x17, 0x00, 0x1B, 0x00, 0x00, 0x01, 0x32, - 0x15, 0x14, 0x07, 0x15, 0x13, 0x23, 0x03, 0x27, 0x11, 0x23, 0x13, 0x03, - 0x36, 0x13, 0x16, 0x32, 0x36, 0x34, 0x27, 0x26, 0x22, 0x07, 0x37, 0x27, - 0x37, 0x17, 0x01, 0x54, 0xF1, 0x92, 0xA3, 0x89, 0x88, 0x6E, 0x76, 0x05, - 0x03, 0x70, 0x03, 0x4F, 0x77, 0x2F, 0x18, 0x15, 0x83, 0x44, 0x01, 0x14, - 0xFE, 0x1E, 0x02, 0xC8, 0xE1, 0xA6, 0x29, 0x05, 0xFE, 0xED, 0x01, 0x08, - 0x04, 0xFE, 0xF4, 0x01, 0x48, 0x01, 0x72, 0x0E, 0xFE, 0xA8, 0x09, 0x3B, - 0x99, 0x1B, 0x16, 0x09, 0x81, 0x41, 0x57, 0x57, 0x00, 0x03, 0x00, 0x61, - 0xFE, 0xFB, 0x02, 0x56, 0x02, 0xC8, 0x00, 0x0E, 0x00, 0x17, 0x00, 0x20, - 0x00, 0x00, 0x01, 0x32, 0x15, 0x14, 0x07, 0x15, 0x13, 0x23, 0x03, 0x27, - 0x11, 0x23, 0x13, 0x03, 0x36, 0x13, 0x16, 0x32, 0x36, 0x34, 0x27, 0x26, - 0x22, 0x07, 0x13, 0x35, 0x33, 0x15, 0x14, 0x07, 0x27, 0x3E, 0x01, 0x01, - 0x54, 0xF1, 0x92, 0xA3, 0x89, 0x88, 0x6E, 0x76, 0x05, 0x03, 0x70, 0x03, - 0x4F, 0x77, 0x2F, 0x18, 0x15, 0x83, 0x44, 0x36, 0x69, 0x65, 0x2A, 0x15, - 0x11, 0x02, 0xC8, 0xE1, 0xA6, 0x29, 0x05, 0xFE, 0xED, 0x01, 0x08, 0x04, - 0xFE, 0xF4, 0x01, 0x48, 0x01, 0x72, 0x0E, 0xFE, 0xA8, 0x09, 0x3B, 0x99, - 0x1B, 0x16, 0x09, 0xFD, 0x1F, 0x47, 0x0A, 0x8E, 0x36, 0x25, 0x12, 0x2B, - 0x00, 0x02, 0x00, 0x3C, 0xFE, 0xFB, 0x01, 0x90, 0x02, 0x56, 0x00, 0x08, - 0x00, 0x17, 0x00, 0x00, 0x17, 0x35, 0x33, 0x15, 0x14, 0x07, 0x27, 0x3E, - 0x01, 0x12, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x11, 0x23, 0x11, - 0x33, 0x17, 0x33, 0x36, 0x62, 0x69, 0x65, 0x2A, 0x15, 0x11, 0xDC, 0x3A, - 0x18, 0x09, 0x19, 0x14, 0x4B, 0x3E, 0x74, 0x49, 0x0F, 0x06, 0x24, 0x7E, - 0x47, 0x0A, 0x8E, 0x36, 0x25, 0x12, 0x2B, 0x02, 0xF9, 0x08, 0x68, 0x02, - 0x2C, 0xFE, 0x44, 0x02, 0x49, 0x3D, 0x1D, 0x00, 0x00, 0x03, 0x00, 0x61, - 0x00, 0x00, 0x02, 0x56, 0x03, 0x7F, 0x00, 0x0E, 0x00, 0x17, 0x00, 0x1F, - 0x00, 0x00, 0x01, 0x32, 0x15, 0x14, 0x07, 0x15, 0x13, 0x23, 0x03, 0x27, - 0x11, 0x23, 0x13, 0x03, 0x36, 0x13, 0x16, 0x32, 0x36, 0x34, 0x27, 0x26, - 0x22, 0x07, 0x27, 0x37, 0x17, 0x33, 0x37, 0x17, 0x07, 0x23, 0x01, 0x54, - 0xF1, 0x92, 0xA3, 0x89, 0x88, 0x6E, 0x76, 0x05, 0x03, 0x70, 0x03, 0x4F, - 0x77, 0x2F, 0x18, 0x15, 0x83, 0x44, 0x3F, 0x1F, 0x8A, 0x07, 0x8A, 0x1F, - 0x8E, 0x3D, 0x02, 0xC8, 0xE1, 0xA6, 0x29, 0x05, 0xFE, 0xED, 0x01, 0x08, - 0x04, 0xFE, 0xF4, 0x01, 0x48, 0x01, 0x72, 0x0E, 0xFE, 0xA8, 0x09, 0x3B, - 0x99, 0x1B, 0x16, 0x09, 0xEC, 0x30, 0x3C, 0x3C, 0x30, 0x61, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x3E, 0x00, 0x00, 0x01, 0x97, 0x03, 0x2E, 0x00, 0x0F, - 0x00, 0x17, 0x00, 0x00, 0x00, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, - 0x11, 0x23, 0x11, 0x33, 0x16, 0x17, 0x33, 0x36, 0x27, 0x37, 0x17, 0x33, - 0x37, 0x17, 0x07, 0x23, 0x01, 0x3E, 0x3A, 0x18, 0x09, 0x19, 0x14, 0x4B, - 0x3E, 0x74, 0x49, 0x09, 0x06, 0x06, 0x24, 0xA1, 0x1F, 0x8A, 0x07, 0x8A, - 0x1F, 0x8E, 0x3D, 0x02, 0x56, 0x08, 0x68, 0x02, 0x2C, 0xFE, 0x44, 0x02, - 0x49, 0x2F, 0x0E, 0x1D, 0xD7, 0x2E, 0x44, 0x44, 0x2E, 0x6B, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xE7, 0xFF, 0x4E, 0x00, 0xE6, 0x02, 0x49, 0x00, 0x0B, - 0x00, 0x00, 0x07, 0x16, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, - 0x23, 0x27, 0x0C, 0x27, 0x44, 0x14, 0x73, 0x60, 0x4D, 0x52, 0x4A, 0x06, - 0x2F, 0x5D, 0x02, 0x0D, 0xFD, 0xF4, 0x7F, 0x70, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x61, 0x02, 0x87, 0x01, 0xC3, 0x03, 0x24, 0x00, 0x07, - 0x00, 0x00, 0x13, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, 0x82, 0x21, - 0x92, 0x3D, 0x93, 0x23, 0x8B, 0x07, 0x02, 0x87, 0x32, 0x6B, 0x6B, 0x32, - 0x45, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xD9, 0x02, 0x95, 0x01, 0x32, - 0x03, 0x2E, 0x00, 0x07, 0x00, 0x00, 0x03, 0x37, 0x17, 0x33, 0x37, 0x17, - 0x07, 0x23, 0x27, 0x1F, 0x8A, 0x07, 0x8A, 0x1F, 0x8E, 0x3D, 0x03, 0x00, - 0x2E, 0x44, 0x44, 0x2E, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, - 0x02, 0x82, 0x00, 0xD1, 0x03, 0x35, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x00, - 0x13, 0x34, 0x32, 0x15, 0x14, 0x06, 0x22, 0x26, 0x36, 0x06, 0x14, 0x16, - 0x32, 0x36, 0x34, 0x26, 0x16, 0xBB, 0x35, 0x50, 0x36, 0x49, 0x11, 0x12, - 0x27, 0x11, 0x10, 0x02, 0xDB, 0x5A, 0x5A, 0x30, 0x29, 0x29, 0x55, 0x0F, - 0x2B, 0x10, 0x10, 0x2B, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, - 0x02, 0x95, 0x01, 0xCD, 0x03, 0x12, 0x00, 0x0F, 0x00, 0x00, 0x13, 0x32, - 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x07, - 0x27, 0x36, 0xAB, 0x1D, 0xA2, 0x07, 0x0D, 0x10, 0x3F, 0x01, 0x51, 0x1D, - 0xA3, 0x07, 0x0E, 0x10, 0x3F, 0x01, 0x03, 0x12, 0x2B, 0x2A, 0x09, 0x73, - 0x2D, 0x2B, 0x08, 0x73, 0x00, 0x01, 0x00, 0x63, 0x02, 0xA4, 0x00, 0xDB, - 0x03, 0x02, 0x00, 0x03, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x63, 0x78, - 0x02, 0xA4, 0x5E, 0x5E, 0x00, 0x01, 0x00, 0x2A, 0x01, 0x16, 0x02, 0x23, - 0x01, 0x78, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15, 0x21, 0x37, 0x02, 0x23, - 0xFE, 0x07, 0x01, 0x01, 0x78, 0x62, 0x62, 0x00, 0x00, 0x01, 0x00, 0x3E, - 0x01, 0x16, 0x02, 0xFA, 0x01, 0x78, 0x00, 0x03, 0x00, 0x00, 0x13, 0x35, - 0x21, 0x15, 0x3E, 0x02, 0xBC, 0x01, 0x16, 0x62, 0x62, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x37, 0x01, 0xD1, 0x00, 0xB7, 0x02, 0xE0, 0x00, 0x08, - 0x00, 0x00, 0x13, 0x34, 0x37, 0x17, 0x06, 0x15, 0x17, 0x23, 0x26, 0x37, - 0x48, 0x38, 0x1C, 0x06, 0x66, 0x04, 0x02, 0x17, 0x83, 0x46, 0x26, 0x2D, - 0x45, 0x77, 0x1C, 0x00, 0x00, 0x01, 0x00, 0x37, 0x01, 0xC2, 0x00, 0xB7, - 0x02, 0xD2, 0x00, 0x08, 0x00, 0x00, 0x13, 0x14, 0x07, 0x27, 0x36, 0x35, - 0x27, 0x33, 0x16, 0xB7, 0x48, 0x38, 0x1C, 0x07, 0x67, 0x04, 0x02, 0x8B, - 0x83, 0x46, 0x27, 0x2C, 0x45, 0x78, 0x26, 0x00, 0x00, 0x01, 0x00, 0x38, - 0xFF, 0x76, 0x00, 0xB8, 0x00, 0x85, 0x00, 0x08, 0x00, 0x00, 0x17, 0x27, - 0x36, 0x35, 0x27, 0x33, 0x16, 0x15, 0x06, 0x70, 0x38, 0x1C, 0x06, 0x65, - 0x05, 0x01, 0x8A, 0x26, 0x2B, 0x46, 0x78, 0x23, 0x24, 0x85, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x34, 0x01, 0xD1, 0x01, 0x67, 0x02, 0xE2, 0x00, 0x08, - 0x00, 0x11, 0x00, 0x00, 0x01, 0x23, 0x26, 0x35, 0x36, 0x37, 0x17, 0x06, - 0x15, 0x05, 0x34, 0x37, 0x17, 0x06, 0x15, 0x17, 0x23, 0x26, 0x01, 0x52, - 0x67, 0x04, 0x01, 0x49, 0x36, 0x1B, 0xFE, 0xE8, 0x48, 0x38, 0x1C, 0x06, - 0x66, 0x04, 0x01, 0xD1, 0x1C, 0x29, 0x7A, 0x49, 0x23, 0x2A, 0x45, 0x30, - 0x85, 0x46, 0x26, 0x2D, 0x47, 0x77, 0x1C, 0x00, 0x00, 0x02, 0x00, 0x34, - 0x01, 0xC0, 0x01, 0x68, 0x02, 0xD2, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, - 0x13, 0x14, 0x07, 0x27, 0x36, 0x35, 0x27, 0x33, 0x16, 0x17, 0x14, 0x07, - 0x27, 0x36, 0x35, 0x27, 0x33, 0x16, 0xB4, 0x4A, 0x36, 0x1B, 0x06, 0x67, - 0x04, 0xB4, 0x48, 0x38, 0x1C, 0x07, 0x67, 0x04, 0x02, 0x8D, 0x7A, 0x4A, - 0x24, 0x28, 0x47, 0x76, 0x1C, 0x2B, 0x85, 0x46, 0x27, 0x2C, 0x47, 0x78, - 0x26, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xFF, 0x74, 0x01, 0x6A, - 0x00, 0x84, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, 0x17, 0x27, 0x36, 0x35, - 0x27, 0x33, 0x16, 0x15, 0x06, 0x37, 0x14, 0x07, 0x27, 0x36, 0x35, 0x27, - 0x33, 0x16, 0x6E, 0x38, 0x1C, 0x06, 0x65, 0x05, 0x01, 0xB5, 0x47, 0x38, - 0x1C, 0x06, 0x65, 0x04, 0x8A, 0x25, 0x29, 0x47, 0x79, 0x23, 0x24, 0x86, - 0x85, 0x87, 0x41, 0x26, 0x29, 0x47, 0x7A, 0x1C, 0x00, 0x01, 0x00, 0x3E, - 0x01, 0x24, 0x01, 0x4A, 0x02, 0x33, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, - 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x01, 0x4A, 0x4D, 0x71, 0x4E, 0x4D, - 0x72, 0x4D, 0x01, 0x67, 0x43, 0x43, 0x8C, 0x40, 0x41, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x20, 0x00, 0x53, 0x01, 0x0D, 0x02, 0x4E, 0x00, 0x06, - 0x00, 0x00, 0x37, 0x27, 0x37, 0x17, 0x07, 0x15, 0x17, 0xB6, 0x96, 0x96, - 0x57, 0x7B, 0x7B, 0x53, 0xFE, 0xFD, 0x34, 0xC6, 0x06, 0xC6, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1F, 0x00, 0x53, 0x01, 0x0C, 0x02, 0x4E, 0x00, 0x06, - 0x00, 0x00, 0x3F, 0x01, 0x35, 0x27, 0x37, 0x17, 0x07, 0x1F, 0x7B, 0x7B, - 0x58, 0x95, 0x95, 0x88, 0xC6, 0x06, 0xC6, 0x34, 0xFD, 0xFE, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x26, 0xFF, 0xF3, 0x02, 0x43, 0x02, 0xC8, 0x00, 0x10, - 0x00, 0x1F, 0x00, 0x00, 0x37, 0x35, 0x21, 0x15, 0x21, 0x1E, 0x01, 0x32, - 0x36, 0x37, 0x17, 0x0E, 0x02, 0x23, 0x22, 0x03, 0x27, 0x35, 0x33, 0x3E, - 0x01, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x07, 0x21, 0x15, 0x26, - 0x01, 0xD6, 0xFE, 0xE5, 0x0B, 0x38, 0x66, 0x63, 0x35, 0x21, 0x0A, 0x25, - 0x73, 0x3C, 0xDD, 0x22, 0x40, 0x41, 0x14, 0x88, 0xD8, 0x50, 0x0C, 0x7E, - 0x2F, 0x53, 0x33, 0x0B, 0x01, 0x1B, 0xF2, 0x51, 0x51, 0x5E, 0x3E, 0x16, - 0x16, 0x57, 0x06, 0x13, 0x1F, 0x00, 0xFF, 0x8D, 0x51, 0x8C, 0x6C, 0x14, - 0x61, 0x0D, 0x33, 0x5D, 0x51, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, - 0xFF, 0x86, 0x00, 0xC0, 0x00, 0x54, 0x00, 0x08, 0x00, 0x00, 0x37, 0x35, - 0x33, 0x15, 0x14, 0x07, 0x27, 0x3E, 0x01, 0x57, 0x69, 0x65, 0x2A, 0x15, - 0x11, 0x0D, 0x47, 0x0A, 0x8E, 0x36, 0x25, 0x12, 0x2B, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x3E, 0x02, 0xFC, 0x01, 0x8B, 0x03, 0x59, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, - 0x3E, 0x78, 0x5D, 0x78, 0x02, 0xFC, 0x5D, 0x5D, 0x5D, 0x5D, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x81, 0x02, 0xF3, 0x00, 0xF9, 0x03, 0x52, 0x00, 0x03, - 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x81, 0x78, 0x02, 0xF3, 0x5F, 0x5F, - 0x00, 0x01, 0x00, 0x72, 0x02, 0xE7, 0x01, 0x8F, 0x03, 0x76, 0x00, 0x03, - 0x00, 0x00, 0x13, 0x37, 0x05, 0x07, 0x72, 0x1A, 0x01, 0x03, 0x13, 0x03, - 0x1E, 0x58, 0x4D, 0x42, 0x00, 0x01, 0x00, 0x97, 0x02, 0xE6, 0x01, 0xB3, - 0x03, 0x77, 0x00, 0x03, 0x00, 0x00, 0x13, 0x27, 0x25, 0x17, 0xAA, 0x13, - 0x01, 0x00, 0x1C, 0x02, 0xE6, 0x42, 0x4F, 0x59, 0x00, 0x01, 0xFF, 0xF8, - 0x02, 0xE2, 0x01, 0x50, 0x03, 0x74, 0x00, 0x08, 0x00, 0x00, 0x13, 0x27, - 0x37, 0x33, 0x17, 0x07, 0x27, 0x23, 0x06, 0x16, 0x1E, 0x8D, 0x3D, 0x8E, - 0x1E, 0x8B, 0x07, 0x08, 0x02, 0xE2, 0x30, 0x62, 0x62, 0x30, 0x3C, 0x04, - 0x00, 0x02, 0x00, 0x30, 0x02, 0xD7, 0x00, 0xEC, 0x03, 0x87, 0x00, 0x07, - 0x00, 0x0F, 0x00, 0x00, 0x12, 0x26, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, - 0x26, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x66, 0x36, 0x36, 0x51, - 0x35, 0x36, 0x3B, 0x11, 0x11, 0x27, 0x0F, 0x0F, 0x02, 0xD7, 0x29, 0x5E, - 0x29, 0x29, 0x5E, 0x29, 0x79, 0x0D, 0x28, 0x0E, 0x0D, 0x29, 0x0D, 0x00, - 0x00, 0x01, 0x00, 0x05, 0x02, 0xEE, 0x01, 0x5E, 0x03, 0x7F, 0x00, 0x07, - 0x00, 0x00, 0x13, 0x37, 0x17, 0x33, 0x37, 0x17, 0x07, 0x23, 0x05, 0x1F, - 0x8A, 0x07, 0x8A, 0x1F, 0x8E, 0x3D, 0x03, 0x4F, 0x30, 0x3C, 0x3C, 0x30, - 0x61, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x02, 0xEA, 0x01, 0xB5, - 0x03, 0x66, 0x00, 0x10, 0x00, 0x00, 0x13, 0x32, 0x16, 0x33, 0x32, 0x3F, - 0x01, 0x17, 0x06, 0x23, 0x22, 0x26, 0x22, 0x06, 0x07, 0x27, 0x36, 0x94, - 0x1D, 0xA1, 0x08, 0x0E, 0x0A, 0x04, 0x3F, 0x01, 0x51, 0x1D, 0xA2, 0x0E, - 0x0F, 0x08, 0x3F, 0x01, 0x03, 0x66, 0x2D, 0x1F, 0x0B, 0x09, 0x70, 0x2F, - 0x15, 0x16, 0x08, 0x70, 0x00, 0x00, 0x00, 0x1C, 0x01, 0x56, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x01, 0x34, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x01, 0xD8, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x01, 0xE7, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x02, 0x4E, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x02, 0x93, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0D, 0x02, 0xB9, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x02, 0xDB, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3C, 0x03, 0x5F, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x22, 0x03, 0xE2, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x22, 0x04, 0x4B, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x1A, 0x04, 0xA4, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x17, 0x04, 0xEF, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x90, 0x06, 0x29, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1A, 0x06, 0xF0, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x01, 0x32, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x08, 0x01, 0xCE, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x08, 0x01, 0xDD, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x60, 0x01, 0xEC, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x12, 0x02, 0x7F, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x1A, 0x02, 0x9D, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x12, 0x02, 0xC7, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0x78, 0x02, 0xE5, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x08, 0x00, 0x44, 0x03, 0x9C, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x09, 0x00, 0x44, 0x04, 0x05, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0B, 0x00, 0x34, 0x04, 0x6E, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0C, 0x00, 0x2E, 0x04, 0xBF, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0D, 0x01, 0x20, 0x05, 0x07, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0E, 0x00, 0x34, 0x06, 0xBA, 0x00, 0x43, - 0x00, 0x6F, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, - 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, - 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x2C, - 0x00, 0x20, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, - 0x00, 0x6C, 0x00, 0x61, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, - 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, - 0x00, 0x28, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6D, 0x00, 0x6F, - 0x00, 0x6E, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, - 0x00, 0x40, 0x00, 0x67, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6C, - 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x29, 0x00, 0x2C, - 0x00, 0x20, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, - 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, - 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, - 0x00, 0x31, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6E, 0x00, 0x67, - 0x00, 0x65, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x20, - 0x00, 0x53, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, - 0x00, 0x7A, 0x00, 0x20, 0x00, 0x28, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, - 0x00, 0x65, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x67, 0x00, 0x40, 0x00, 0x79, - 0x00, 0x61, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x2E, 0x00, 0x63, - 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x72, 0x00, 0x29, - 0x00, 0x2C, 0x00, 0x20, 0x00, 0x57, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, - 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, - 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6F, - 0x00, 0x6E, 0x00, 0x74, 0x00, 0x20, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, - 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x52, 0x00, 0x75, 0x00, 0x64, - 0x00, 0x61, 0x00, 0x22, 0x00, 0x00, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x31, - 0x2C, 0x20, 0x4D, 0x61, 0x72, 0x69, 0x65, 0x6C, 0x61, 0x20, 0x4D, 0x6F, - 0x6E, 0x73, 0x61, 0x6C, 0x76, 0x65, 0x20, 0x28, 0x6D, 0x61, 0x72, 0x6D, - 0x6F, 0x6E, 0x73, 0x61, 0x6C, 0x76, 0x65, 0x40, 0x67, 0x6D, 0x61, 0x69, - 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x29, 0x2C, 0x20, 0x43, 0x6F, 0x70, 0x79, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, - 0x31, 0x31, 0x2C, 0x20, 0x41, 0x6E, 0x67, 0x65, 0x6C, 0x69, 0x6E, 0x61, - 0x20, 0x53, 0x61, 0x6E, 0x63, 0x68, 0x65, 0x7A, 0x20, 0x28, 0x61, 0x6E, - 0x67, 0x65, 0x5F, 0x64, 0x67, 0x40, 0x79, 0x61, 0x68, 0x6F, 0x6F, 0x2E, - 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x72, 0x29, 0x2C, 0x20, 0x57, 0x69, 0x74, - 0x68, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x46, - 0x6F, 0x6E, 0x74, 0x20, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x22, 0x52, 0x75, - 0x64, 0x61, 0x22, 0x00, 0x00, 0x52, 0x00, 0x75, 0x00, 0x64, 0x00, 0x61, - 0x00, 0x00, 0x52, 0x75, 0x64, 0x61, 0x00, 0x00, 0x42, 0x00, 0x6F, 0x00, - 0x6C, 0x00, 0x64, 0x00, 0x00, 0x42, 0x6F, 0x6C, 0x64, 0x00, 0x00, 0x4D, - 0x00, 0x61, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x61, - 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, - 0x00, 0x76, 0x00, 0x65, 0x00, 0x2C, 0x00, 0x41, 0x00, 0x6E, 0x00, 0x67, - 0x00, 0x65, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x53, - 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x7A, - 0x00, 0x3A, 0x00, 0x20, 0x00, 0x52, 0x00, 0x75, 0x00, 0x64, 0x00, 0x61, - 0x00, 0x20, 0x00, 0x42, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x64, 0x00, 0x3A, - 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x00, - 0x4D, 0x61, 0x72, 0x69, 0x65, 0x6C, 0x61, 0x4D, 0x6F, 0x6E, 0x73, 0x61, - 0x6C, 0x76, 0x65, 0x2C, 0x41, 0x6E, 0x67, 0x65, 0x6C, 0x69, 0x6E, 0x61, - 0x53, 0x61, 0x6E, 0x63, 0x68, 0x65, 0x7A, 0x3A, 0x20, 0x52, 0x75, 0x64, - 0x61, 0x20, 0x42, 0x6F, 0x6C, 0x64, 0x3A, 0x20, 0x32, 0x30, 0x31, 0x31, - 0x00, 0x00, 0x52, 0x00, 0x75, 0x00, 0x64, 0x00, 0x61, 0x00, 0x20, 0x00, - 0x42, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x64, 0x00, 0x00, 0x52, 0x75, 0x64, - 0x61, 0x20, 0x42, 0x6F, 0x6C, 0x64, 0x00, 0x00, 0x56, 0x00, 0x65, 0x00, - 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x20, 0x00, - 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x30, 0x00, 0x32, 0x00, 0x00, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x31, 0x2E, 0x30, 0x30, 0x32, - 0x00, 0x00, 0x52, 0x00, 0x75, 0x00, 0x64, 0x00, 0x61, 0x00, 0x2D, 0x00, - 0x42, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x64, 0x00, 0x00, 0x52, 0x75, 0x64, - 0x61, 0x2D, 0x42, 0x6F, 0x6C, 0x64, 0x00, 0x00, 0x52, 0x00, 0x75, 0x00, - 0x64, 0x00, 0x61, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, - 0x61, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, - 0x65, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6B, 0x00, 0x20, 0x00, - 0x6F, 0x00, 0x66, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x72, 0x00, - 0x69, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x20, 0x00, 0x4D, 0x00, - 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x76, 0x00, - 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x20, 0x00, - 0x41, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x69, 0x00, - 0x6E, 0x00, 0x61, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6E, 0x00, - 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x00, 0x52, 0x75, 0x64, - 0x61, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, - 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x6F, 0x66, 0x20, 0x4D, 0x61, 0x72, 0x69, - 0x65, 0x6C, 0x61, 0x20, 0x4D, 0x6F, 0x6E, 0x73, 0x61, 0x6C, 0x76, 0x65, - 0x20, 0x61, 0x6E, 0x64, 0x20, 0x41, 0x6E, 0x67, 0x65, 0x6C, 0x69, 0x6E, - 0x61, 0x20, 0x53, 0x61, 0x6E, 0x63, 0x68, 0x65, 0x7A, 0x00, 0x00, 0x4D, - 0x00, 0x61, 0x00, 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x61, - 0x00, 0x20, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x61, - 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x41, - 0x00, 0x6E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x6E, - 0x00, 0x61, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, - 0x00, 0x68, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x00, 0x4D, 0x61, 0x72, 0x69, - 0x65, 0x6C, 0x61, 0x20, 0x4D, 0x6F, 0x6E, 0x73, 0x61, 0x6C, 0x76, 0x65, - 0x2C, 0x20, 0x41, 0x6E, 0x67, 0x65, 0x6C, 0x69, 0x6E, 0x61, 0x20, 0x53, - 0x61, 0x6E, 0x63, 0x68, 0x65, 0x7A, 0x00, 0x00, 0x4D, 0x00, 0x61, 0x00, - 0x72, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x20, 0x00, - 0x4D, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, - 0x76, 0x00, 0x65, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6E, 0x00, - 0x67, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x61, 0x00, - 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x68, 0x00, - 0x65, 0x00, 0x7A, 0x00, 0x00, 0x4D, 0x61, 0x72, 0x69, 0x65, 0x6C, 0x61, - 0x20, 0x4D, 0x6F, 0x6E, 0x73, 0x61, 0x6C, 0x76, 0x65, 0x2C, 0x20, 0x41, - 0x6E, 0x67, 0x65, 0x6C, 0x69, 0x6E, 0x61, 0x20, 0x53, 0x61, 0x6E, 0x63, - 0x68, 0x65, 0x7A, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2E, - 0x00, 0x61, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x69, - 0x00, 0x6E, 0x00, 0x61, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x63, - 0x00, 0x68, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, - 0x00, 0x6D, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x77, 0x77, - 0x77, 0x2E, 0x61, 0x6E, 0x67, 0x65, 0x6C, 0x69, 0x6E, 0x61, 0x73, 0x61, - 0x6E, 0x63, 0x68, 0x65, 0x7A, 0x2E, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x72, - 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2E, 0x00, 0x6D, 0x00, - 0x75, 0x00, 0x6B, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6E, 0x00, - 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x65, 0x00, 0x2E, 0x00, - 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x2E, 0x00, 0x61, 0x00, 0x72, 0x00, - 0x00, 0x77, 0x77, 0x77, 0x2E, 0x6D, 0x75, 0x6B, 0x61, 0x6D, 0x6F, 0x6E, - 0x73, 0x61, 0x6C, 0x76, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x72, - 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, - 0x46, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, - 0x6F, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, - 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6C, 0x00, - 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x65, 0x00, - 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, - 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, - 0x53, 0x00, 0x49, 0x00, 0x4C, 0x00, 0x20, 0x00, 0x4F, 0x00, 0x70, 0x00, - 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6F, 0x00, 0x6E, 0x00, - 0x74, 0x00, 0x20, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, - 0x6E, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x56, 0x00, - 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, - 0x20, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x20, 0x00, - 0x54, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6C, 0x00, - 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x65, 0x00, - 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x76, 0x00, - 0x61, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6C, 0x00, - 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, - 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x46, 0x00, 0x41, 0x00, 0x51, 0x00, - 0x20, 0x00, 0x61, 0x00, 0x74, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x68, 0x00, - 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3A, 0x00, 0x2F, 0x00, 0x2F, 0x00, - 0x73, 0x00, 0x63, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x74, 0x00, - 0x73, 0x00, 0x2E, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x2E, 0x00, - 0x6F, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2F, 0x00, 0x4F, 0x00, 0x46, 0x00, - 0x4C, 0x00, 0x00, 0x54, 0x68, 0x69, 0x73, 0x20, 0x46, 0x6F, 0x6E, 0x74, - 0x20, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, - 0x20, 0x6C, 0x69, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6E, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x49, 0x4C, 0x20, - 0x4F, 0x70, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x20, 0x4C, 0x69, - 0x63, 0x65, 0x6E, 0x73, 0x65, 0x2C, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6F, 0x6E, 0x20, 0x31, 0x2E, 0x31, 0x2E, 0x20, 0x54, 0x68, 0x69, 0x73, - 0x20, 0x6C, 0x69, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x20, 0x69, 0x73, 0x20, - 0x61, 0x76, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x61, 0x20, 0x46, 0x41, 0x51, 0x20, 0x61, 0x74, 0x3A, - 0x20, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x73, 0x2E, 0x73, 0x69, 0x6C, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x4F, 0x46, 0x4C, 0x00, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, - 0x00, 0x3A, 0x00, 0x2F, 0x00, 0x2F, 0x00, 0x73, 0x00, 0x63, 0x00, 0x72, - 0x00, 0x69, 0x00, 0x70, 0x00, 0x74, 0x00, 0x73, 0x00, 0x2E, 0x00, 0x73, - 0x00, 0x69, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x67, - 0x00, 0x2F, 0x00, 0x4F, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x00, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, - 0x2E, 0x73, 0x69, 0x6C, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x4F, 0x46, 0x4C, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xB5, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, - 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0A, - 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x10, - 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, - 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x1C, - 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, - 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, - 0x00, 0x29, 0x00, 0x2A, 0x00, 0x2B, 0x00, 0x2C, 0x00, 0x2D, 0x00, 0x2E, - 0x00, 0x2F, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, - 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3A, - 0x00, 0x3B, 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x40, - 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, - 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, - 0x00, 0x4D, 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, - 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, - 0x00, 0x59, 0x00, 0x5A, 0x00, 0x5B, 0x00, 0x5C, 0x00, 0x5D, 0x00, 0x5E, - 0x00, 0x5F, 0x00, 0x60, 0x00, 0x61, 0x00, 0xA3, 0x00, 0x84, 0x00, 0x85, - 0x00, 0xBD, 0x00, 0x96, 0x00, 0xE8, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x8B, - 0x00, 0x9D, 0x00, 0xA9, 0x00, 0xA4, 0x01, 0x02, 0x00, 0x8A, 0x00, 0xDA, - 0x00, 0x83, 0x00, 0x93, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0x8D, 0x00, 0x97, - 0x00, 0x88, 0x00, 0xC3, 0x00, 0xDE, 0x00, 0xF1, 0x00, 0x9E, 0x00, 0xAA, - 0x00, 0xF5, 0x00, 0xF4, 0x00, 0xF6, 0x00, 0xA2, 0x00, 0xAD, 0x00, 0xC9, - 0x00, 0xC7, 0x00, 0xAE, 0x00, 0x62, 0x00, 0x63, 0x00, 0x90, 0x00, 0x64, - 0x00, 0xCB, 0x00, 0x65, 0x00, 0xC8, 0x00, 0xCA, 0x00, 0xCF, 0x00, 0xCC, - 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xE9, 0x00, 0x66, 0x00, 0xD3, 0x00, 0xD0, - 0x00, 0xD1, 0x00, 0xAF, 0x00, 0x67, 0x00, 0xF0, 0x00, 0x91, 0x00, 0xD6, - 0x00, 0xD4, 0x00, 0xD5, 0x00, 0x68, 0x00, 0xEB, 0x00, 0xED, 0x00, 0x89, - 0x00, 0x6A, 0x00, 0x69, 0x00, 0x6B, 0x00, 0x6D, 0x00, 0x6C, 0x00, 0x6E, - 0x00, 0xA0, 0x00, 0x6F, 0x00, 0x71, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, - 0x00, 0x75, 0x00, 0x74, 0x00, 0x76, 0x00, 0x77, 0x00, 0xEA, 0x00, 0x78, - 0x00, 0x7A, 0x00, 0x79, 0x00, 0x7B, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0xB8, - 0x00, 0xA1, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0x80, 0x00, 0x81, 0x00, 0xEC, - 0x00, 0xEE, 0x00, 0xBA, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x00, 0xD7, - 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x0B, - 0x01, 0x0C, 0x01, 0x0D, 0x00, 0xE2, 0x00, 0xE3, 0x01, 0x0E, 0x01, 0x0F, - 0x00, 0xB0, 0x00, 0xB1, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, - 0x01, 0x14, 0x01, 0x15, 0x00, 0xD8, 0x00, 0xE1, 0x00, 0xDD, 0x00, 0xD9, - 0x01, 0x16, 0x00, 0xB2, 0x00, 0xB3, 0x00, 0xB6, 0x00, 0xB7, 0x00, 0xC4, - 0x00, 0xB4, 0x00, 0xB5, 0x00, 0xC5, 0x00, 0x87, 0x00, 0xBE, 0x00, 0xBF, - 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x01, 0x1C, - 0x01, 0x1D, 0x01, 0x1E, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x21, 0x07, 0x75, - 0x6E, 0x69, 0x30, 0x30, 0x41, 0x44, 0x04, 0x68, 0x62, 0x61, 0x72, 0x06, - 0x49, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x06, 0x69, 0x74, 0x69, 0x6C, 0x64, - 0x65, 0x02, 0x49, 0x4A, 0x02, 0x69, 0x6A, 0x0B, 0x4A, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x0B, 0x6A, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x0C, 0x6B, 0x63, 0x6F, 0x6D, - 0x6D, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6E, 0x74, 0x0C, 0x6B, 0x67, 0x72, - 0x65, 0x65, 0x6E, 0x6C, 0x61, 0x6E, 0x64, 0x69, 0x63, 0x0A, 0x4C, 0x64, - 0x6F, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6E, 0x74, 0x04, 0x6C, 0x64, 0x6F, - 0x74, 0x06, 0x4E, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x6E, 0x61, 0x63, - 0x75, 0x74, 0x65, 0x06, 0x52, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0C, 0x52, - 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6E, 0x74, 0x0C, - 0x72, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6E, 0x74, - 0x06, 0x52, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x06, 0x72, 0x63, 0x61, 0x72, - 0x6F, 0x6E, 0x08, 0x64, 0x6F, 0x74, 0x6C, 0x65, 0x73, 0x73, 0x6A, 0x0C, - 0x64, 0x6F, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6E, 0x74, 0x63, 0x6D, 0x62, - 0x04, 0x45, 0x75, 0x72, 0x6F, 0x02, 0x43, 0x52, 0x0B, 0x63, 0x6F, 0x6D, - 0x6D, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6E, 0x74, 0x0C, 0x64, 0x69, 0x65, - 0x72, 0x65, 0x73, 0x69, 0x73, 0x2E, 0x63, 0x61, 0x70, 0x10, 0x64, 0x6F, - 0x74, 0x61, 0x63, 0x63, 0x65, 0x6E, 0x74, 0x63, 0x6D, 0x62, 0x2E, 0x63, - 0x61, 0x70, 0x09, 0x67, 0x72, 0x61, 0x76, 0x65, 0x2E, 0x63, 0x61, 0x70, - 0x09, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2E, 0x63, 0x61, 0x70, 0x0E, 0x63, - 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x2E, 0x63, 0x61, - 0x70, 0x08, 0x72, 0x69, 0x6E, 0x67, 0x2E, 0x63, 0x61, 0x70, 0x09, 0x63, - 0x61, 0x72, 0x6F, 0x6E, 0x2E, 0x63, 0x61, 0x70, 0x09, 0x74, 0x69, 0x6C, - 0x64, 0x65, 0x2E, 0x63, 0x61, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, - 0xFF, 0xFF, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0xC9, 0x89, 0x6F, 0x31, 0x00, 0x00, 0x00, 0x00, 0xCB, 0x2D, 0x04, 0x1A, - 0x00, 0x00, 0x00, 0x00, 0xCB, 0x2D, 0x09, 0xCB, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x0E, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x01, 0x00, 0x01, 0x00, 0xF3, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x30, - 0x00, 0x3E, 0x00, 0x02, 0x44, 0x46, 0x4C, 0x54, 0x00, 0x0E, 0x6C, 0x61, - 0x74, 0x6E, 0x00, 0x1A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x6B, 0x65, 0x72, 0x6E, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x04, 0xD4, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x2A, 0x00, 0x5E, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x7C, - 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xC4, 0x00, 0xE2, 0x00, 0xE8, - 0x01, 0x1A, 0x01, 0x30, 0x01, 0x3A, 0x01, 0x78, 0x01, 0x96, 0x01, 0xB0, - 0x01, 0xE6, 0x02, 0x14, 0x02, 0x1A, 0x02, 0x20, 0x02, 0x3A, 0x02, 0x68, - 0x02, 0x14, 0x02, 0x92, 0x02, 0xCC, 0x02, 0xD6, 0x03, 0x18, 0x03, 0x46, - 0x03, 0x70, 0x03, 0xDA, 0x04, 0x00, 0x04, 0x16, 0x04, 0x1C, 0x04, 0x3A, - 0x04, 0x48, 0x04, 0x86, 0x04, 0x90, 0x04, 0x9E, 0x04, 0xAC, 0x04, 0xB2, - 0x04, 0xC0, 0x04, 0xCE, 0x00, 0x03, 0x00, 0x3B, 0xFF, 0xFB, 0x00, 0x3C, - 0xFF, 0xFB, 0x00, 0x55, 0x00, 0x10, 0x00, 0x01, 0x00, 0x85, 0xFF, 0xF6, - 0x00, 0x02, 0x00, 0x17, 0xFF, 0xEC, 0x00, 0x1C, 0xFF, 0xFB, 0x00, 0x02, - 0x00, 0x17, 0xFF, 0xF1, 0x00, 0x1A, 0xFF, 0xF6, 0x00, 0x02, 0x00, 0x14, - 0xFF, 0xF4, 0x00, 0x1A, 0xFF, 0xF6, 0x00, 0x02, 0x00, 0x14, 0xFF, 0xF0, - 0x00, 0x85, 0xFF, 0xF6, 0x00, 0x0A, 0x00, 0x07, 0xFF, 0xF6, 0x00, 0x0E, - 0xFF, 0xE2, 0x00, 0x14, 0xFF, 0xEC, 0x00, 0x17, 0xFF, 0xF6, 0x00, 0x18, - 0xFF, 0xEA, 0x00, 0x1B, 0xFF, 0xEC, 0x00, 0x63, 0xFF, 0xD8, 0x00, 0x64, - 0xFF, 0xD8, 0x00, 0x85, 0xFF, 0xEC, 0x00, 0xA0, 0xFF, 0xF6, 0x00, 0x07, - 0x00, 0x0D, 0xFF, 0xD8, 0x00, 0x2A, 0xFF, 0xF4, 0x00, 0x37, 0xFF, 0xE4, - 0x00, 0x3C, 0xFF, 0xED, 0x00, 0x46, 0xFF, 0xFB, 0x00, 0x4A, 0xFF, 0xFB, - 0x00, 0x5C, 0xFF, 0xF6, 0x00, 0x01, 0x00, 0x5B, 0xFF, 0xFB, 0x00, 0x0C, - 0x00, 0x10, 0xFF, 0xEC, 0x00, 0x14, 0x00, 0x01, 0x00, 0x39, 0xFF, 0xF1, - 0x00, 0x3A, 0xFF, 0xFB, 0x00, 0x3C, 0xFF, 0xE6, 0x00, 0x44, 0xFF, 0xF6, - 0x00, 0x46, 0xFF, 0xF2, 0x00, 0x4A, 0xFF, 0xEC, 0x00, 0x59, 0xFF, 0xF4, - 0x00, 0x5A, 0xFF, 0xF6, 0x00, 0x5B, 0xFF, 0xF6, 0x00, 0x5C, 0xFF, 0xF1, - 0x00, 0x05, 0x00, 0x37, 0xFF, 0xF6, 0x00, 0x39, 0xFF, 0xF6, 0x00, 0x3B, - 0xFF, 0xF6, 0x00, 0x3C, 0xFF, 0xF4, 0x00, 0x3D, 0xFF, 0xF6, 0x00, 0x02, - 0x00, 0x39, 0xFF, 0xEE, 0x00, 0x3D, 0xFF, 0xEE, 0x00, 0x0F, 0x00, 0x0F, - 0xFF, 0xC4, 0x00, 0x1D, 0xFF, 0xE7, 0x00, 0x24, 0xFF, 0xE7, 0x00, 0x26, - 0xFF, 0xF8, 0x00, 0x2D, 0xFF, 0xF6, 0x00, 0x30, 0xFF, 0xF4, 0x00, 0x34, - 0xFF, 0xEC, 0x00, 0x38, 0xFF, 0xF3, 0x00, 0x39, 0xFF, 0xEC, 0x00, 0x3A, - 0xFF, 0xF6, 0x00, 0x3B, 0xFF, 0xF1, 0x00, 0x3C, 0xFF, 0xE7, 0x00, 0x44, - 0xFF, 0xEE, 0x00, 0x46, 0xFF, 0xE7, 0x00, 0x4A, 0xFF, 0xF1, 0x00, 0x07, - 0x00, 0x10, 0xFF, 0xFB, 0x00, 0x39, 0xFF, 0xEE, 0x00, 0x3B, 0xFF, 0xF6, - 0x00, 0x3C, 0xFF, 0xF6, 0x00, 0x44, 0xFF, 0xFB, 0x00, 0x46, 0xFF, 0xFB, - 0x00, 0x4D, 0xFF, 0xFB, 0x00, 0x06, 0x00, 0x24, 0xFF, 0xF8, 0x00, 0x39, - 0xFF, 0xF6, 0x00, 0x3C, 0xFF, 0xF6, 0x00, 0x3D, 0xFF, 0xF8, 0x00, 0x46, - 0xFF, 0xFB, 0x00, 0x5D, 0xFF, 0xFB, 0x00, 0x0D, 0x00, 0x10, 0xFF, 0xE2, - 0x00, 0x39, 0xFF, 0xF6, 0x00, 0x3C, 0xFF, 0xF4, 0x00, 0x3D, 0xFF, 0xF1, - 0x00, 0x44, 0xFF, 0xF6, 0x00, 0x46, 0xFF, 0xF2, 0x00, 0x49, 0xFF, 0xF1, - 0x00, 0x4A, 0xFF, 0xEC, 0x00, 0x56, 0xFF, 0xF6, 0x00, 0x58, 0xFF, 0xF6, - 0x00, 0x59, 0xFF, 0xF6, 0x00, 0x5A, 0xFF, 0xF1, 0x00, 0x5C, 0xFF, 0xF8, - 0x00, 0x0B, 0x00, 0x0D, 0xFF, 0xBA, 0x00, 0x10, 0xFF, 0xD7, 0x00, 0x2D, - 0x00, 0x1C, 0x00, 0x32, 0xFF, 0xEE, 0x00, 0x37, 0xFF, 0xDD, 0x00, 0x38, - 0xFF, 0xEC, 0x00, 0x39, 0xFF, 0xE2, 0x00, 0x3A, 0xFF, 0xF8, 0x00, 0x3C, - 0xFF, 0xD3, 0x00, 0x46, 0xFF, 0xF4, 0x00, 0x59, 0xFF, 0xF6, 0x00, 0x01, - 0x00, 0x3C, 0xFF, 0xF8, 0x00, 0x01, 0x00, 0x3C, 0xFF, 0xF6, 0x00, 0x06, - 0x00, 0x0F, 0xFF, 0xE6, 0x00, 0x1D, 0xFF, 0xEC, 0x00, 0x39, 0xFF, 0xF1, - 0x00, 0x3B, 0xFF, 0xF6, 0x00, 0x3C, 0xFF, 0xF6, 0x00, 0x3D, 0xFF, 0xF8, - 0x00, 0x0B, 0x00, 0x0F, 0xFF, 0xB5, 0x00, 0x1D, 0xFF, 0xE2, 0x00, 0x24, - 0xFF, 0xEA, 0x00, 0x30, 0xFF, 0xEE, 0x00, 0x38, 0xFF, 0xF7, 0x00, 0x39, - 0xFF, 0xF6, 0x00, 0x3C, 0xFF, 0xDD, 0x00, 0x3D, 0xFF, 0xEC, 0x00, 0x44, - 0xFF, 0xEC, 0x00, 0x46, 0xFF, 0xE2, 0x00, 0x4D, 0xFF, 0xF6, 0x00, 0x0A, - 0x00, 0x38, 0xFF, 0xF6, 0x00, 0x39, 0xFF, 0xEC, 0x00, 0x3A, 0xFF, 0xFD, - 0x00, 0x3B, 0xFF, 0xFA, 0x00, 0x3C, 0xFF, 0xEC, 0x00, 0x3D, 0xFF, 0xF6, - 0x00, 0x44, 0xFF, 0xEC, 0x00, 0x46, 0xFF, 0xEC, 0x00, 0x4A, 0xFF, 0xF1, - 0x00, 0x56, 0xFF, 0xFB, 0x00, 0x0E, 0x00, 0x0F, 0xFF, 0xCE, 0x00, 0x10, - 0xFF, 0xF8, 0x00, 0x1D, 0xFF, 0xE2, 0x00, 0x24, 0xFF, 0xEA, 0x00, 0x3A, - 0xFF, 0xF6, 0x00, 0x3C, 0xFF, 0xF8, 0x00, 0x44, 0xFF, 0xE4, 0x00, 0x46, - 0xFF, 0xDD, 0x00, 0x4A, 0xFF, 0xE2, 0x00, 0x55, 0xFF, 0xE6, 0x00, 0x56, - 0xFF, 0xEA, 0x00, 0x58, 0xFF, 0xDC, 0x00, 0x5C, 0xFF, 0xF6, 0x00, 0x5D, - 0xFF, 0xF1, 0x00, 0x02, 0x00, 0x3A, 0xFF, 0xF4, 0x00, 0x3C, 0xFF, 0xF8, - 0x00, 0x10, 0x00, 0x0F, 0xFF, 0xE7, 0x00, 0x1D, 0xFF, 0xF4, 0x00, 0x26, - 0xFF, 0xE8, 0x00, 0x28, 0xFF, 0xEE, 0x00, 0x2D, 0xFF, 0xEE, 0x00, 0x2E, - 0xFF, 0xF8, 0x00, 0x3C, 0xFF, 0xFB, 0x00, 0x3D, 0xFF, 0xF6, 0x00, 0x44, - 0xFF, 0xF4, 0x00, 0x46, 0xFF, 0xF1, 0x00, 0x4A, 0xFF, 0xF6, 0x00, 0x55, - 0xFF, 0xF4, 0x00, 0x56, 0xFF, 0xF1, 0x00, 0x58, 0xFF, 0xF1, 0x00, 0x59, - 0xFF, 0xF6, 0x00, 0x5C, 0xFF, 0xEE, 0x00, 0x0B, 0x00, 0x0F, 0xFF, 0xE2, - 0x00, 0x1D, 0xFF, 0xE7, 0x00, 0x26, 0xFF, 0xEE, 0x00, 0x37, 0xFF, 0xF6, - 0x00, 0x38, 0xFF, 0xF4, 0x00, 0x39, 0xFF, 0xFA, 0x00, 0x3C, 0xFF, 0xFB, - 0x00, 0x3D, 0xFF, 0xFB, 0x00, 0x44, 0xFF, 0xF9, 0x00, 0x46, 0xFF, 0xF4, - 0x00, 0x56, 0xFF, 0xF4, 0x00, 0x0A, 0x00, 0x10, 0xFF, 0xFB, 0x00, 0x26, - 0xFF, 0xE8, 0x00, 0x28, 0xFF, 0xEE, 0x00, 0x3C, 0xFF, 0xF6, 0x00, 0x3D, - 0xFF, 0xFA, 0x00, 0x44, 0xFF, 0xF6, 0x00, 0x46, 0xFF, 0xEC, 0x00, 0x4A, - 0xFF, 0xEC, 0x00, 0x56, 0xFF, 0xEC, 0x00, 0x59, 0xFF, 0xF7, 0x00, 0x1A, - 0x00, 0x0F, 0xFF, 0xC4, 0x00, 0x10, 0xFF, 0xFB, 0x00, 0x1D, 0xFF, 0xDE, - 0x00, 0x24, 0xFF, 0xF1, 0x00, 0x26, 0xFF, 0xEC, 0x00, 0x28, 0xFF, 0xEC, - 0x00, 0x2B, 0xFF, 0xEE, 0x00, 0x2D, 0xFF, 0xF6, 0x00, 0x2E, 0xFF, 0xF8, - 0x00, 0x30, 0xFF, 0xF8, 0x00, 0x31, 0xFF, 0xF6, 0x00, 0x35, 0xFF, 0xEC, - 0x00, 0x36, 0xFF, 0xF8, 0x00, 0x37, 0xFF, 0xF8, 0x00, 0x38, 0xFF, 0xF8, - 0x00, 0x39, 0xFF, 0xFB, 0x00, 0x3A, 0xFF, 0xFB, 0x00, 0x3B, 0xFF, 0xF6, - 0x00, 0x3D, 0xFF, 0xF4, 0x00, 0x44, 0xFF, 0xF4, 0x00, 0x46, 0xFF, 0xE7, - 0x00, 0x4A, 0xFF, 0xE7, 0x00, 0x56, 0xFF, 0xF4, 0x00, 0x59, 0xFF, 0xF6, - 0x00, 0x5A, 0xFF, 0xFB, 0x00, 0x5D, 0xFF, 0xFB, 0x00, 0x09, 0x00, 0x10, - 0xFF, 0xFB, 0x00, 0x24, 0xFF, 0xF8, 0x00, 0x26, 0xFF, 0xEC, 0x00, 0x38, - 0xFF, 0xF1, 0x00, 0x3A, 0xFF, 0xFD, 0x00, 0x3B, 0xFF, 0xFA, 0x00, 0x3C, - 0xFF, 0xF8, 0x00, 0x46, 0xFF, 0xF1, 0x00, 0x4A, 0xFF, 0xEC, 0x00, 0x05, - 0x00, 0x04, 0x00, 0x0A, 0x00, 0x0D, 0x00, 0x28, 0x00, 0x0F, 0xFF, 0xE2, - 0x00, 0x10, 0xFF, 0xFA, 0x00, 0x22, 0x00, 0x14, 0x00, 0x01, 0x00, 0x4D, - 0x00, 0x05, 0x00, 0x07, 0x00, 0x44, 0xFF, 0xFA, 0x00, 0x46, 0xFF, 0xF1, - 0x00, 0x4A, 0xFF, 0xFA, 0x00, 0x56, 0xFF, 0xF9, 0x00, 0x5B, 0xFF, 0xF8, - 0x00, 0x5C, 0xFF, 0xFA, 0x00, 0x5D, 0x00, 0x05, 0x00, 0x03, 0x00, 0x59, - 0xFF, 0xF6, 0x00, 0x5C, 0xFF, 0xF8, 0x00, 0x5D, 0xFF, 0xF6, 0x00, 0x0F, - 0x00, 0x0D, 0x00, 0x28, 0x00, 0x0F, 0xFF, 0xDD, 0x00, 0x10, 0xFF, 0xCE, - 0x00, 0x1D, 0xFF, 0xE7, 0x00, 0x44, 0xFF, 0xF6, 0x00, 0x46, 0xFF, 0xEC, - 0x00, 0x4A, 0xFF, 0xF0, 0x00, 0x4D, 0xFF, 0xE7, 0x00, 0x53, 0xFF, 0xF6, - 0x00, 0x56, 0xFF, 0xF4, 0x00, 0x59, 0xFF, 0xF4, 0x00, 0x5A, 0xFF, 0xF6, - 0x00, 0x5B, 0xFF, 0xF6, 0x00, 0x5C, 0xFF, 0xF6, 0x00, 0x5D, 0xFF, 0xF6, - 0x00, 0x02, 0x00, 0x4A, 0xFF, 0xFA, 0x00, 0x5C, 0xFF, 0xF8, 0x00, 0x03, - 0x00, 0x0F, 0xFF, 0xD8, 0x00, 0x1D, 0xFF, 0xF8, 0x00, 0x4A, 0xFF, 0xF0, - 0x00, 0x03, 0x00, 0x0F, 0xFF, 0xD8, 0x00, 0x1D, 0xFF, 0xE7, 0x00, 0x5D, - 0xFF, 0xFA, 0x00, 0x01, 0x00, 0x4A, 0xFF, 0xF6, 0x00, 0x03, 0x00, 0x0F, - 0xFF, 0xE7, 0x00, 0x4A, 0xFF, 0xEA, 0x00, 0x5D, 0xFF, 0xF6, 0x00, 0x03, - 0x00, 0x4A, 0xFF, 0xF6, 0x00, 0x5A, 0xFF, 0xFA, 0x00, 0x5C, 0xFF, 0xF8, - 0x00, 0x01, 0x00, 0x13, 0xFF, 0xF6, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x10, - 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x18, 0x00, 0x1A, - 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, - 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2F, 0x00, 0x30, 0x00, 0x31, - 0x00, 0x32, 0x00, 0x33, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, - 0x00, 0x39, 0x00, 0x3A, 0x00, 0x3B, 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x49, - 0x00, 0x4A, 0x00, 0x4E, 0x00, 0x53, 0x00, 0x55, 0x00, 0x57, 0x00, 0x59, - 0x00, 0x5A, 0x00, 0x5B, 0x00, 0x5C, 0x00, 0x5D, 0x00, 0x85, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x2C, 0x00, 0x2E, 0x00, 0x02, - 0x44, 0x46, 0x4C, 0x54, 0x00, 0x0E, 0x6C, 0x61, 0x74, 0x6E, 0x00, 0x18, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 -}; diff --git a/dependencies/reboot/vendor/ImGui/imconfig.h b/dependencies/reboot/vendor/ImGui/imconfig.h deleted file mode 100644 index e3dc27f..0000000 --- a/dependencies/reboot/vendor/ImGui/imconfig.h +++ /dev/null @@ -1,125 +0,0 @@ -//----------------------------------------------------------------------------- -// COMPILE-TIME OPTIONS FOR DEAR IMGUI -// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure. -// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions. -//----------------------------------------------------------------------------- -// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it) -// B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template. -//----------------------------------------------------------------------------- -// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp -// files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures. -// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts. -// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using. -//----------------------------------------------------------------------------- - -#pragma once - -//---- Define assertion handler. Defaults to calling assert(). -// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement. -//#define IM_ASSERT(_EXPR) MyAssert(_EXPR) -//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts - -//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows -// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. -// DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() -// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. -//#define IMGUI_API __declspec( dllexport ) -//#define IMGUI_API __declspec( dllimport ) - -//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names. -//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS -//#define IMGUI_DISABLE_OBSOLETE_KEYIO // 1.87: disable legacy io.KeyMap[]+io.KeysDown[] in favor io.AddKeyEvent(). This will be folded into IMGUI_DISABLE_OBSOLETE_FUNCTIONS in a few versions. - -//---- Disable all of Dear ImGui or don't implement standard windows/tools. -// It is very strongly recommended to NOT disable the demo windows and debug tool during development. They are extremely useful in day to day work. Please read comments in imgui_demo.cpp. -//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty. -//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. -//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowStackToolWindow() will be empty (this was called IMGUI_DISABLE_METRICS_WINDOW before 1.88). - -//---- Don't implement some functions to reduce linkage requirements. -//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a) -//#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW) -//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a) -//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime). -//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default). -//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf) -//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself. -//#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies) -//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function. -//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions(). -//#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available - -//---- Include imgui_user.h at the end of imgui.h as a convenience -//#define IMGUI_INCLUDE_IMGUI_USER_H - -//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) -//#define IMGUI_USE_BGRA_PACKED_COLOR - -//---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) -//#define IMGUI_USE_WCHAR32 - -//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version -// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files. -//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" -//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" -//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if enabled -//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION -//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION - -//---- Use stb_sprintf.h for a faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined) -// Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by stb_sprintf.h. -//#define IMGUI_USE_STB_SPRINTF - -//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui) -// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided). -// On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'. -//#define IMGUI_ENABLE_FREETYPE - -//---- Use stb_truetype to build and rasterize the font atlas (default) -// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend. -//#define IMGUI_ENABLE_STB_TRUETYPE - -//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4. -// This will be inlined as part of ImVec2 and ImVec4 class declarations. -/* -#define IM_VEC2_CLASS_EXTRA \ - constexpr ImVec2(const MyVec2& f) : x(f.x), y(f.y) {} \ - operator MyVec2() const { return MyVec2(x,y); } - -#define IM_VEC4_CLASS_EXTRA \ - constexpr 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 (default is 16-bit) is one way to allow large meshes with more than 64K vertices. -// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices). -// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer. -// Read about ImGuiBackendFlags_RendererHasVtxOffset for details. -//#define ImDrawIdx unsigned int - -//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) -//struct ImDrawList; -//struct ImDrawCmd; -//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); -//#define ImDrawCallback MyImDrawCallback - -//---- Debug Tools: Macro to break in Debugger -// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.) -//#define IM_DEBUG_BREAK IM_ASSERT(0) -//#define IM_DEBUG_BREAK __debugbreak() - -//---- Debug Tools: Have the Item Picker break in the ItemAdd() function instead of ItemHoverable(), -// (which comes earlier in the code, will catch a few extra items, allow picking items other than Hovered one.) -// This adds a small runtime cost which is why it is not enabled by default. -//#define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX - -//---- Debug Tools: Enable slower asserts -//#define IMGUI_DEBUG_PARANOID - -//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. -/* -namespace ImGui -{ - void MyFunction(const char* name, const MyMatrix44& v); -} -*/ diff --git a/dependencies/reboot/vendor/ImGui/imgui.cpp b/dependencies/reboot/vendor/ImGui/imgui.cpp deleted file mode 100644 index 5c00b63..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui.cpp +++ /dev/null @@ -1,13522 +0,0 @@ -// dear imgui, v1.89 WIP -// (main code and documentation) - -// Help: -// - Read FAQ at http://dearimgui.org/faq -// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. -// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. -// Read imgui.cpp for details, links and comments. - -// Resources: -// - FAQ http://dearimgui.org/faq -// - Homepage & latest https://github.com/ocornut/imgui -// - Releases & changelog https://github.com/ocornut/imgui/releases -// - Gallery https://github.com/ocornut/imgui/issues/5243 (please post your screenshots/video there!) -// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) -// - Glossary https://github.com/ocornut/imgui/wiki/Glossary -// - Issues & support https://github.com/ocornut/imgui/issues - -// Getting Started? -// - For first-time users having issues compiling/linking/running or issues loading fonts: -// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. - -// Developed by Omar Cornut and every direct or indirect contributors to the GitHub. -// See LICENSE.txt for copyright and licensing details (standard MIT License). -// This library is free but needs your support to sustain development and maintenance. -// Businesses: you can support continued development via invoiced technical support, maintenance and sponsoring contracts. Please reach out to "contact AT dearimgui.com". -// Individuals: you can support continued development via donations. See docs/README or web page. - -// It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library. -// Note that 'ImGui::' being a namespace, you can add functions into the namespace from your own source files, without -// modifying imgui.h or imgui.cpp. You may include imgui_internal.h to access internal data structures, but it doesn't -// come with any guarantee of forward compatibility. Discussing your changes on the GitHub Issue Tracker may lead you -// to a better solution or official support for them. - -/* - -Index of this file: - -DOCUMENTATION - -- MISSION STATEMENT -- END-USER GUIDE -- PROGRAMMER GUIDE - - READ FIRST - - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI - - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE - - HOW A SIMPLE APPLICATION MAY LOOK LIKE - - HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE - - USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS -- API BREAKING CHANGES (read me when you update!) -- FREQUENTLY ASKED QUESTIONS (FAQ) - - Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer) - -CODE -(search for "[SECTION]" in the code to find them) - -// [SECTION] INCLUDES -// [SECTION] FORWARD DECLARATIONS -// [SECTION] CONTEXT AND MEMORY ALLOCATORS -// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) -// [SECTION] MISC HELPERS/UTILITIES (Geometry functions) -// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions) -// [SECTION] MISC HELPERS/UTILITIES (File functions) -// [SECTION] MISC HELPERS/UTILITIES (ImText* functions) -// [SECTION] MISC HELPERS/UTILITIES (Color functions) -// [SECTION] ImGuiStorage -// [SECTION] ImGuiTextFilter -// [SECTION] ImGuiTextBuffer -// [SECTION] ImGuiListClipper -// [SECTION] STYLING -// [SECTION] RENDER HELPERS -// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) -// [SECTION] INPUTS -// [SECTION] ERROR CHECKING -// [SECTION] LAYOUT -// [SECTION] SCROLLING -// [SECTION] TOOLTIPS -// [SECTION] POPUPS -// [SECTION] KEYBOARD/GAMEPAD NAVIGATION -// [SECTION] DRAG AND DROP -// [SECTION] LOGGING/CAPTURING -// [SECTION] SETTINGS -// [SECTION] VIEWPORTS -// [SECTION] PLATFORM DEPENDENT HELPERS -// [SECTION] METRICS/DEBUGGER WINDOW -// [SECTION] DEBUG LOG WINDOW -// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) - -*/ - -//----------------------------------------------------------------------------- -// DOCUMENTATION -//----------------------------------------------------------------------------- - -/* - - MISSION STATEMENT - ================= - - - Easy to use to create code-driven and data-driven tools. - - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools. - - Easy to hack and improve. - - Minimize setup and maintenance. - - Minimize state storage on user side. - - Minimize state synchronization. - - Portable, minimize dependencies, run on target (consoles, phones, etc.). - - Efficient runtime and memory consumption. - - Designed for developers and content-creators, not the typical end-user! Some of the current weaknesses includes: - - - Doesn't look fancy, doesn't animate. - - Limited layout features, intricate layouts are typically crafted in code. - - - END-USER GUIDE - ============== - - - Double-click on title bar to collapse window. - - Click upper right corner to close a window, available when 'bool* p_open' is passed to ImGui::Begin(). - - Click and drag on lower right corner to resize window (double-click to auto fit window to its contents). - - Click and drag on any empty space to move window. - - TAB/SHIFT+TAB to cycle through keyboard editable fields. - - CTRL+Click on a slider or drag box to input value as text. - - Use mouse wheel to scroll. - - Text editor: - - Hold SHIFT or use mouse to select text. - - CTRL+Left/Right to word jump. - - CTRL+Shift+Left/Right to select words. - - CTRL+A our Double-Click to select all. - - CTRL+X,CTRL+C,CTRL+V to use OS clipboard/ - - CTRL+Z,CTRL+Y to undo/redo. - - ESCAPE to revert text to its original value. - - Controls are automatically adjusted for OSX to match standard OSX text editing operations. - - General Keyboard controls: enable with ImGuiConfigFlags_NavEnableKeyboard. - - General Gamepad controls: enable with ImGuiConfigFlags_NavEnableGamepad. Download controller mapping PNG/PSD at http://dearimgui.org/controls_sheets - - - PROGRAMMER GUIDE - ================ - - READ FIRST - ---------- - - Remember to check the wonderful Wiki (https://github.com/ocornut/imgui/wiki) - - Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction or - destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, fewer bugs. - - Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features. - - The library is designed to be built from sources. Avoid pre-compiled binaries and packaged versions. See imconfig.h to configure your build. - - Dear ImGui is an implementation of the IMGUI paradigm (immediate-mode graphical user interface, a term coined by Casey Muratori). - You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links in Wiki. - - Dear ImGui is a "single pass" rasterizing implementation of the IMGUI paradigm, aimed at ease of use and high-performances. - For every application frame, your UI code will be called only once. This is in contrast to e.g. Unity's implementation of an IMGUI, - where the UI code is called multiple times ("multiple passes") from a single entry point. There are pros and cons to both approaches. - - Our origin is on the top-left. In axis aligned bounding boxes, Min = top-left, Max = bottom-right. - - This codebase is also optimized to yield decent performances with typical "Debug" builds settings. - - Please make sure you have asserts enabled (IM_ASSERT redirects to assert() by default, but can be redirected). - If you get an assert, read the messages and comments around the assert. - - C++: this is a very C-ish codebase: we don't rely on C++11, we don't include any C++ headers, and ImGui:: is a namespace. - - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types. - See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that. - However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase. - - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!). - - - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI - ---------------------------------------------- - - Overwrite all the sources files except for imconfig.h (if you have modified your copy of imconfig.h) - - Or maintain your own branch where you have imconfig.h modified as a top-most commit which you can regularly rebase over "master". - - You can also use '#define IMGUI_USER_CONFIG "my_config_file.h" to redirect configuration to your own file. - - Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes. - If a function/type has been renamed / or marked obsolete, try to fix the name in your code before it is permanently removed - from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will - likely be a comment about it. Please report any issue to the GitHub page! - - To find out usage of old API, you can add '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in your configuration file. - - Try to keep your copy of Dear ImGui reasonably up to date. - - - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE - --------------------------------------------------------------- - - Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library. - - In the majority of cases you should be able to use unmodified backends files available in the backends/ folder. - - Add the Dear ImGui source files + selected backend source files to your projects or using your preferred build system. - It is recommended you build and statically link the .cpp files as part of your project and NOT as a shared library (DLL). - - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating Dear ImGui types with your own maths types. - - When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them. - - Dear ImGui never touches or knows about your GPU state. The only function that knows about GPU is the draw function that you provide. - Effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render" - phases of your own application. All rendering information is stored into command-lists that you will retrieve after calling ImGui::Render(). - - Refer to the backends and demo applications in the examples/ folder for instruction on how to setup your code. - - If you are running over a standard OS with a common graphics API, you should be able to use unmodified imgui_impl_*** files from the examples/ folder. - - - HOW A SIMPLE APPLICATION MAY LOOK LIKE - -------------------------------------- - EXHIBIT 1: USING THE EXAMPLE BACKENDS (= imgui_impl_XXX.cpp files from the backends/ folder). - The sub-folders in examples/ contain examples applications following this structure. - - // Application init: create a dear imgui context, setup some options, load fonts - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); - // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls. - // TODO: Fill optional fields of the io structure later. - // TODO: Load TTF/OTF fonts if you don't want to use the default font. - - // Initialize helper Platform and Renderer backends (here we are using imgui_impl_win32.cpp and imgui_impl_dx11.cpp) - ImGui_ImplWin32_Init(hwnd); - ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); - - // Application main loop - while (true) - { - // Feed inputs to dear imgui, start new frame - ImGui_ImplDX11_NewFrame(); - ImGui_ImplWin32_NewFrame(); - ImGui::NewFrame(); - - // Any application code here - ImGui::Text("Hello, world!"); - - // Render dear imgui into screen - ImGui::Render(); - ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - g_pSwapChain->Present(1, 0); - } - - // Shutdown - ImGui_ImplDX11_Shutdown(); - ImGui_ImplWin32_Shutdown(); - ImGui::DestroyContext(); - - EXHIBIT 2: IMPLEMENTING CUSTOM BACKEND / CUSTOM ENGINE - - // Application init: create a dear imgui context, setup some options, load fonts - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); - // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls. - // TODO: Fill optional fields of the io structure later. - // TODO: Load TTF/OTF fonts if you don't want to use the default font. - - // Build and load the texture atlas into a texture - // (In the examples/ app this is usually done within the ImGui_ImplXXX_Init() function from one of the demo Renderer) - int width, height; - unsigned char* pixels = NULL; - io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); - - // At this point you've got the texture data and you need to upload that to your graphic system: - // After we have created the texture, store its pointer/identifier (_in whichever format your engine uses_) in 'io.Fonts->TexID'. - // This will be passed back to your via the renderer. Basically ImTextureID == void*. Read FAQ for details about ImTextureID. - MyTexture* texture = MyEngine::CreateTextureFromMemoryPixels(pixels, width, height, TEXTURE_TYPE_RGBA32) - io.Fonts->SetTexID((void*)texture); - - // Application main loop - while (true) - { - // Setup low-level inputs, e.g. on Win32: calling GetKeyboardState(), or write to those fields from your Windows message handlers, etc. - // (In the examples/ app this is usually done within the ImGui_ImplXXX_NewFrame() function from one of the demo Platform Backends) - io.DeltaTime = 1.0f/60.0f; // set the time elapsed since the previous frame (in seconds) - io.DisplaySize.x = 1920.0f; // set the current display width - io.DisplaySize.y = 1280.0f; // set the current display height here - io.AddMousePosEvent(mouse_x, mouse_y); // update mouse position - io.AddMouseButtonEvent(0, mouse_b[0]); // update mouse button states - io.AddMouseButtonEvent(1, mouse_b[1]); // update mouse button states - - // Call NewFrame(), after this point you can use ImGui::* functions anytime - // (So you want to try calling NewFrame() as early as you can in your main loop to be able to use Dear ImGui everywhere) - ImGui::NewFrame(); - - // Most of your application code here - ImGui::Text("Hello, world!"); - MyGameUpdate(); // may use any Dear ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End(); - MyGameRender(); // may use any Dear ImGui functions as well! - - // Render dear imgui, swap buffers - // (You want to try calling EndFrame/Render as late as you can, to be able to use Dear ImGui in your own game rendering code) - ImGui::EndFrame(); - ImGui::Render(); - ImDrawData* draw_data = ImGui::GetDrawData(); - MyImGuiRenderFunction(draw_data); - SwapBuffers(); - } - - // Shutdown - ImGui::DestroyContext(); - - To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest of your application, - you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! - Please read the FAQ and example applications for details about this! - - - HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE - --------------------------------------------- - The backends in impl_impl_XXX.cpp files contain many working implementations of a rendering function. - - void void MyImGuiRenderFunction(ImDrawData* draw_data) - { - // TODO: Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled - // TODO: Setup texture sampling state: sample with bilinear filtering (NOT point/nearest filtering). Use 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines;' to allow point/nearest filtering. - // TODO: Setup viewport covering draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize - // TODO: Setup orthographic projection matrix cover draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize - // TODO: Setup shader: vertex { float2 pos, float2 uv, u32 color }, fragment shader sample color from 1 texture, multiply by vertex color. - ImVec2 clip_off = draw_data->DisplayPos; - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawList* cmd_list = draw_data->CmdLists[n]; - const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by Dear ImGui - const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by Dear ImGui - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) - { - const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; - if (pcmd->UserCallback) - { - pcmd->UserCallback(cmd_list, pcmd); - } - else - { - // Project scissor/clipping rectangles into framebuffer space - ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); - ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); - if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) - continue; - - // We are using scissoring to clip some objects. All low-level graphics API should support it. - // - If your engine doesn't support scissoring yet, you may ignore this at first. You will get some small glitches - // (some elements visible outside their bounds) but you can fix that once everything else works! - // - Clipping coordinates are provided in imgui coordinates space: - // - For a given viewport, draw_data->DisplayPos == viewport->Pos and draw_data->DisplaySize == viewport->Size - // - In a single viewport application, draw_data->DisplayPos == (0,0) and draw_data->DisplaySize == io.DisplaySize, but always use GetMainViewport()->Pos/Size instead of hardcoding those values. - // - In the interest of supporting multi-viewport applications (see 'docking' branch on github), - // always subtract draw_data->DisplayPos from clipping bounds to convert them to your viewport space. - // - Note that pcmd->ClipRect contains Min+Max bounds. Some graphics API may use Min+Max, other may use Min+Size (size being Max-Min) - MyEngineSetScissor(clip_min.x, clip_min.y, clip_max.x, clip_max.y); - - // The texture for the draw call is specified by pcmd->GetTexID(). - // The vast majority of draw calls will use the Dear ImGui texture atlas, which value you have set yourself during initialization. - MyEngineBindTexture((MyTexture*)pcmd->GetTexID()); - - // Render 'pcmd->ElemCount/3' indexed triangles. - // By default the indices ImDrawIdx are 16-bit, you can change them to 32-bit in imconfig.h if your engine doesn't support 16-bit indices. - MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset, vtx_buffer, pcmd->VtxOffset); - } - } - } - } - - - USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS - ------------------------------------------ - - The gamepad/keyboard navigation is fairly functional and keeps being improved. - - Gamepad support is particularly useful to use Dear ImGui on a console system (e.g. PlayStation, Switch, Xbox) without a mouse! - - The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable. - - Keyboard: - - Application: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable. - - When keyboard navigation is active (io.NavActive + ImGuiConfigFlags_NavEnableKeyboard), - the io.WantCaptureKeyboard flag will be set. For more advanced uses, you may want to read from: - - io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set. - - io.NavVisible: true when the navigation cursor is visible (and usually goes false when mouse is used). - - or query focus information with e.g. IsWindowFocused(ImGuiFocusedFlags_AnyWindow), IsItemFocused() etc. functions. - Please reach out if you think the game vs navigation input sharing could be improved. - - Gamepad: - - Application: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable. - - Backend: Set io.BackendFlags |= ImGuiBackendFlags_HasGamepad + call io.AddKeyEvent/AddKeyAnalogEvent() with ImGuiKey_Gamepad_XXX keys. - For analog values (0.0f to 1.0f), backend is responsible to handling a dead-zone and rescaling inputs accordingly. - Backend code will probably need to transform your raw inputs (such as e.g. remapping your 0.2..0.9 raw input range to 0.0..1.0 imgui range, etc.). - - BEFORE 1.87, BACKENDS USED TO WRITE TO io.NavInputs[]. This is now obsolete. Please call io functions instead! - - You can download PNG/PSD files depicting the gamepad controls for common controllers at: http://dearimgui.org/controls_sheets - - If you need to share inputs between your game and the Dear ImGui interface, the easiest approach is to go all-or-nothing, - with a buttons combo to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved. - - Mouse: - - PS4/PS5 users: Consider emulating a mouse cursor with DualShock4 touch pad or a spare analog stick as a mouse-emulation fallback. - - Consoles/Tablet/Phone users: Consider using a Synergy 1.x server (on your PC) + uSynergy.c (on your console/tablet/phone app) to share your PC mouse/keyboard. - - On a TV/console system where readability may be lower or mouse inputs may be awkward, you may want to set the ImGuiConfigFlags_NavEnableSetMousePos flag. - Enabling ImGuiConfigFlags_NavEnableSetMousePos + ImGuiBackendFlags_HasSetMousePos instructs dear imgui to move your mouse cursor along with navigation movements. - When enabled, the NewFrame() function may alter 'io.MousePos' and set 'io.WantSetMousePos' to notify you that it wants the mouse cursor to be moved. - When that happens your backend NEEDS to move the OS or underlying mouse cursor on the next frame. Some of the backends in examples/ do that. - (If you set the NavEnableSetMousePos flag but don't honor 'io.WantSetMousePos' properly, imgui will misbehave as it will see your mouse moving back and forth!) - (In a setup when you may not have easy control over the mouse cursor, e.g. uSynergy.c doesn't expose moving remote mouse cursor, you may want - to set a boolean to ignore your other external mouse positions until the external source is moved again.) - - - API BREAKING CHANGES - ==================== - - Occasionally introducing changes that are breaking the API. We try to make the breakage minor and easy to fix. - Below is a change-log of API breaking changes only. If you are using one of the functions listed, expect to have to fix some code. - When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files. - You can read releases logs https://github.com/ocornut/imgui/releases for more details. - - - 2022/07/08 (1.88) - inputs: removed io.NavInputs[] and ImGuiNavInput enum (following 1.87 changes). - - Official backends from 1.87+ -> no issue. - - Official backends from 1.60 to 1.86 -> will build and convert gamepad inputs, unless IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Need updating! - - Custom backends not writing to io.NavInputs[] -> no issue. - - Custom backends writing to io.NavInputs[] -> will build and convert gamepad inputs, unless IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Need fixing! - - TL;DR: Backends should call io.AddKeyEvent()/io.AddKeyAnalogEvent() with ImGuiKey_GamepadXXX values instead of filling io.NavInput[]. - - 2022/06/15 (1.88) - renamed IMGUI_DISABLE_METRICS_WINDOW to IMGUI_DISABLE_DEBUG_TOOLS for correctness. kept support for old define (will obsolete). - - 2022/05/03 (1.88) - backends: osx: removed ImGui_ImplOSX_HandleEvent() from backend API in favor of backend automatically handling event capture. All ImGui_ImplOSX_HandleEvent() calls should be removed as they are now unnecessary. - - 2022/04/05 (1.88) - inputs: renamed ImGuiKeyModFlags to ImGuiModFlags. Kept inline redirection enums (will obsolete). This was never used in public API functions but technically present in imgui.h and ImGuiIO. - - 2022/01/20 (1.87) - inputs: reworded gamepad IO. - - Backend writing to io.NavInputs[] -> backend should call io.AddKeyEvent()/io.AddKeyAnalogEvent() with ImGuiKey_GamepadXXX values. - - 2022/01/19 (1.87) - sliders, drags: removed support for legacy arithmetic operators (+,+-,*,/) when inputing text. This doesn't break any api/code but a feature that used to be accessible by end-users (which seemingly no one used). - - 2022/01/17 (1.87) - inputs: reworked mouse IO. - - Backend writing to io.MousePos -> backend should call io.AddMousePosEvent() - - Backend writing to io.MouseDown[] -> backend should call io.AddMouseButtonEvent() - - Backend writing to io.MouseWheel -> backend should call io.AddMouseWheelEvent() - - Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only] - note: for all calls to IO new functions, the Dear ImGui context should be bound/current. - read https://github.com/ocornut/imgui/issues/4921 for details. - - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details. - - IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX) - - IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX) - - Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes). - - Backend writing to io.KeyCtrl, io.KeyShift.. -> backend should call io.AddKeyEvent() with ImGuiKey_ModXXX values. *IF YOU PULLED CODE BETWEEN 2021/01/10 and 2021/01/27: We used to have a io.AddKeyModsEvent() function which was now replaced by io.AddKeyEvent() with ImGuiKey_ModXXX values.* - - one case won't work with backward compatibility: if your custom backend used ImGuiKey as mock native indices (e.g. "io.KeyMap[ImGuiKey_A] = ImGuiKey_A") because those values are now larger than the legacy KeyDown[] array. Will assert. - - inputs: added ImGuiKey_ModCtrl/ImGuiKey_ModShift/ImGuiKey_ModAlt/ImGuiKey_ModSuper values to submit keyboard modifiers using io.AddKeyEvent(), instead of writing directly to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper. - - 2022/01/05 (1.87) - inputs: renamed ImGuiKey_KeyPadEnter to ImGuiKey_KeypadEnter to align with new symbols. Kept redirection enum. - - 2022/01/05 (1.87) - removed io.ImeSetInputScreenPosFn() in favor of more flexible io.SetPlatformImeDataFn(). Removed 'void* io.ImeWindowHandle' in favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'. - - 2022/01/01 (1.87) - commented out redirecting functions/enums names that were marked obsolete in 1.69, 1.70, 1.71, 1.72 (March-July 2019) - - ImGui::SetNextTreeNodeOpen() -> use ImGui::SetNextItemOpen() - - ImGui::GetContentRegionAvailWidth() -> use ImGui::GetContentRegionAvail().x - - ImGui::TreeAdvanceToLabelPos() -> use ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetTreeNodeToLabelSpacing()); - - ImFontAtlas::CustomRect -> use ImFontAtlasCustomRect - - ImGuiColorEditFlags_RGB/HSV/HEX -> use ImGuiColorEditFlags_DisplayRGB/HSV/Hex - - 2021/12/20 (1.86) - backends: removed obsolete Marmalade backend (imgui_impl_marmalade.cpp) + example. Find last supported version at https://github.com/ocornut/imgui/wiki/Bindings - - 2021/11/04 (1.86) - removed CalcListClipping() function. Prefer using ImGuiListClipper which can return non-contiguous ranges. Please open an issue if you think you really need this function. - - 2021/08/23 (1.85) - removed GetWindowContentRegionWidth() function. keep inline redirection helper. can use 'GetWindowContentRegionMax().x - GetWindowContentRegionMin().x' instead for generally 'GetContentRegionAvail().x' is more useful. - - 2021/07/26 (1.84) - commented out redirecting functions/enums names that were marked obsolete in 1.67 and 1.69 (March 2019): - - ImGui::GetOverlayDrawList() -> use ImGui::GetForegroundDrawList() - - ImFont::GlyphRangesBuilder -> use ImFontGlyphRangesBuilder - - 2021/05/19 (1.83) - backends: obsoleted direct access to ImDrawCmd::TextureId in favor of calling ImDrawCmd::GetTexID(). - - if you are using official backends from the source tree: you have nothing to do. - - if you have copied old backend code or using your own: change access to draw_cmd->TextureId to draw_cmd->GetTexID(). - - 2021/03/12 (1.82) - upgraded ImDrawList::AddRect(), AddRectFilled(), PathRect() to use ImDrawFlags instead of ImDrawCornersFlags. - - ImDrawCornerFlags_TopLeft -> use ImDrawFlags_RoundCornersTopLeft - - ImDrawCornerFlags_BotRight -> use ImDrawFlags_RoundCornersBottomRight - - ImDrawCornerFlags_None -> use ImDrawFlags_RoundCornersNone etc. - flags now sanely defaults to 0 instead of 0x0F, consistent with all other flags in the API. - breaking: the default with rounding > 0.0f is now "round all corners" vs old implicit "round no corners": - - rounding == 0.0f + flags == 0 --> meant no rounding --> unchanged (common use) - - rounding > 0.0f + flags != 0 --> meant rounding --> unchanged (common use) - - rounding == 0.0f + flags != 0 --> meant no rounding --> unchanged (unlikely use) - - rounding > 0.0f + flags == 0 --> meant no rounding --> BREAKING (unlikely use): will now round all corners --> use ImDrawFlags_RoundCornersNone or rounding == 0.0f. - this ONLY matters for hard coded use of 0 + rounding > 0.0f. Use of named ImDrawFlags_RoundCornersNone (new) or ImDrawCornerFlags_None (old) are ok. - the old ImDrawCornersFlags used awkward default values of ~0 or 0xF (4 lower bits set) to signify "round all corners" and we sometimes encouraged using them as shortcuts. - legacy path still support use of hard coded ~0 or any value from 0x1 or 0xF. They will behave the same with legacy paths enabled (will assert otherwise). - - 2021/03/11 (1.82) - removed redirecting functions/enums names that were marked obsolete in 1.66 (September 2018): - - ImGui::SetScrollHere() -> use ImGui::SetScrollHereY() - - 2021/03/11 (1.82) - clarified that ImDrawList::PathArcTo(), ImDrawList::PathArcToFast() won't render with radius < 0.0f. Previously it sorts of accidentally worked but would generally lead to counter-clockwise paths and have an effect on anti-aliasing. - - 2021/03/10 (1.82) - upgraded ImDrawList::AddPolyline() and PathStroke() "bool closed" parameter to "ImDrawFlags flags". The matching ImDrawFlags_Closed value is guaranteed to always stay == 1 in the future. - - 2021/02/22 (1.82) - (*undone in 1.84*) win32+mingw: Re-enabled IME functions by default even under MinGW. In July 2016, issue #738 had me incorrectly disable those default functions for MinGW. MinGW users should: either link with -limm32, either set their imconfig file with '#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS'. - - 2021/02/17 (1.82) - renamed rarely used style.CircleSegmentMaxError (old default = 1.60f) to style.CircleTessellationMaxError (new default = 0.30f) as the meaning of the value changed. - - 2021/02/03 (1.81) - renamed ListBoxHeader(const char* label, ImVec2 size) to BeginListBox(). Kept inline redirection function (will obsolete). - - removed ListBoxHeader(const char* label, int items_count, int height_in_items = -1) in favor of specifying size. Kept inline redirection function (will obsolete). - - renamed ListBoxFooter() to EndListBox(). Kept inline redirection function (will obsolete). - - 2021/01/26 (1.81) - removed ImGuiFreeType::BuildFontAtlas(). Kept inline redirection function. Prefer using '#define IMGUI_ENABLE_FREETYPE', but there's a runtime selection path available too. The shared extra flags parameters (very rarely used) are now stored in ImFontAtlas::FontBuilderFlags. - - renamed ImFontConfig::RasterizerFlags (used by FreeType) to ImFontConfig::FontBuilderFlags. - - renamed ImGuiFreeType::XXX flags to ImGuiFreeTypeBuilderFlags_XXX for consistency with other API. - - 2020/10/12 (1.80) - removed redirecting functions/enums that were marked obsolete in 1.63 (August 2018): - - ImGui::IsItemDeactivatedAfterChange() -> use ImGui::IsItemDeactivatedAfterEdit(). - - ImGuiCol_ModalWindowDarkening -> use ImGuiCol_ModalWindowDimBg - - ImGuiInputTextCallback -> use ImGuiTextEditCallback - - ImGuiInputTextCallbackData -> use ImGuiTextEditCallbackData - - 2020/12/21 (1.80) - renamed ImDrawList::AddBezierCurve() to AddBezierCubic(), and PathBezierCurveTo() to PathBezierCubicCurveTo(). Kept inline redirection function (will obsolete). - - 2020/12/04 (1.80) - added imgui_tables.cpp file! Manually constructed project files will need the new file added! - - 2020/11/18 (1.80) - renamed undocumented/internals ImGuiColumnsFlags_* to ImGuiOldColumnFlags_* in prevision of incoming Tables API. - - 2020/11/03 (1.80) - renamed io.ConfigWindowsMemoryCompactTimer to io.ConfigMemoryCompactTimer as the feature will apply to other data structures - - 2020/10/14 (1.80) - backends: moved all backends files (imgui_impl_XXXX.cpp, imgui_impl_XXXX.h) from examples/ to backends/. - - 2020/10/12 (1.80) - removed redirecting functions/enums that were marked obsolete in 1.60 (April 2018): - - io.RenderDrawListsFn pointer -> use ImGui::GetDrawData() value and call the render function of your backend - - ImGui::IsAnyWindowFocused() -> use ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow) - - ImGui::IsAnyWindowHovered() -> use ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow) - - ImGuiStyleVar_Count_ -> use ImGuiStyleVar_COUNT - - ImGuiMouseCursor_Count_ -> use ImGuiMouseCursor_COUNT - - removed redirecting functions names that were marked obsolete in 1.61 (May 2018): - - InputFloat (... int decimal_precision ...) -> use InputFloat (... const char* format ...) with format = "%.Xf" where X is your value for decimal_precision. - - same for InputFloat2()/InputFloat3()/InputFloat4() variants taking a `int decimal_precision` parameter. - - 2020/10/05 (1.79) - removed ImGuiListClipper: Renamed constructor parameters which created an ambiguous alternative to using the ImGuiListClipper::Begin() function, with misleading edge cases (note: imgui_memory_editor <0.40 from imgui_club/ used this old clipper API. Update your copy if needed). - - 2020/09/25 (1.79) - renamed ImGuiSliderFlags_ClampOnInput to ImGuiSliderFlags_AlwaysClamp. Kept redirection enum (will obsolete sooner because previous name was added recently). - - 2020/09/25 (1.79) - renamed style.TabMinWidthForUnselectedCloseButton to style.TabMinWidthForCloseButton. - - 2020/09/21 (1.79) - renamed OpenPopupContextItem() back to OpenPopupOnItemClick(), reverting the change from 1.77. For varieties of reason this is more self-explanatory. - - 2020/09/21 (1.79) - removed return value from OpenPopupOnItemClick() - returned true on mouse release on an item - because it is inconsistent with other popup APIs and makes others misleading. It's also and unnecessary: you can use IsWindowAppearing() after BeginPopup() for a similar result. - - 2020/09/17 (1.79) - removed ImFont::DisplayOffset in favor of ImFontConfig::GlyphOffset. DisplayOffset was applied after scaling and not very meaningful/useful outside of being needed by the default ProggyClean font. If you scaled this value after calling AddFontDefault(), this is now done automatically. It was also getting in the way of better font scaling, so let's get rid of it now! - - 2020/08/17 (1.78) - obsoleted use of the trailing 'float power=1.0f' parameter for DragFloat(), DragFloat2(), DragFloat3(), DragFloat4(), DragFloatRange2(), DragScalar(), DragScalarN(), SliderFloat(), SliderFloat2(), SliderFloat3(), SliderFloat4(), SliderScalar(), SliderScalarN(), VSliderFloat() and VSliderScalar(). - replaced the 'float power=1.0f' argument with integer-based flags defaulting to 0 (as with all our flags). - worked out a backward-compatibility scheme so hopefully most C++ codebase should not be affected. in short, when calling those functions: - - if you omitted the 'power' parameter (likely!), you are not affected. - - if you set the 'power' parameter to 1.0f (same as previous default value): 1/ your compiler may warn on float>int conversion, 2/ everything else will work. 3/ you can replace the 1.0f value with 0 to fix the warning, and be technically correct. - - if you set the 'power' parameter to >1.0f (to enable non-linear editing): 1/ your compiler may warn on float>int conversion, 2/ code will assert at runtime, 3/ in case asserts are disabled, the code will not crash and enable the _Logarithmic flag. 4/ you can replace the >1.0f value with ImGuiSliderFlags_Logarithmic to fix the warning/assert and get a _similar_ effect as previous uses of power >1.0f. - see https://github.com/ocornut/imgui/issues/3361 for all details. - kept inline redirection functions (will obsolete) apart for: DragFloatRange2(), VSliderFloat(), VSliderScalar(). For those three the 'float power=1.0f' version was removed directly as they were most unlikely ever used. - for shared code, you can version check at compile-time with `#if IMGUI_VERSION_NUM >= 17704`. - - obsoleted use of v_min > v_max in DragInt, DragFloat, DragScalar to lock edits (introduced in 1.73, was not demoed nor documented very), will be replaced by a more generic ReadOnly feature. You may use the ImGuiSliderFlags_ReadOnly internal flag in the meantime. - - 2020/06/23 (1.77) - removed BeginPopupContextWindow(const char*, int mouse_button, bool also_over_items) in favor of BeginPopupContextWindow(const char*, ImGuiPopupFlags flags) with ImGuiPopupFlags_NoOverItems. - - 2020/06/15 (1.77) - renamed OpenPopupOnItemClick() to OpenPopupContextItem(). Kept inline redirection function (will obsolete). [NOTE: THIS WAS REVERTED IN 1.79] - - 2020/06/15 (1.77) - removed CalcItemRectClosestPoint() entry point which was made obsolete and asserting in December 2017. - - 2020/04/23 (1.77) - removed unnecessary ID (first arg) of ImFontAtlas::AddCustomRectRegular(). - - 2020/01/22 (1.75) - ImDrawList::AddCircle()/AddCircleFilled() functions don't accept negative radius any more. - - 2019/12/17 (1.75) - [undid this change in 1.76] made Columns() limited to 64 columns by asserting above that limit. While the current code technically supports it, future code may not so we're putting the restriction ahead. - - 2019/12/13 (1.75) - [imgui_internal.h] changed ImRect() default constructor initializes all fields to 0.0f instead of (FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX). If you used ImRect::Add() to create bounding boxes by adding multiple points into it, you may need to fix your initial value. - - 2019/12/08 (1.75) - removed redirecting functions/enums that were marked obsolete in 1.53 (December 2017): - - ShowTestWindow() -> use ShowDemoWindow() - - IsRootWindowFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootWindow) - - IsRootWindowOrAnyChildFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) - - SetNextWindowContentWidth(w) -> use SetNextWindowContentSize(ImVec2(w, 0.0f) - - GetItemsLineHeightWithSpacing() -> use GetFrameHeightWithSpacing() - - ImGuiCol_ChildWindowBg -> use ImGuiCol_ChildBg - - ImGuiStyleVar_ChildWindowRounding -> use ImGuiStyleVar_ChildRounding - - ImGuiTreeNodeFlags_AllowOverlapMode -> use ImGuiTreeNodeFlags_AllowItemOverlap - - IMGUI_DISABLE_TEST_WINDOWS -> use IMGUI_DISABLE_DEMO_WINDOWS - - 2019/12/08 (1.75) - obsoleted calling ImDrawList::PrimReserve() with a negative count (which was vaguely documented and rarely if ever used). Instead, we added an explicit PrimUnreserve() API. - - 2019/12/06 (1.75) - removed implicit default parameter to IsMouseDragging(int button = 0) to be consistent with other mouse functions (none of the other functions have it). - - 2019/11/21 (1.74) - ImFontAtlas::AddCustomRectRegular() now requires an ID larger than 0x110000 (instead of 0x10000) to conform with supporting Unicode planes 1-16 in a future update. ID below 0x110000 will now assert. - - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS to IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS for consistency. - - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_MATH_FUNCTIONS to IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS for consistency. - - 2019/10/22 (1.74) - removed redirecting functions/enums that were marked obsolete in 1.52 (October 2017): - - Begin() [old 5 args version] -> use Begin() [3 args], use SetNextWindowSize() SetNextWindowBgAlpha() if needed - - IsRootWindowOrAnyChildHovered() -> use IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows) - - AlignFirstTextHeightToWidgets() -> use AlignTextToFramePadding() - - SetNextWindowPosCenter() -> use SetNextWindowPos() with a pivot of (0.5f, 0.5f) - - ImFont::Glyph -> use ImFontGlyph - - 2019/10/14 (1.74) - inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function. - if you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix. - The function was triggering on: 0.0 and (delay+rate*N) where (N>=1). Fixed formula responds to (N>=0). Effectively it made io.KeyRepeatRate behave like it was set to (io.KeyRepeatRate + io.KeyRepeatDelay). - If you never altered io.KeyRepeatRate nor used GetKeyPressedAmount() this won't affect you. - - 2019/07/15 (1.72) - removed TreeAdvanceToLabelPos() which is rarely used and only does SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()). Kept redirection function (will obsolete). - - 2019/07/12 (1.72) - renamed ImFontAtlas::CustomRect to ImFontAtlasCustomRect. Kept redirection typedef (will obsolete). - - 2019/06/14 (1.72) - removed redirecting functions/enums names that were marked obsolete in 1.51 (June 2017): ImGuiCol_Column*, ImGuiSetCond_*, IsItemHoveredRect(), IsPosHoveringAnyWindow(), IsMouseHoveringAnyWindow(), IsMouseHoveringWindow(), IMGUI_ONCE_UPON_A_FRAME. Grep this log for details and new names, or see how they were implemented until 1.71. - - 2019/06/07 (1.71) - rendering of child window outer decorations (bg color, border, scrollbars) is now performed as part of the parent window. If you have - overlapping child windows in a same parent, and relied on their relative z-order to be mapped to their submission order, this will affect your rendering. - This optimization is disabled if the parent window has no visual output, because it appears to be the most common situation leading to the creation of overlapping child windows. - Please reach out if you are affected. - - 2019/05/13 (1.71) - renamed SetNextTreeNodeOpen() to SetNextItemOpen(). Kept inline redirection function (will obsolete). - - 2019/05/11 (1.71) - changed io.AddInputCharacter(unsigned short c) signature to io.AddInputCharacter(unsigned int c). - - 2019/04/29 (1.70) - improved ImDrawList thick strokes (>1.0f) preserving correct thickness up to 90 degrees angles (e.g. rectangles). If you have custom rendering using thick lines, they will appear thicker now. - - 2019/04/29 (1.70) - removed GetContentRegionAvailWidth(), use GetContentRegionAvail().x instead. Kept inline redirection function (will obsolete). - - 2019/03/04 (1.69) - renamed GetOverlayDrawList() to GetForegroundDrawList(). Kept redirection function (will obsolete). - - 2019/02/26 (1.69) - renamed ImGuiColorEditFlags_RGB/ImGuiColorEditFlags_HSV/ImGuiColorEditFlags_HEX to ImGuiColorEditFlags_DisplayRGB/ImGuiColorEditFlags_DisplayHSV/ImGuiColorEditFlags_DisplayHex. Kept redirection enums (will obsolete). - - 2019/02/14 (1.68) - made it illegal/assert when io.DisplayTime == 0.0f (with an exception for the first frame). If for some reason your time step calculation gives you a zero value, replace it with an arbitrarily small value! - - 2019/02/01 (1.68) - removed io.DisplayVisibleMin/DisplayVisibleMax (which were marked obsolete and removed from viewport/docking branch already). - - 2019/01/06 (1.67) - renamed io.InputCharacters[], marked internal as was always intended. Please don't access directly, and use AddInputCharacter() instead! - - 2019/01/06 (1.67) - renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Kept redirection typedef (will obsolete). - - 2018/12/20 (1.67) - made it illegal to call Begin("") with an empty string. This somehow half-worked before but had various undesirable side-effects. - - 2018/12/10 (1.67) - renamed io.ConfigResizeWindowsFromEdges to io.ConfigWindowsResizeFromEdges as we are doing a large pass on configuration flags. - - 2018/10/12 (1.66) - renamed misc/stl/imgui_stl.* to misc/cpp/imgui_stdlib.* in prevision for other C++ helper files. - - 2018/09/28 (1.66) - renamed SetScrollHere() to SetScrollHereY(). Kept redirection function (will obsolete). - - 2018/09/06 (1.65) - renamed stb_truetype.h to imstb_truetype.h, stb_textedit.h to imstb_textedit.h, and stb_rect_pack.h to imstb_rectpack.h. - If you were conveniently using the imgui copy of those STB headers in your project you will have to update your include paths. - - 2018/09/05 (1.65) - renamed io.OptCursorBlink/io.ConfigCursorBlink to io.ConfigInputTextCursorBlink. (#1427) - - 2018/08/31 (1.64) - added imgui_widgets.cpp file, extracted and moved widgets code out of imgui.cpp into imgui_widgets.cpp. Re-ordered some of the code remaining in imgui.cpp. - NONE OF THE FUNCTIONS HAVE CHANGED. THE CODE IS SEMANTICALLY 100% IDENTICAL, BUT _EVERY_ FUNCTION HAS BEEN MOVED. - Because of this, any local modifications to imgui.cpp will likely conflict when you update. Read docs/CHANGELOG.txt for suggestions. - - 2018/08/22 (1.63) - renamed IsItemDeactivatedAfterChange() to IsItemDeactivatedAfterEdit() for consistency with new IsItemEdited() API. Kept redirection function (will obsolete soonish as IsItemDeactivatedAfterChange() is very recent). - - 2018/08/21 (1.63) - renamed ImGuiTextEditCallback to ImGuiInputTextCallback, ImGuiTextEditCallbackData to ImGuiInputTextCallbackData for consistency. Kept redirection types (will obsolete). - - 2018/08/21 (1.63) - removed ImGuiInputTextCallbackData::ReadOnly since it is a duplication of (ImGuiInputTextCallbackData::Flags & ImGuiInputTextFlags_ReadOnly). - - 2018/08/01 (1.63) - removed per-window ImGuiWindowFlags_ResizeFromAnySide beta flag in favor of a global io.ConfigResizeWindowsFromEdges [update 1.67 renamed to ConfigWindowsResizeFromEdges] to enable the feature. - - 2018/08/01 (1.63) - renamed io.OptCursorBlink to io.ConfigCursorBlink [-> io.ConfigInputTextCursorBlink in 1.65], io.OptMacOSXBehaviors to ConfigMacOSXBehaviors for consistency. - - 2018/07/22 (1.63) - changed ImGui::GetTime() return value from float to double to avoid accumulating floating point imprecisions over time. - - 2018/07/08 (1.63) - style: renamed ImGuiCol_ModalWindowDarkening to ImGuiCol_ModalWindowDimBg for consistency with other features. Kept redirection enum (will obsolete). - - 2018/06/08 (1.62) - examples: the imgui_impl_XXX files have been split to separate platform (Win32, GLFW, SDL2, etc.) from renderer (DX11, OpenGL, Vulkan, etc.). - old backends will still work as is, however prefer using the separated backends as they will be updated to support multi-viewports. - when adopting new backends follow the main.cpp code of your preferred examples/ folder to know which functions to call. - in particular, note that old backends called ImGui::NewFrame() at the end of their ImGui_ImplXXXX_NewFrame() function. - - 2018/06/06 (1.62) - renamed GetGlyphRangesChinese() to GetGlyphRangesChineseFull() to distinguish other variants and discourage using the full set. - - 2018/06/06 (1.62) - TreeNodeEx()/TreeNodeBehavior(): the ImGuiTreeNodeFlags_CollapsingHeader helper now include the ImGuiTreeNodeFlags_NoTreePushOnOpen flag. See Changelog for details. - - 2018/05/03 (1.61) - DragInt(): the default compile-time format string has been changed from "%.0f" to "%d", as we are not using integers internally any more. - If you used DragInt() with custom format strings, make sure you change them to use %d or an integer-compatible format. - To honor backward-compatibility, the DragInt() code will currently parse and modify format strings to replace %*f with %d, giving time to users to upgrade their code. - If you have IMGUI_DISABLE_OBSOLETE_FUNCTIONS enabled, the code will instead assert! You may run a reg-exp search on your codebase for e.g. "DragInt.*%f" to help you find them. - - 2018/04/28 (1.61) - obsoleted InputFloat() functions taking an optional "int decimal_precision" in favor of an equivalent and more flexible "const char* format", - consistent with other functions. Kept redirection functions (will obsolete). - - 2018/04/09 (1.61) - IM_DELETE() helper function added in 1.60 doesn't clear the input _pointer_ reference, more consistent with expectation and allows passing r-value. - - 2018/03/20 (1.60) - renamed io.WantMoveMouse to io.WantSetMousePos for consistency and ease of understanding (was added in 1.52, _not_ used by core and only honored by some backend ahead of merging the Nav branch). - - 2018/03/12 (1.60) - removed ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered as the closing cross uses regular button colors now. - - 2018/03/08 (1.60) - changed ImFont::DisplayOffset.y to default to 0 instead of +1. Fixed rounding of Ascent/Descent to match TrueType renderer. If you were adding or subtracting to ImFont::DisplayOffset check if your fonts are correctly aligned vertically. - - 2018/03/03 (1.60) - renamed ImGuiStyleVar_Count_ to ImGuiStyleVar_COUNT and ImGuiMouseCursor_Count_ to ImGuiMouseCursor_COUNT for consistency with other public enums. - - 2018/02/18 (1.60) - BeginDragDropSource(): temporarily removed the optional mouse_button=0 parameter because it is not really usable in many situations at the moment. - - 2018/02/16 (1.60) - obsoleted the io.RenderDrawListsFn callback, you can call your graphics engine render function after ImGui::Render(). Use ImGui::GetDrawData() to retrieve the ImDrawData* to display. - - 2018/02/07 (1.60) - reorganized context handling to be more explicit, - - YOU NOW NEED TO CALL ImGui::CreateContext() AT THE BEGINNING OF YOUR APP, AND CALL ImGui::DestroyContext() AT THE END. - - removed Shutdown() function, as DestroyContext() serve this purpose. - - you may pass a ImFontAtlas* pointer to CreateContext() to share a font atlas between contexts. Otherwise CreateContext() will create its own font atlas instance. - - removed allocator parameters from CreateContext(), they are now setup with SetAllocatorFunctions(), and shared by all contexts. - - removed the default global context and font atlas instance, which were confusing for users of DLL reloading and users of multiple contexts. - - 2018/01/31 (1.60) - moved sample TTF files from extra_fonts/ to misc/fonts/. If you loaded files directly from the imgui repo you may need to update your paths. - - 2018/01/11 (1.60) - obsoleted IsAnyWindowHovered() in favor of IsWindowHovered(ImGuiHoveredFlags_AnyWindow). Kept redirection function (will obsolete). - - 2018/01/11 (1.60) - obsoleted IsAnyWindowFocused() in favor of IsWindowFocused(ImGuiFocusedFlags_AnyWindow). Kept redirection function (will obsolete). - - 2018/01/03 (1.60) - renamed ImGuiSizeConstraintCallback to ImGuiSizeCallback, ImGuiSizeConstraintCallbackData to ImGuiSizeCallbackData. - - 2017/12/29 (1.60) - removed CalcItemRectClosestPoint() which was weird and not really used by anyone except demo code. If you need it it's easy to replicate on your side. - - 2017/12/24 (1.53) - renamed the emblematic ShowTestWindow() function to ShowDemoWindow(). Kept redirection function (will obsolete). - - 2017/12/21 (1.53) - ImDrawList: renamed style.AntiAliasedShapes to style.AntiAliasedFill for consistency and as a way to explicitly break code that manipulate those flag at runtime. You can now manipulate ImDrawList::Flags - - 2017/12/21 (1.53) - ImDrawList: removed 'bool anti_aliased = true' final parameter of ImDrawList::AddPolyline() and ImDrawList::AddConvexPolyFilled(). Prefer manipulating ImDrawList::Flags if you need to toggle them during the frame. - - 2017/12/14 (1.53) - using the ImGuiWindowFlags_NoScrollWithMouse flag on a child window forwards the mouse wheel event to the parent window, unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set. - - 2017/12/13 (1.53) - renamed GetItemsLineHeightWithSpacing() to GetFrameHeightWithSpacing(). Kept redirection function (will obsolete). - - 2017/12/13 (1.53) - obsoleted IsRootWindowFocused() in favor of using IsWindowFocused(ImGuiFocusedFlags_RootWindow). Kept redirection function (will obsolete). - - obsoleted IsRootWindowOrAnyChildFocused() in favor of using IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows). Kept redirection function (will obsolete). - - 2017/12/12 (1.53) - renamed ImGuiTreeNodeFlags_AllowOverlapMode to ImGuiTreeNodeFlags_AllowItemOverlap. Kept redirection enum (will obsolete). - - 2017/12/10 (1.53) - removed SetNextWindowContentWidth(), prefer using SetNextWindowContentSize(). Kept redirection function (will obsolete). - - 2017/11/27 (1.53) - renamed ImGuiTextBuffer::append() helper to appendf(), appendv() to appendfv(). If you copied the 'Log' demo in your code, it uses appendv() so that needs to be renamed. - - 2017/11/18 (1.53) - Style, Begin: removed ImGuiWindowFlags_ShowBorders window flag. Borders are now fully set up in the ImGuiStyle structure (see e.g. style.FrameBorderSize, style.WindowBorderSize). Use ImGui::ShowStyleEditor() to look them up. - Please note that the style system will keep evolving (hopefully stabilizing in Q1 2018), and so custom styles will probably subtly break over time. It is recommended you use the StyleColorsClassic(), StyleColorsDark(), StyleColorsLight() functions. - - 2017/11/18 (1.53) - Style: removed ImGuiCol_ComboBg in favor of combo boxes using ImGuiCol_PopupBg for consistency. - - 2017/11/18 (1.53) - Style: renamed ImGuiCol_ChildWindowBg to ImGuiCol_ChildBg. - - 2017/11/18 (1.53) - Style: renamed style.ChildWindowRounding to style.ChildRounding, ImGuiStyleVar_ChildWindowRounding to ImGuiStyleVar_ChildRounding. - - 2017/11/02 (1.53) - obsoleted IsRootWindowOrAnyChildHovered() in favor of using IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); - - 2017/10/24 (1.52) - renamed IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS to IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS for consistency. - - 2017/10/20 (1.52) - changed IsWindowHovered() default parameters behavior to return false if an item is active in another window (e.g. click-dragging item from another window to this window). You can use the newly introduced IsWindowHovered() flags to requests this specific behavior if you need it. - - 2017/10/20 (1.52) - marked IsItemHoveredRect()/IsMouseHoveringWindow() as obsolete, in favor of using the newly introduced flags for IsItemHovered() and IsWindowHovered(). See https://github.com/ocornut/imgui/issues/1382 for details. - removed the IsItemRectHovered()/IsWindowRectHovered() names introduced in 1.51 since they were merely more consistent names for the two functions we are now obsoleting. - IsItemHoveredRect() --> IsItemHovered(ImGuiHoveredFlags_RectOnly) - IsMouseHoveringAnyWindow() --> IsWindowHovered(ImGuiHoveredFlags_AnyWindow) - IsMouseHoveringWindow() --> IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) [weird, old behavior] - - 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead! - - 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete). - - 2017/09/26 (1.52) - renamed ImFont::Glyph to ImFontGlyph. Kept redirection typedef (will obsolete). - - 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete). - - 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your backend if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)". - - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)! - - renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete). - - renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete). - - 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency. - - 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix. - - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame type. - - 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely. - - 2017/08/13 (1.51) - renamed ImGuiCol_Column to ImGuiCol_Separator, ImGuiCol_ColumnHovered to ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive to ImGuiCol_SeparatorActive. Kept redirection enums (will obsolete). - - 2017/08/11 (1.51) - renamed ImGuiSetCond_Always to ImGuiCond_Always, ImGuiSetCond_Once to ImGuiCond_Once, ImGuiSetCond_FirstUseEver to ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing to ImGuiCond_Appearing. Kept redirection enums (will obsolete). - - 2017/08/09 (1.51) - removed ValueColor() helpers, they are equivalent to calling Text(label) + SameLine() + ColorButton(). - - 2017/08/08 (1.51) - removed ColorEditMode() and ImGuiColorEditMode in favor of ImGuiColorEditFlags and parameters to the various Color*() functions. The SetColorEditOptions() allows to initialize default but the user can still change them with right-click context menu. - - changed prototype of 'ColorEdit4(const char* label, float col[4], bool show_alpha = true)' to 'ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0)', where passing flags = 0x01 is a safe no-op (hello dodgy backward compatibility!). - check and run the demo window, under "Color/Picker Widgets", to understand the various new options. - - changed prototype of rarely used 'ColorButton(ImVec4 col, bool small_height = false, bool outline_border = true)' to 'ColorButton(const char* desc_id, ImVec4 col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0, 0))' - - 2017/07/20 (1.51) - removed IsPosHoveringAnyWindow(ImVec2), which was partly broken and misleading. ASSERT + redirect user to io.WantCaptureMouse - - 2017/05/26 (1.50) - removed ImFontConfig::MergeGlyphCenterV in favor of a more multipurpose ImFontConfig::GlyphOffset. - - 2017/05/01 (1.50) - renamed ImDrawList::PathFill() (rarely used directly) to ImDrawList::PathFillConvex() for clarity. - - 2016/11/06 (1.50) - BeginChild(const char*) now applies the stack id to the provided label, consistently with other functions as it should always have been. It shouldn't affect you unless (extremely unlikely) you were appending multiple times to a same child from different locations of the stack id. If that's the case, generate an id with GetID() and use it instead of passing string to BeginChild(). - - 2016/10/15 (1.50) - avoid 'void* user_data' parameter to io.SetClipboardTextFn/io.GetClipboardTextFn pointers. We pass io.ClipboardUserData to it. - - 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc. - - 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully, breakage should be minimal. - - 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore. - If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you, otherwise if <1.0f you need to tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar. - This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color: - ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col) { float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a; return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a); } - If this is confusing, pick the RGB value from title bar from an old screenshot and apply this as TitleBg/TitleBgActive. Or you may just create TitleBgActive from a tweaked TitleBg color. - - 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext(). - - 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection. - - 2016/05/01 (1.49) - obsoleted old signature of CollapsingHeader(const char* label, const char* str_id = NULL, bool display_frame = true, bool default_open = false) as extra parameters were badly designed and rarely used. You can replace the "default_open = true" flag in new API with CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen). - - 2016/04/26 (1.49) - changed ImDrawList::PushClipRect(ImVec4 rect) to ImDrawList::PushClipRect(Imvec2 min,ImVec2 max,bool intersect_with_current_clip_rect=false). Note that higher-level ImGui::PushClipRect() is preferable because it will clip at logic/widget level, whereas ImDrawList::PushClipRect() only affect your renderer. - - 2016/04/03 (1.48) - removed style.WindowFillAlphaDefault setting which was redundant. Bake default BG alpha inside style.Colors[ImGuiCol_WindowBg] and all other Bg color values. (ref GitHub issue #337). - - 2016/04/03 (1.48) - renamed ImGuiCol_TooltipBg to ImGuiCol_PopupBg, used by popups/menus and tooltips. popups/menus were previously using ImGuiCol_WindowBg. (ref github issue #337) - - 2016/03/21 (1.48) - renamed GetWindowFont() to GetFont(), GetWindowFontSize() to GetFontSize(). Kept inline redirection function (will obsolete). - - 2016/03/02 (1.48) - InputText() completion/history/always callbacks: if you modify the text buffer manually (without using DeleteChars()/InsertChars() helper) you need to maintain the BufTextLen field. added an assert. - - 2016/01/23 (1.48) - fixed not honoring exact width passed to PushItemWidth(), previously it would add extra FramePadding.x*2 over that width. if you had manual pixel-perfect alignment in place it might affect you. - - 2015/12/27 (1.48) - fixed ImDrawList::AddRect() which used to render a rectangle 1 px too large on each axis. - - 2015/12/04 (1.47) - renamed Color() helpers to ValueColor() - dangerously named, rarely used and probably to be made obsolete. - - 2015/08/29 (1.45) - with the addition of horizontal scrollbar we made various fixes to inconsistencies with dealing with cursor position. - GetCursorPos()/SetCursorPos() functions now include the scrolled amount. It shouldn't affect the majority of users, but take note that SetCursorPosX(100.0f) puts you at +100 from the starting x position which may include scrolling, not at +100 from the window left side. - GetContentRegionMax()/GetWindowContentRegionMin()/GetWindowContentRegionMax() functions allow include the scrolled amount. Typically those were used in cases where no scrolling would happen so it may not be a problem, but watch out! - - 2015/08/29 (1.45) - renamed style.ScrollbarWidth to style.ScrollbarSize - - 2015/08/05 (1.44) - split imgui.cpp into extra files: imgui_demo.cpp imgui_draw.cpp imgui_internal.h that you need to add to your project. - - 2015/07/18 (1.44) - fixed angles in ImDrawList::PathArcTo(), PathArcToFast() (introduced in 1.43) being off by an extra PI for no justifiable reason - - 2015/07/14 (1.43) - add new ImFontAtlas::AddFont() API. For the old AddFont***, moved the 'font_no' parameter of ImFontAtlas::AddFont** functions to the ImFontConfig structure. - you need to render your textured triangles with bilinear filtering to benefit from sub-pixel positioning of text. - - 2015/07/08 (1.43) - switched rendering data to use indexed rendering. this is saving a fair amount of CPU/GPU and enables us to get anti-aliasing for a marginal cost. - this necessary change will break your rendering function! the fix should be very easy. sorry for that :( - - if you are using a vanilla copy of one of the imgui_impl_XXX.cpp provided in the example, you just need to update your copy and you can ignore the rest. - - the signature of the io.RenderDrawListsFn handler has changed! - old: ImGui_XXXX_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count) - new: ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data). - parameters: 'cmd_lists' becomes 'draw_data->CmdLists', 'cmd_lists_count' becomes 'draw_data->CmdListsCount' - ImDrawList: 'commands' becomes 'CmdBuffer', 'vtx_buffer' becomes 'VtxBuffer', 'IdxBuffer' is new. - ImDrawCmd: 'vtx_count' becomes 'ElemCount', 'clip_rect' becomes 'ClipRect', 'user_callback' becomes 'UserCallback', 'texture_id' becomes 'TextureId'. - - each ImDrawList now contains both a vertex buffer and an index buffer. For each command, render ElemCount/3 triangles using indices from the index buffer. - - if you REALLY cannot render indexed primitives, you can call the draw_data->DeIndexAllBuffers() method to de-index the buffers. This is slow and a waste of CPU/GPU. Prefer using indexed rendering! - - refer to code in the examples/ folder or ask on the GitHub if you are unsure of how to upgrade. please upgrade! - - 2015/07/10 (1.43) - changed SameLine() parameters from int to float. - - 2015/07/02 (1.42) - renamed SetScrollPosHere() to SetScrollFromCursorPos(). Kept inline redirection function (will obsolete). - - 2015/07/02 (1.42) - renamed GetScrollPosY() to GetScrollY(). Necessary to reduce confusion along with other scrolling functions, because positions (e.g. cursor position) are not equivalent to scrolling amount. - - 2015/06/14 (1.41) - changed ImageButton() default bg_col parameter from (0,0,0,1) (black) to (0,0,0,0) (transparent) - makes a difference when texture have transparence - - 2015/06/14 (1.41) - changed Selectable() API from (label, selected, size) to (label, selected, flags, size). Size override should have been rarely used. Sorry! - - 2015/05/31 (1.40) - renamed GetWindowCollapsed() to IsWindowCollapsed() for consistency. Kept inline redirection function (will obsolete). - - 2015/05/31 (1.40) - renamed IsRectClipped() to IsRectVisible() for consistency. Note that return value is opposite! Kept inline redirection function (will obsolete). - - 2015/05/27 (1.40) - removed the third 'repeat_if_held' parameter from Button() - sorry! it was rarely used and inconsistent. Use PushButtonRepeat(true) / PopButtonRepeat() to enable repeat on desired buttons. - - 2015/05/11 (1.40) - changed BeginPopup() API, takes a string identifier instead of a bool. ImGui needs to manage the open/closed state of popups. Call OpenPopup() to actually set the "open" state of a popup. BeginPopup() returns true if the popup is opened. - - 2015/05/03 (1.40) - removed style.AutoFitPadding, using style.WindowPadding makes more sense (the default values were already the same). - - 2015/04/13 (1.38) - renamed IsClipped() to IsRectClipped(). Kept inline redirection function until 1.50. - - 2015/04/09 (1.38) - renamed ImDrawList::AddArc() to ImDrawList::AddArcFast() for compatibility with future API - - 2015/04/03 (1.38) - removed ImGuiCol_CheckHovered, ImGuiCol_CheckActive, replaced with the more general ImGuiCol_FrameBgHovered, ImGuiCol_FrameBgActive. - - 2014/04/03 (1.38) - removed support for passing -FLT_MAX..+FLT_MAX as the range for a SliderFloat(). Use DragFloat() or Inputfloat() instead. - - 2015/03/17 (1.36) - renamed GetItemBoxMin()/GetItemBoxMax()/IsMouseHoveringBox() to GetItemRectMin()/GetItemRectMax()/IsMouseHoveringRect(). Kept inline redirection function until 1.50. - - 2015/03/15 (1.36) - renamed style.TreeNodeSpacing to style.IndentSpacing, ImGuiStyleVar_TreeNodeSpacing to ImGuiStyleVar_IndentSpacing - - 2015/03/13 (1.36) - renamed GetWindowIsFocused() to IsWindowFocused(). Kept inline redirection function until 1.50. - - 2015/03/08 (1.35) - renamed style.ScrollBarWidth to style.ScrollbarWidth (casing) - - 2015/02/27 (1.34) - renamed OpenNextNode(bool) to SetNextTreeNodeOpened(bool, ImGuiSetCond). Kept inline redirection function until 1.50. - - 2015/02/27 (1.34) - renamed ImGuiSetCondition_*** to ImGuiSetCond_***, and _FirstUseThisSession becomes _Once. - - 2015/02/11 (1.32) - changed text input callback ImGuiTextEditCallback return type from void-->int. reserved for future use, return 0 for now. - - 2015/02/10 (1.32) - renamed GetItemWidth() to CalcItemWidth() to clarify its evolving behavior - - 2015/02/08 (1.31) - renamed GetTextLineSpacing() to GetTextLineHeightWithSpacing() - - 2015/02/01 (1.31) - removed IO.MemReallocFn (unused) - - 2015/01/19 (1.30) - renamed ImGuiStorage::GetIntPtr()/GetFloatPtr() to GetIntRef()/GetIntRef() because Ptr was conflicting with actual pointer storage functions. - - 2015/01/11 (1.30) - big font/image API change! now loads TTF file. allow for multiple fonts. no need for a PNG loader. - - 2015/01/11 (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels. - - old: const void* png_data; unsigned int png_size; ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); [..Upload texture to GPU..]; - - new: unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); [..Upload texture to GPU..]; io.Fonts->SetTexID(YourTexIdentifier); - you now have more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs. It is now recommended that you sample the font texture with bilinear interpolation. - - 2015/01/11 (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to call io.Fonts->SetTexID() - - 2015/01/11 (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix) - - 2015/01/11 (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets - - 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver) - - 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph) - - 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility - - 2014/11/07 (1.15) - renamed IsHovered() to IsItemHovered() - - 2014/10/02 (1.14) - renamed IMGUI_INCLUDE_IMGUI_USER_CPP to IMGUI_INCLUDE_IMGUI_USER_INL and imgui_user.cpp to imgui_user.inl (more IDE friendly) - - 2014/09/25 (1.13) - removed 'text_end' parameter from IO.SetClipboardTextFn (the string is now always zero-terminated for simplicity) - - 2014/09/24 (1.12) - renamed SetFontScale() to SetWindowFontScale() - - 2014/09/24 (1.12) - moved IM_MALLOC/IM_REALLOC/IM_FREE preprocessor defines to IO.MemAllocFn/IO.MemReallocFn/IO.MemFreeFn - - 2014/08/30 (1.09) - removed IO.FontHeight (now computed automatically) - - 2014/08/30 (1.09) - moved IMGUI_FONT_TEX_UV_FOR_WHITE preprocessor define to IO.FontTexUvForWhite - - 2014/08/28 (1.09) - changed the behavior of IO.PixelCenterOffset following various rendering fixes - - - FREQUENTLY ASKED QUESTIONS (FAQ) - ================================ - - Read all answers online: - https://www.dearimgui.org/faq or https://github.com/ocornut/imgui/blob/master/docs/FAQ.md (same url) - Read all answers locally (with a text editor or ideally a Markdown viewer): - docs/FAQ.md - Some answers are copied down here to facilitate searching in code. - - Q&A: Basics - =========== - - Q: Where is the documentation? - A: This library is poorly documented at the moment and expects the user to be acquainted with C/C++. - - Run the examples/ and explore them. - - See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function. - - The demo covers most features of Dear ImGui, so you can read the code and see its output. - - See documentation and comments at the top of imgui.cpp + effectively imgui.h. - - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the - examples/ folder to explain how to integrate Dear ImGui with your own engine/application. - - The Wiki (https://github.com/ocornut/imgui/wiki) has many resources and links. - - The Glossary (https://github.com/ocornut/imgui/wiki/Glossary) page also may be useful. - - Your programming IDE is your friend, find the type or function declaration to find comments - associated with it. - - Q: What is this library called? - Q: Which version should I get? - >> This library is called "Dear ImGui", please don't call it "ImGui" :) - >> See https://www.dearimgui.org/faq for details. - - Q&A: Integration - ================ - - Q: How to get started? - A: Read 'PROGRAMMER GUIDE' above. Read examples/README.txt. - - Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application? - A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! - >> See https://www.dearimgui.org/faq for a fully detailed answer. You really want to read this. - - Q. How can I enable keyboard controls? - Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display) - Q: I integrated Dear ImGui in my engine and little squares are showing instead of text... - Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around... - Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries... - >> See https://www.dearimgui.org/faq - - Q&A: Usage - ---------- - - Q: About the ID Stack system.. - - Why is my widget not reacting when I click on it? - - How can I have widgets with an empty label? - - How can I have multiple widgets with the same label? - - How can I have multiple windows with the same label? - Q: How can I display an image? What is ImTextureID, how does it works? - Q: How can I use my own math types instead of ImVec2/ImVec4? - Q: How can I interact with standard C++ types (such as std::string and std::vector)? - Q: How can I display custom shapes? (using low-level ImDrawList API) - >> See https://www.dearimgui.org/faq - - Q&A: Fonts, Text - ================ - - Q: How should I handle DPI in my application? - Q: How can I load a different font than the default? - Q: How can I easily use icons in my application? - Q: How can I load multiple fonts? - Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic? - >> See https://www.dearimgui.org/faq and https://github.com/ocornut/imgui/edit/master/docs/FONTS.md - - Q&A: Concerns - ============= - - Q: Who uses Dear ImGui? - Q: Can you create elaborate/serious tools with Dear ImGui? - Q: Can you reskin the look of Dear ImGui? - Q: Why using C++ (as opposed to C)? - >> See https://www.dearimgui.org/faq - - Q&A: Community - ============== - - Q: How can I help? - A: - Businesses: please reach out to "contact AT dearimgui.com" if you work in a place using Dear ImGui! - We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts. - This is among the most useful thing you can do for Dear ImGui. With increased funding, we can hire more people working on this project. - - Individuals: you can support continued development via PayPal donations. See README. - - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, read docs/TODO.txt - and see how you want to help and can help! - - Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc. - You may post screenshot or links in the gallery threads. Visuals are ideal as they inspire other programmers. - But even without visuals, disclosing your use of dear imgui helps the library grow credibility, and help other teams and programmers with taking decisions. - - If you have issues or if you need to hack into the library, even if you don't expect any support it is useful that you share your issues (on GitHub or privately). - -*/ - -//------------------------------------------------------------------------- -// [SECTION] INCLUDES -//------------------------------------------------------------------------- - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#ifndef IMGUI_DISABLE - -#ifndef IMGUI_DEFINE_MATH_OPERATORS -#define IMGUI_DEFINE_MATH_OPERATORS -#endif -#include "imgui_internal.h" - -// System includes -#include // toupper -#include // vsnprintf, sscanf, printf -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else -#include // intptr_t -#endif - -// [Windows] On non-Visual Studio compilers, we default to IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS unless explicitly enabled -#if defined(_WIN32) && !defined(_MSC_VER) && !defined(IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) -#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS -#endif - -// [Windows] OS specific includes (optional) -#if defined(_WIN32) && defined(IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) -#define IMGUI_DISABLE_WIN32_FUNCTIONS -#endif -#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#ifndef NOMINMAX -#define NOMINMAX -#endif -#ifndef __MINGW32__ -#include // _wfopen, OpenClipboard -#else -#include -#endif -#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have all Win32 functions -#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS -#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS -#endif -#endif - -// [Apple] OS specific includes -#if defined(__APPLE__) -#include -#endif - -// Visual Studio warnings -#ifdef _MSC_VER -#pragma warning (disable: 4127) // condition expression is constant -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later -#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types -#endif -#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). -#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). -#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). -#endif - -// Clang/GCC warnings with -Weverything -#if defined(__clang__) -#if __has_warning("-Wunknown-warning-option") -#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' -#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. -#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. -#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. -#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness -#pragma clang diagnostic ignored "-Wformat-pedantic" // warning: format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic. -#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type 'int' -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. -#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision -#elif defined(__GNUC__) -// We disable -Wpragmas because GCC doesn't provide an has_warning equivalent and some forks/patches may not following the warning/version association. -#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind -#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used -#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size -#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*' -#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function -#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value -#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked -#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false -#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#endif - -// Debug options -#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL -#define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window -#define IMGUI_DEBUG_INI_SETTINGS 0 // Save additional comments in .ini file (particularly helps for Docking, but makes saving slower) - -// When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch. -static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in -static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear - -// Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by backend) -static const float WINDOWS_HOVER_PADDING = 4.0f; // Extend outside window for hovering/resizing (maxxed with TouchPadding) and inside windows for borders. Affect FindHoveredWindow(). -static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time. -static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 2.00f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certain time, unless mouse moved. - -//------------------------------------------------------------------------- -// [SECTION] FORWARD DECLARATIONS -//------------------------------------------------------------------------- - -static void SetCurrentWindow(ImGuiWindow* window); -static void FindHoveredWindow(); -static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags); -static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window); - -static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list); -static void AddWindowToSortBuffer(ImVector* out_sorted_windows, ImGuiWindow* window); - -// Settings -static void WindowSettingsHandler_ClearAll(ImGuiContext*, ImGuiSettingsHandler*); -static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name); -static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line); -static void WindowSettingsHandler_ApplyAll(ImGuiContext*, ImGuiSettingsHandler*); -static void WindowSettingsHandler_WriteAll(ImGuiContext*, ImGuiSettingsHandler*, ImGuiTextBuffer* buf); - -// Platform Dependents default implementation for IO functions -static const char* GetClipboardTextFn_DefaultImpl(void* user_data); -static void SetClipboardTextFn_DefaultImpl(void* user_data, const char* text); -static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatformImeData* data); - -namespace ImGui -{ -// Navigation -static void NavUpdate(); -static void NavUpdateWindowing(); -static void NavUpdateWindowingOverlay(); -static void NavUpdateCancelRequest(); -static void NavUpdateCreateMoveRequest(); -static void NavUpdateCreateTabbingRequest(); -static float NavUpdatePageUpPageDown(); -static inline void NavUpdateAnyRequestFlag(); -static void NavUpdateCreateWrappingRequest(); -static void NavEndFrame(); -static bool NavScoreItem(ImGuiNavItemData* result); -static void NavApplyItemToResult(ImGuiNavItemData* result); -static void NavProcessItem(); -static void NavProcessItemForTabbingRequest(ImGuiID id); -static ImVec2 NavCalcPreferredRefPos(); -static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window); -static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window); -static void NavRestoreLayer(ImGuiNavLayer layer); -static void NavRestoreHighlightAfterMove(); -static int FindWindowFocusIndex(ImGuiWindow* window); - -// Error Checking and Debug Tools -static void ErrorCheckNewFrameSanityChecks(); -static void ErrorCheckEndFrameSanityChecks(); -static void UpdateDebugToolItemPicker(); -static void UpdateDebugToolStackQueries(); - -// Misc -static void UpdateSettings(); -static void UpdateKeyboardInputs(); -static void UpdateMouseInputs(); -static void UpdateMouseWheel(); -static bool UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect); -static void RenderWindowOuterBorders(ImGuiWindow* window); -static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size); -static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open); -static void RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col); -static void RenderDimmedBackgrounds(); -static ImGuiWindow* FindBlockingModal(ImGuiWindow* window); - -// Viewports -static void UpdateViewportsNewFrame(); - -} - -//----------------------------------------------------------------------------- -// [SECTION] CONTEXT AND MEMORY ALLOCATORS -//----------------------------------------------------------------------------- - -// DLL users: -// - Heaps and globals are not shared across DLL boundaries! -// - You will need to call SetCurrentContext() + SetAllocatorFunctions() for each static/DLL boundary you are calling from. -// - Same applies for hot-reloading mechanisms that are reliant on reloading DLL (note that many hot-reloading mechanisms work without DLL). -// - Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. -// - Confused? In a debugger: add GImGui to your watch window and notice how its value changes depending on your current location (which DLL boundary you are in). - -// Current context pointer. Implicitly used by all Dear ImGui functions. Always assumed to be != NULL. -// - ImGui::CreateContext() will automatically set this pointer if it is NULL. -// Change to a different context by calling ImGui::SetCurrentContext(). -// - Important: Dear ImGui functions are not thread-safe because of this pointer. -// If you want thread-safety to allow N threads to access N different contexts: -// - Change this variable to use thread local storage so each thread can refer to a different context, in your imconfig.h: -// struct ImGuiContext; -// extern thread_local ImGuiContext* MyImGuiTLS; -// #define GImGui MyImGuiTLS -// And then define MyImGuiTLS in one of your cpp files. Note that thread_local is a C++11 keyword, earlier C++ uses compiler-specific keyword. -// - Future development aims to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586 -// - If you need a finite number of contexts, you may compile and use multiple instances of the ImGui code from a different namespace. -// - DLL users: read comments above. -#ifndef GImGui -ImGuiContext* GImGui = NULL; -#endif - -// Memory Allocator functions. Use SetAllocatorFunctions() to change them. -// - You probably don't want to modify that mid-program, and if you use global/static e.g. ImVector<> instances you may need to keep them accessible during program destruction. -// - DLL users: read comments above. -#ifndef IMGUI_DISABLE_DEFAULT_ALLOCATORS -static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); return malloc(size); } -static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); free(ptr); } -#else -static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(size); IM_ASSERT(0); return NULL; } -static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(ptr); IM_ASSERT(0); } -#endif -static ImGuiMemAllocFunc GImAllocatorAllocFunc = MallocWrapper; -static ImGuiMemFreeFunc GImAllocatorFreeFunc = FreeWrapper; -static void* GImAllocatorUserData = NULL; - -//----------------------------------------------------------------------------- -// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) -//----------------------------------------------------------------------------- - -ImGuiStyle::ImGuiStyle() -{ - Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui. - DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. - WindowPadding = ImVec2(8,8); // Padding within a window - WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. - WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. - WindowMinSize = ImVec2(32,32); // Minimum window size - WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text - WindowMenuButtonPosition= ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left. - ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows - ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. - PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows - PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. - FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets) - FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets). - FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. - ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines - ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) - CellPadding = ImVec2(4,2); // Padding within a table cell - TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! - IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). - ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). - ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar - ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar - GrabMinSize = 12.0f; // Minimum width/height of a grab box for slider/scrollbar - GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. - LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. - TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. - TabBorderSize = 0.0f; // Thickness of border around tabs. - TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appears on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. - ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. - ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. - SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. - DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. - DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. - MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. - AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. - AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). - AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). - CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. - CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. - - // Default theme - ImGui::StyleColorsDark(this); -} - -// To scale your entire UI (e.g. if you want your app to use High DPI or generally be DPI aware) you may use this helper function. Scaling the fonts is done separately and is up to you. -// Important: This operation is lossy because we round all sizes to integer. If you need to change your scale multiples, call this over a freshly initialized ImGuiStyle structure rather than scaling multiple times. -void ImGuiStyle::ScaleAllSizes(float scale_factor) -{ - WindowPadding = ImFloor(WindowPadding * scale_factor); - WindowRounding = ImFloor(WindowRounding * scale_factor); - WindowMinSize = ImFloor(WindowMinSize * scale_factor); - ChildRounding = ImFloor(ChildRounding * scale_factor); - PopupRounding = ImFloor(PopupRounding * scale_factor); - FramePadding = ImFloor(FramePadding * scale_factor); - FrameRounding = ImFloor(FrameRounding * scale_factor); - ItemSpacing = ImFloor(ItemSpacing * scale_factor); - ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor); - CellPadding = ImFloor(CellPadding * scale_factor); - TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor); - IndentSpacing = ImFloor(IndentSpacing * scale_factor); - ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor); - ScrollbarSize = ImFloor(ScrollbarSize * scale_factor); - ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor); - GrabMinSize = ImFloor(GrabMinSize * scale_factor); - GrabRounding = ImFloor(GrabRounding * scale_factor); - LogSliderDeadzone = ImFloor(LogSliderDeadzone * scale_factor); - TabRounding = ImFloor(TabRounding * scale_factor); - TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImFloor(TabMinWidthForCloseButton * scale_factor) : FLT_MAX; - DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor); - DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor); - MouseCursorScale = ImFloor(MouseCursorScale * scale_factor); -} - -ImGuiIO::ImGuiIO() -{ - // Most fields are initialized with zero - memset(this, 0, sizeof(*this)); - IM_STATIC_ASSERT(IM_ARRAYSIZE(ImGuiIO::MouseDown) == ImGuiMouseButton_COUNT && IM_ARRAYSIZE(ImGuiIO::MouseClicked) == ImGuiMouseButton_COUNT); - - // Settings - ConfigFlags = ImGuiConfigFlags_None; - BackendFlags = ImGuiBackendFlags_None; - DisplaySize = ImVec2(-1.0f, -1.0f); - DeltaTime = 1.0f / 60.0f; - IniSavingRate = 5.0f; - IniFilename = "imgui.ini"; // Important: "imgui.ini" is relative to current working dir, most apps will want to lock this to an absolute path (e.g. same path as executables). - LogFilename = "imgui_log.txt"; - MouseDoubleClickTime = 0.30f; - MouseDoubleClickMaxDist = 6.0f; -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - for (int i = 0; i < ImGuiKey_COUNT; i++) - KeyMap[i] = -1; -#endif - KeyRepeatDelay = 0.275f; - KeyRepeatRate = 0.050f; - UserData = NULL; - - Fonts = NULL; - FontGlobalScale = 1.0f; - FontDefault = NULL; - FontAllowUserScaling = false; - DisplayFramebufferScale = ImVec2(1.0f, 1.0f); - - // Miscellaneous options - MouseDrawCursor = false; -#ifdef __APPLE__ - ConfigMacOSXBehaviors = true; // Set Mac OS X style defaults based on __APPLE__ compile time flag -#else - ConfigMacOSXBehaviors = false; -#endif - ConfigInputTrickleEventQueue = true; - ConfigInputTextCursorBlink = true; - ConfigWindowsResizeFromEdges = true; - ConfigWindowsMoveFromTitleBarOnly = false; - ConfigMemoryCompactTimer = 60.0f; - - // Platform Functions - BackendPlatformName = BackendRendererName = NULL; - BackendPlatformUserData = BackendRendererUserData = BackendLanguageUserData = NULL; - GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; // Platform dependent default implementations - SetClipboardTextFn = SetClipboardTextFn_DefaultImpl; - ClipboardUserData = NULL; - SetPlatformImeDataFn = SetPlatformImeDataFn_DefaultImpl; - - // Input (NB: we already have memset zero the entire structure!) - MousePos = ImVec2(-FLT_MAX, -FLT_MAX); - MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX); - MouseDragThreshold = 6.0f; - for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f; - for (int i = 0; i < IM_ARRAYSIZE(KeysData); i++) { KeysData[i].DownDuration = KeysData[i].DownDurationPrev = -1.0f; } - AppAcceptingEvents = true; - BackendUsingLegacyKeyArrays = (ImS8)-1; - BackendUsingLegacyNavInputArray = true; // assume using legacy array until proven wrong -} - -// Pass in translated ASCII characters for text input. -// - with glfw you can get those from the callback set in glfwSetCharCallback() -// - on Windows you can get those using ToAscii+keyboard state, or via the WM_CHAR message -// FIXME: Should in theory be called "AddCharacterEvent()" to be consistent with new API -void ImGuiIO::AddInputCharacter(unsigned int c) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(&g.IO == this && "Can only add events to current context."); - if (c == 0 || !AppAcceptingEvents) - return; - - ImGuiInputEvent e; - e.Type = ImGuiInputEventType_Text; - e.Source = ImGuiInputSource_Keyboard; - e.Text.Char = c; - g.InputEventsQueue.push_back(e); -} - -// UTF16 strings use surrogate pairs to encode codepoints >= 0x10000, so -// we should save the high surrogate. -void ImGuiIO::AddInputCharacterUTF16(ImWchar16 c) -{ - if ((c == 0 && InputQueueSurrogate == 0) || !AppAcceptingEvents) - return; - - if ((c & 0xFC00) == 0xD800) // High surrogate, must save - { - if (InputQueueSurrogate != 0) - AddInputCharacter(IM_UNICODE_CODEPOINT_INVALID); - InputQueueSurrogate = c; - return; - } - - ImWchar cp = c; - if (InputQueueSurrogate != 0) - { - if ((c & 0xFC00) != 0xDC00) // Invalid low surrogate - { - AddInputCharacter(IM_UNICODE_CODEPOINT_INVALID); - } - else - { -#if IM_UNICODE_CODEPOINT_MAX == 0xFFFF - cp = IM_UNICODE_CODEPOINT_INVALID; // Codepoint will not fit in ImWchar -#else - cp = (ImWchar)(((InputQueueSurrogate - 0xD800) << 10) + (c - 0xDC00) + 0x10000); -#endif - } - - InputQueueSurrogate = 0; - } - AddInputCharacter((unsigned)cp); -} - -void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) -{ - if (!AppAcceptingEvents) - return; - while (*utf8_chars != 0) - { - unsigned int c = 0; - utf8_chars += ImTextCharFromUtf8(&c, utf8_chars, NULL); - if (c != 0) - AddInputCharacter(c); - } -} - -void ImGuiIO::ClearInputCharacters() -{ - InputQueueCharacters.resize(0); -} - -void ImGuiIO::ClearInputKeys() -{ -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - memset(KeysDown, 0, sizeof(KeysDown)); -#endif - for (int n = 0; n < IM_ARRAYSIZE(KeysData); n++) - { - KeysData[n].Down = false; - KeysData[n].DownDuration = -1.0f; - KeysData[n].DownDurationPrev = -1.0f; - } - KeyCtrl = KeyShift = KeyAlt = KeySuper = false; - KeyMods = ImGuiModFlags_None; -} - -// Queue a new key down/up event. -// - ImGuiKey key: Translated key (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character) -// - bool down: Is the key down? use false to signify a key release. -// - float analog_value: 0.0f..1.0f -void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value) -{ - //if (e->Down) { IMGUI_DEBUG_LOG_IO("AddKeyEvent() Key='%s' %d, NativeKeycode = %d, NativeScancode = %d\n", ImGui::GetKeyName(e->Key), e->Down, e->NativeKeycode, e->NativeScancode); } - if (key == ImGuiKey_None || !AppAcceptingEvents) - return; - ImGuiContext& g = *GImGui; - IM_ASSERT(&g.IO == this && "Can only add events to current context."); - IM_ASSERT(ImGui::IsNamedKey(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API. - IM_ASSERT(!ImGui::IsAliasKey(key)); // Backend cannot submit ImGuiKey_MouseXXX values they are automatically inferred from AddMouseXXX() events. - - // Verify that backend isn't mixing up using new io.AddKeyEvent() api and old io.KeysDown[] + io.KeyMap[] data. -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - IM_ASSERT((BackendUsingLegacyKeyArrays == -1 || BackendUsingLegacyKeyArrays == 0) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); - if (BackendUsingLegacyKeyArrays == -1) - for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++) - IM_ASSERT(KeyMap[n] == -1 && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); - BackendUsingLegacyKeyArrays = 0; -#endif - if (ImGui::IsGamepadKey(key)) - BackendUsingLegacyNavInputArray = false; - - // Partial filter of duplicates (not strictly needed, but makes data neater in particular for key mods and gamepad values which are most commonly spmamed) - ImGuiKeyData* key_data = ImGui::GetKeyData(key); - if (key_data->Down == down && key_data->AnalogValue == analog_value) - { - bool found = false; - for (int n = g.InputEventsQueue.Size - 1; n >= 0 && !found; n--) - if (g.InputEventsQueue[n].Type == ImGuiInputEventType_Key && g.InputEventsQueue[n].Key.Key == key) - found = true; - if (!found) - return; - } - - // Add event - ImGuiInputEvent e; - e.Type = ImGuiInputEventType_Key; - e.Source = ImGui::IsGamepadKey(key) ? ImGuiInputSource_Gamepad : ImGuiInputSource_Keyboard; - e.Key.Key = key; - e.Key.Down = down; - e.Key.AnalogValue = analog_value; - g.InputEventsQueue.push_back(e); -} - -void ImGuiIO::AddKeyEvent(ImGuiKey key, bool down) -{ - if (!AppAcceptingEvents) - return; - AddKeyAnalogEvent(key, down, down ? 1.0f : 0.0f); -} - -// [Optional] Call after AddKeyEvent(). -// Specify native keycode, scancode + Specify index for legacy <1.87 IsKeyXXX() functions with native indices. -// If you are writing a backend in 2022 or don't use IsKeyXXX() with native values that are not ImGuiKey values, you can avoid calling this. -void ImGuiIO::SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index) -{ - if (key == ImGuiKey_None) - return; - IM_ASSERT(ImGui::IsNamedKey(key)); // >= 512 - IM_ASSERT(native_legacy_index == -1 || ImGui::IsLegacyKey(native_legacy_index)); // >= 0 && <= 511 - IM_UNUSED(native_keycode); // Yet unused - IM_UNUSED(native_scancode); // Yet unused - - // Build native->imgui map so old user code can still call key functions with native 0..511 values. -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - const int legacy_key = (native_legacy_index != -1) ? native_legacy_index : native_keycode; - if (!ImGui::IsLegacyKey(legacy_key)) - return; - KeyMap[legacy_key] = key; - KeyMap[key] = legacy_key; -#else - IM_UNUSED(key); - IM_UNUSED(native_legacy_index); -#endif -} - -// Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen. -void ImGuiIO::SetAppAcceptingEvents(bool accepting_events) -{ - AppAcceptingEvents = accepting_events; -} - -// Queue a mouse move event -void ImGuiIO::AddMousePosEvent(float x, float y) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(&g.IO == this && "Can only add events to current context."); - if (!AppAcceptingEvents) - return; - - ImGuiInputEvent e; - e.Type = ImGuiInputEventType_MousePos; - e.Source = ImGuiInputSource_Mouse; - e.MousePos.PosX = x; - e.MousePos.PosY = y; - g.InputEventsQueue.push_back(e); -} - -void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(&g.IO == this && "Can only add events to current context."); - IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT); - if (!AppAcceptingEvents) - return; - - ImGuiInputEvent e; - e.Type = ImGuiInputEventType_MouseButton; - e.Source = ImGuiInputSource_Mouse; - e.MouseButton.Button = mouse_button; - e.MouseButton.Down = down; - g.InputEventsQueue.push_back(e); -} - -// Queue a mouse wheel event (most mouse/API will only have a Y component) -void ImGuiIO::AddMouseWheelEvent(float wheel_x, float wheel_y) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(&g.IO == this && "Can only add events to current context."); - if ((wheel_x == 0.0f && wheel_y == 0.0f) || !AppAcceptingEvents) - return; - - ImGuiInputEvent e; - e.Type = ImGuiInputEventType_MouseWheel; - e.Source = ImGuiInputSource_Mouse; - e.MouseWheel.WheelX = wheel_x; - e.MouseWheel.WheelY = wheel_y; - g.InputEventsQueue.push_back(e); -} - -void ImGuiIO::AddFocusEvent(bool focused) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(&g.IO == this && "Can only add events to current context."); - - ImGuiInputEvent e; - e.Type = ImGuiInputEventType_Focus; - e.AppFocused.Focused = focused; - g.InputEventsQueue.push_back(e); -} - -//----------------------------------------------------------------------------- -// [SECTION] MISC HELPERS/UTILITIES (Geometry functions) -//----------------------------------------------------------------------------- - -ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments) -{ - IM_ASSERT(num_segments > 0); // Use ImBezierCubicClosestPointCasteljau() - ImVec2 p_last = p1; - ImVec2 p_closest; - float p_closest_dist2 = FLT_MAX; - float t_step = 1.0f / (float)num_segments; - for (int i_step = 1; i_step <= num_segments; i_step++) - { - ImVec2 p_current = ImBezierCubicCalc(p1, p2, p3, p4, t_step * i_step); - ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p); - float dist2 = ImLengthSqr(p - p_line); - if (dist2 < p_closest_dist2) - { - p_closest = p_line; - p_closest_dist2 = dist2; - } - p_last = p_current; - } - return p_closest; -} - -// Closely mimics PathBezierToCasteljau() in imgui_draw.cpp -static void ImBezierCubicClosestPointCasteljauStep(const ImVec2& p, ImVec2& p_closest, ImVec2& p_last, float& p_closest_dist2, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) -{ - float dx = x4 - x1; - float dy = y4 - y1; - float d2 = ((x2 - x4) * dy - (y2 - y4) * dx); - float d3 = ((x3 - x4) * dy - (y3 - y4) * dx); - d2 = (d2 >= 0) ? d2 : -d2; - d3 = (d3 >= 0) ? d3 : -d3; - if ((d2 + d3) * (d2 + d3) < tess_tol * (dx * dx + dy * dy)) - { - ImVec2 p_current(x4, y4); - ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p); - float dist2 = ImLengthSqr(p - p_line); - if (dist2 < p_closest_dist2) - { - p_closest = p_line; - p_closest_dist2 = dist2; - } - p_last = p_current; - } - else if (level < 10) - { - float x12 = (x1 + x2)*0.5f, y12 = (y1 + y2)*0.5f; - float x23 = (x2 + x3)*0.5f, y23 = (y2 + y3)*0.5f; - float x34 = (x3 + x4)*0.5f, y34 = (y3 + y4)*0.5f; - float x123 = (x12 + x23)*0.5f, y123 = (y12 + y23)*0.5f; - float x234 = (x23 + x34)*0.5f, y234 = (y23 + y34)*0.5f; - float x1234 = (x123 + x234)*0.5f, y1234 = (y123 + y234)*0.5f; - ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1); - ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1); - } -} - -// tess_tol is generally the same value you would find in ImGui::GetStyle().CurveTessellationTol -// Because those ImXXX functions are lower-level than ImGui:: we cannot access this value automatically. -ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol) -{ - IM_ASSERT(tess_tol > 0.0f); - ImVec2 p_last = p1; - ImVec2 p_closest; - float p_closest_dist2 = FLT_MAX; - ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, tess_tol, 0); - return p_closest; -} - -ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p) -{ - ImVec2 ap = p - a; - ImVec2 ab_dir = b - a; - float dot = ap.x * ab_dir.x + ap.y * ab_dir.y; - if (dot < 0.0f) - return a; - float ab_len_sqr = ab_dir.x * ab_dir.x + ab_dir.y * ab_dir.y; - if (dot > ab_len_sqr) - return b; - return a + ab_dir * dot / ab_len_sqr; -} - -bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p) -{ - bool b1 = ((p.x - b.x) * (a.y - b.y) - (p.y - b.y) * (a.x - b.x)) < 0.0f; - bool b2 = ((p.x - c.x) * (b.y - c.y) - (p.y - c.y) * (b.x - c.x)) < 0.0f; - bool b3 = ((p.x - a.x) * (c.y - a.y) - (p.y - a.y) * (c.x - a.x)) < 0.0f; - return ((b1 == b2) && (b2 == b3)); -} - -void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w) -{ - ImVec2 v0 = b - a; - ImVec2 v1 = c - a; - ImVec2 v2 = p - a; - const float denom = v0.x * v1.y - v1.x * v0.y; - out_v = (v2.x * v1.y - v1.x * v2.y) / denom; - out_w = (v0.x * v2.y - v2.x * v0.y) / denom; - out_u = 1.0f - out_v - out_w; -} - -ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p) -{ - ImVec2 proj_ab = ImLineClosestPoint(a, b, p); - ImVec2 proj_bc = ImLineClosestPoint(b, c, p); - ImVec2 proj_ca = ImLineClosestPoint(c, a, p); - float dist2_ab = ImLengthSqr(p - proj_ab); - float dist2_bc = ImLengthSqr(p - proj_bc); - float dist2_ca = ImLengthSqr(p - proj_ca); - float m = ImMin(dist2_ab, ImMin(dist2_bc, dist2_ca)); - if (m == dist2_ab) - return proj_ab; - if (m == dist2_bc) - return proj_bc; - return proj_ca; -} - -//----------------------------------------------------------------------------- -// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions) -//----------------------------------------------------------------------------- - -// Consider using _stricmp/_strnicmp under Windows or strcasecmp/strncasecmp. We don't actually use either ImStricmp/ImStrnicmp in the codebase any more. -int ImStricmp(const char* str1, const char* str2) -{ - int d; - while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } - return d; -} - -int ImStrnicmp(const char* str1, const char* str2, size_t count) -{ - int d = 0; - while (count > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; count--; } - return d; -} - -void ImStrncpy(char* dst, const char* src, size_t count) -{ - if (count < 1) - return; - if (count > 1) - strncpy(dst, src, count - 1); - dst[count - 1] = 0; -} - -char* ImStrdup(const char* str) -{ - size_t len = strlen(str); - void* buf = IM_ALLOC(len + 1); - return (char*)memcpy(buf, (const void*)str, len + 1); -} - -char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* src) -{ - size_t dst_buf_size = p_dst_size ? *p_dst_size : strlen(dst) + 1; - size_t src_size = strlen(src) + 1; - if (dst_buf_size < src_size) - { - IM_FREE(dst); - dst = (char*)IM_ALLOC(src_size); - if (p_dst_size) - *p_dst_size = src_size; - } - return (char*)memcpy(dst, (const void*)src, src_size); -} - -const char* ImStrchrRange(const char* str, const char* str_end, char c) -{ - const char* p = (const char*)memchr(str, (int)c, str_end - str); - return p; -} - -int ImStrlenW(const ImWchar* str) -{ - //return (int)wcslen((const wchar_t*)str); // FIXME-OPT: Could use this when wchar_t are 16-bit - int n = 0; - while (*str++) n++; - return n; -} - -// Find end-of-line. Return pointer will point to either first \n, either str_end. -const char* ImStreolRange(const char* str, const char* str_end) -{ - const char* p = (const char*)memchr(str, '\n', str_end - str); - return p ? p : str_end; -} - -const ImWchar* ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin) // find beginning-of-line -{ - while (buf_mid_line > buf_begin && buf_mid_line[-1] != '\n') - buf_mid_line--; - return buf_mid_line; -} - -const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end) -{ - if (!needle_end) - needle_end = needle + strlen(needle); - - const char un0 = (char)toupper(*needle); - while ((!haystack_end && *haystack) || (haystack_end && haystack < haystack_end)) - { - if (toupper(*haystack) == un0) - { - const char* b = needle + 1; - for (const char* a = haystack + 1; b < needle_end; a++, b++) - if (toupper(*a) != toupper(*b)) - break; - if (b == needle_end) - return haystack; - } - haystack++; - } - return NULL; -} - -// Trim str by offsetting contents when there's leading data + writing a \0 at the trailing position. We use this in situation where the cost is negligible. -void ImStrTrimBlanks(char* buf) -{ - char* p = buf; - while (p[0] == ' ' || p[0] == '\t') // Leading blanks - p++; - char* p_start = p; - while (*p != 0) // Find end of string - p++; - while (p > p_start && (p[-1] == ' ' || p[-1] == '\t')) // Trailing blanks - p--; - if (p_start != buf) // Copy memory if we had leading blanks - memmove(buf, p_start, p - p_start); - buf[p - p_start] = 0; // Zero terminate -} - -const char* ImStrSkipBlank(const char* str) -{ - while (str[0] == ' ' || str[0] == '\t') - str++; - return str; -} - -// A) MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size). -// Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm. -// B) When buf==NULL vsnprintf() will return the output size. -#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS - -// We support stb_sprintf which is much faster (see: https://github.com/nothings/stb/blob/master/stb_sprintf.h) -// You may set IMGUI_USE_STB_SPRINTF to use our default wrapper, or set IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS -// and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are -// designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.) -#ifdef IMGUI_USE_STB_SPRINTF -#define STB_SPRINTF_IMPLEMENTATION -#ifdef IMGUI_STB_SPRINTF_FILENAME -#include IMGUI_STB_SPRINTF_FILENAME -#else -#include "stb_sprintf.h" -#endif -#endif - -#if defined(_MSC_VER) && !defined(vsnprintf) -#define vsnprintf _vsnprintf -#endif - -int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); -#ifdef IMGUI_USE_STB_SPRINTF - int w = stbsp_vsnprintf(buf, (int)buf_size, fmt, args); -#else - int w = vsnprintf(buf, buf_size, fmt, args); -#endif - va_end(args); - if (buf == NULL) - return w; - if (w == -1 || w >= (int)buf_size) - w = (int)buf_size - 1; - buf[w] = 0; - return w; -} - -int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) -{ -#ifdef IMGUI_USE_STB_SPRINTF - int w = stbsp_vsnprintf(buf, (int)buf_size, fmt, args); -#else - int w = vsnprintf(buf, buf_size, fmt, args); -#endif - if (buf == NULL) - return w; - if (w == -1 || w >= (int)buf_size) - w = (int)buf_size - 1; - buf[w] = 0; - return w; -} -#endif // #ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS - -void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) -{ - ImGuiContext& g = *GImGui; - va_list args; - va_start(args, fmt); - int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args); - *out_buf = g.TempBuffer.Data; - if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; } - va_end(args); -} - -void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) -{ - ImGuiContext& g = *GImGui; - int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args); - *out_buf = g.TempBuffer.Data; - if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; } -} - -// CRC32 needs a 1KB lookup table (not cache friendly) -// Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily: -// - avoid an unnecessary branch/memory tap, - keep the ImHashXXX functions usable by static constructors, - make it thread-safe. -static const ImU32 GCrc32LookupTable[256] = -{ - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91, - 0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5, - 0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59, - 0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D, - 0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01, - 0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65, - 0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD, - 0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1, - 0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5, - 0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79, - 0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D, - 0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21, - 0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9, - 0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D, -}; - -// Known size hash -// It is ok to call ImHashData on a string with known length but the ### operator won't be supported. -// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. -ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed) -{ - ImU32 crc = ~seed; - const unsigned char* data = (const unsigned char*)data_p; - const ImU32* crc32_lut = GCrc32LookupTable; - while (data_size-- != 0) - crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *data++]; - return ~crc; -} - -// Zero-terminated string hash, with support for ### to reset back to seed value -// We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed. -// Because this syntax is rarely used we are optimizing for the common case. -// - If we reach ### in the string we discard the hash so far and reset to the seed. -// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build) -// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. -ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed) -{ - seed = ~seed; - ImU32 crc = seed; - const unsigned char* data = (const unsigned char*)data_p; - const ImU32* crc32_lut = GCrc32LookupTable; - if (data_size != 0) - { - while (data_size-- != 0) - { - unsigned char c = *data++; - if (c == '#' && data_size >= 2 && data[0] == '#' && data[1] == '#') - crc = seed; - crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; - } - } - else - { - while (unsigned char c = *data++) - { - if (c == '#' && data[0] == '#' && data[1] == '#') - crc = seed; - crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; - } - } - return ~crc; -} - -//----------------------------------------------------------------------------- -// [SECTION] MISC HELPERS/UTILITIES (File functions) -//----------------------------------------------------------------------------- - -// Default file functions -#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS - -ImFileHandle ImFileOpen(const char* filename, const char* mode) -{ -#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(__CYGWIN__) && !defined(__GNUC__) - // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. - // Previously we used ImTextCountCharsFromUtf8/ImTextStrFromUtf8 here but we now need to support ImWchar16 and ImWchar32! - const int filename_wsize = ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0); - const int mode_wsize = ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0); - ImVector buf; - buf.resize(filename_wsize + mode_wsize); - ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, (wchar_t*)&buf[0], filename_wsize); - ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, (wchar_t*)&buf[filename_wsize], mode_wsize); - return ::_wfopen((const wchar_t*)&buf[0], (const wchar_t*)&buf[filename_wsize]); -#else - return fopen(filename, mode); -#endif -} - -// We should in theory be using fseeko()/ftello() with off_t and _fseeki64()/_ftelli64() with __int64, waiting for the PR that does that in a very portable pre-C++11 zero-warnings way. -bool ImFileClose(ImFileHandle f) { return fclose(f) == 0; } -ImU64 ImFileGetSize(ImFileHandle f) { long off = 0, sz = 0; return ((off = ftell(f)) != -1 && !fseek(f, 0, SEEK_END) && (sz = ftell(f)) != -1 && !fseek(f, off, SEEK_SET)) ? (ImU64)sz : (ImU64)-1; } -ImU64 ImFileRead(void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fread(data, (size_t)sz, (size_t)count, f); } -ImU64 ImFileWrite(const void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fwrite(data, (size_t)sz, (size_t)count, f); } -#endif // #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS - -// Helper: Load file content into memory -// Memory allocated with IM_ALLOC(), must be freed by user using IM_FREE() == ImGui::MemFree() -// This can't really be used with "rt" because fseek size won't match read size. -void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size, int padding_bytes) -{ - IM_ASSERT(filename && mode); - if (out_file_size) - *out_file_size = 0; - - ImFileHandle f; - if ((f = ImFileOpen(filename, mode)) == NULL) - return NULL; - - size_t file_size = (size_t)ImFileGetSize(f); - if (file_size == (size_t)-1) - { - ImFileClose(f); - return NULL; - } - - void* file_data = IM_ALLOC(file_size + padding_bytes); - if (file_data == NULL) - { - ImFileClose(f); - return NULL; - } - if (ImFileRead(file_data, 1, file_size, f) != file_size) - { - ImFileClose(f); - IM_FREE(file_data); - return NULL; - } - if (padding_bytes > 0) - memset((void*)(((char*)file_data) + file_size), 0, (size_t)padding_bytes); - - ImFileClose(f); - if (out_file_size) - *out_file_size = file_size; - - return file_data; -} - -//----------------------------------------------------------------------------- -// [SECTION] MISC HELPERS/UTILITIES (ImText* functions) -//----------------------------------------------------------------------------- - -// Convert UTF-8 to 32-bit character, process single character input. -// A nearly-branchless UTF-8 decoder, based on work of Christopher Wellons (https://github.com/skeeto/branchless-utf8). -// We handle UTF-8 decoding error by skipping forward. -int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end) -{ - static const char lengths[32] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 4, 0 }; - static const int masks[] = { 0x00, 0x7f, 0x1f, 0x0f, 0x07 }; - static const uint32_t mins[] = { 0x400000, 0, 0x80, 0x800, 0x10000 }; - static const int shiftc[] = { 0, 18, 12, 6, 0 }; - static const int shifte[] = { 0, 6, 4, 2, 0 }; - int len = lengths[*(const unsigned char*)in_text >> 3]; - int wanted = len + !len; - - if (in_text_end == NULL) - in_text_end = in_text + wanted; // Max length, nulls will be taken into account. - - // Copy at most 'len' bytes, stop copying at 0 or past in_text_end. Branch predictor does a good job here, - // so it is fast even with excessive branching. - unsigned char s[4]; - s[0] = in_text + 0 < in_text_end ? in_text[0] : 0; - s[1] = in_text + 1 < in_text_end ? in_text[1] : 0; - s[2] = in_text + 2 < in_text_end ? in_text[2] : 0; - s[3] = in_text + 3 < in_text_end ? in_text[3] : 0; - - // Assume a four-byte character and load four bytes. Unused bits are shifted out. - *out_char = (uint32_t)(s[0] & masks[len]) << 18; - *out_char |= (uint32_t)(s[1] & 0x3f) << 12; - *out_char |= (uint32_t)(s[2] & 0x3f) << 6; - *out_char |= (uint32_t)(s[3] & 0x3f) << 0; - *out_char >>= shiftc[len]; - - // Accumulate the various error conditions. - int e = 0; - e = (*out_char < mins[len]) << 6; // non-canonical encoding - e |= ((*out_char >> 11) == 0x1b) << 7; // surrogate half? - e |= (*out_char > IM_UNICODE_CODEPOINT_MAX) << 8; // out of range? - e |= (s[1] & 0xc0) >> 2; - e |= (s[2] & 0xc0) >> 4; - e |= (s[3] ) >> 6; - e ^= 0x2a; // top two bits of each tail byte correct? - e >>= shifte[len]; - - if (e) - { - // No bytes are consumed when *in_text == 0 || in_text == in_text_end. - // One byte is consumed in case of invalid first byte of in_text. - // All available bytes (at most `len` bytes) are consumed on incomplete/invalid second to last bytes. - // Invalid or incomplete input may consume less bytes than wanted, therefore every byte has to be inspected in s. - wanted = ImMin(wanted, !!s[0] + !!s[1] + !!s[2] + !!s[3]); - *out_char = IM_UNICODE_CODEPOINT_INVALID; - } - - return wanted; -} - -int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_text_remaining) -{ - ImWchar* buf_out = buf; - ImWchar* buf_end = buf + buf_size; - while (buf_out < buf_end - 1 && (!in_text_end || in_text < in_text_end) && *in_text) - { - unsigned int c; - in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); - if (c == 0) - break; - *buf_out++ = (ImWchar)c; - } - *buf_out = 0; - if (in_text_remaining) - *in_text_remaining = in_text; - return (int)(buf_out - buf); -} - -int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end) -{ - int char_count = 0; - while ((!in_text_end || in_text < in_text_end) && *in_text) - { - unsigned int c; - in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); - if (c == 0) - break; - char_count++; - } - return char_count; -} - -// Based on stb_to_utf8() from github.com/nothings/stb/ -static inline int ImTextCharToUtf8_inline(char* buf, int buf_size, unsigned int c) -{ - if (c < 0x80) - { - buf[0] = (char)c; - return 1; - } - if (c < 0x800) - { - if (buf_size < 2) return 0; - buf[0] = (char)(0xc0 + (c >> 6)); - buf[1] = (char)(0x80 + (c & 0x3f)); - return 2; - } - if (c < 0x10000) - { - if (buf_size < 3) return 0; - buf[0] = (char)(0xe0 + (c >> 12)); - buf[1] = (char)(0x80 + ((c >> 6) & 0x3f)); - buf[2] = (char)(0x80 + ((c ) & 0x3f)); - return 3; - } - if (c <= 0x10FFFF) - { - if (buf_size < 4) return 0; - buf[0] = (char)(0xf0 + (c >> 18)); - buf[1] = (char)(0x80 + ((c >> 12) & 0x3f)); - buf[2] = (char)(0x80 + ((c >> 6) & 0x3f)); - buf[3] = (char)(0x80 + ((c ) & 0x3f)); - return 4; - } - // Invalid code point, the max unicode is 0x10FFFF - return 0; -} - -const char* ImTextCharToUtf8(char out_buf[5], unsigned int c) -{ - int count = ImTextCharToUtf8_inline(out_buf, 5, c); - out_buf[count] = 0; - return out_buf; -} - -// Not optimal but we very rarely use this function. -int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end) -{ - unsigned int unused = 0; - return ImTextCharFromUtf8(&unused, in_text, in_text_end); -} - -static inline int ImTextCountUtf8BytesFromChar(unsigned int c) -{ - if (c < 0x80) return 1; - if (c < 0x800) return 2; - if (c < 0x10000) return 3; - if (c <= 0x10FFFF) return 4; - return 3; -} - -int ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end) -{ - char* buf_p = out_buf; - const char* buf_end = out_buf + out_buf_size; - while (buf_p < buf_end - 1 && (!in_text_end || in_text < in_text_end) && *in_text) - { - unsigned int c = (unsigned int)(*in_text++); - if (c < 0x80) - *buf_p++ = (char)c; - else - buf_p += ImTextCharToUtf8_inline(buf_p, (int)(buf_end - buf_p - 1), c); - } - *buf_p = 0; - return (int)(buf_p - out_buf); -} - -int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end) -{ - int bytes_count = 0; - while ((!in_text_end || in_text < in_text_end) && *in_text) - { - unsigned int c = (unsigned int)(*in_text++); - if (c < 0x80) - bytes_count++; - else - bytes_count += ImTextCountUtf8BytesFromChar(c); - } - return bytes_count; -} - -//----------------------------------------------------------------------------- -// [SECTION] MISC HELPERS/UTILITIES (Color functions) -// Note: The Convert functions are early design which are not consistent with other API. -//----------------------------------------------------------------------------- - -IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b) -{ - float t = ((col_b >> IM_COL32_A_SHIFT) & 0xFF) / 255.f; - int r = ImLerp((int)(col_a >> IM_COL32_R_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_R_SHIFT) & 0xFF, t); - int g = ImLerp((int)(col_a >> IM_COL32_G_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_G_SHIFT) & 0xFF, t); - int b = ImLerp((int)(col_a >> IM_COL32_B_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_B_SHIFT) & 0xFF, t); - return IM_COL32(r, g, b, 0xFF); -} - -ImVec4 ImGui::ColorConvertU32ToFloat4(ImU32 in) -{ - float s = 1.0f / 255.0f; - return ImVec4( - ((in >> IM_COL32_R_SHIFT) & 0xFF) * s, - ((in >> IM_COL32_G_SHIFT) & 0xFF) * s, - ((in >> IM_COL32_B_SHIFT) & 0xFF) * s, - ((in >> IM_COL32_A_SHIFT) & 0xFF) * s); -} - -ImU32 ImGui::ColorConvertFloat4ToU32(const ImVec4& in) -{ - ImU32 out; - out = ((ImU32)IM_F32_TO_INT8_SAT(in.x)) << IM_COL32_R_SHIFT; - out |= ((ImU32)IM_F32_TO_INT8_SAT(in.y)) << IM_COL32_G_SHIFT; - out |= ((ImU32)IM_F32_TO_INT8_SAT(in.z)) << IM_COL32_B_SHIFT; - out |= ((ImU32)IM_F32_TO_INT8_SAT(in.w)) << IM_COL32_A_SHIFT; - return out; -} - -// Convert rgb floats ([0-1],[0-1],[0-1]) to hsv floats ([0-1],[0-1],[0-1]), from Foley & van Dam p592 -// Optimized http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv -void ImGui::ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v) -{ - float K = 0.f; - if (g < b) - { - ImSwap(g, b); - K = -1.f; - } - if (r < g) - { - ImSwap(r, g); - K = -2.f / 6.f - K; - } - - const float chroma = r - (g < b ? g : b); - out_h = ImFabs(K + (g - b) / (6.f * chroma + 1e-20f)); - out_s = chroma / (r + 1e-20f); - out_v = r; -} - -// Convert hsv floats ([0-1],[0-1],[0-1]) to rgb floats ([0-1],[0-1],[0-1]), from Foley & van Dam p593 -// also http://en.wikipedia.org/wiki/HSL_and_HSV -void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b) -{ - if (s == 0.0f) - { - // gray - out_r = out_g = out_b = v; - return; - } - - h = ImFmod(h, 1.0f) / (60.0f / 360.0f); - int i = (int)h; - float f = h - (float)i; - float p = v * (1.0f - s); - float q = v * (1.0f - s * f); - float t = v * (1.0f - s * (1.0f - f)); - - switch (i) - { - case 0: out_r = v; out_g = t; out_b = p; break; - case 1: out_r = q; out_g = v; out_b = p; break; - case 2: out_r = p; out_g = v; out_b = t; break; - case 3: out_r = p; out_g = q; out_b = v; break; - case 4: out_r = t; out_g = p; out_b = v; break; - case 5: default: out_r = v; out_g = p; out_b = q; break; - } -} - -//----------------------------------------------------------------------------- -// [SECTION] ImGuiStorage -// Helper: Key->value storage -//----------------------------------------------------------------------------- - -// std::lower_bound but without the bullshit -static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector& data, ImGuiID key) -{ - ImGuiStorage::ImGuiStoragePair* first = data.Data; - ImGuiStorage::ImGuiStoragePair* last = data.Data + data.Size; - size_t count = (size_t)(last - first); - while (count > 0) - { - size_t count2 = count >> 1; - ImGuiStorage::ImGuiStoragePair* mid = first + count2; - if (mid->key < key) - { - first = ++mid; - count -= count2 + 1; - } - else - { - count = count2; - } - } - return first; -} - -// For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. -void ImGuiStorage::BuildSortByKey() -{ - struct StaticFunc - { - static int IMGUI_CDECL PairComparerByID(const void* lhs, const void* rhs) - { - // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that. - if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1; - if (((const ImGuiStoragePair*)lhs)->key < ((const ImGuiStoragePair*)rhs)->key) return -1; - return 0; - } - }; - ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairComparerByID); -} - -int ImGuiStorage::GetInt(ImGuiID key, int default_val) const -{ - ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); - if (it == Data.end() || it->key != key) - return default_val; - return it->val_i; -} - -bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const -{ - return GetInt(key, default_val ? 1 : 0) != 0; -} - -float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const -{ - ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); - if (it == Data.end() || it->key != key) - return default_val; - return it->val_f; -} - -void* ImGuiStorage::GetVoidPtr(ImGuiID key) const -{ - ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); - if (it == Data.end() || it->key != key) - return NULL; - return it->val_p; -} - -// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. -int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val) -{ - ImGuiStoragePair* it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - it = Data.insert(it, ImGuiStoragePair(key, default_val)); - return &it->val_i; -} - -bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val) -{ - return (bool*)GetIntRef(key, default_val ? 1 : 0); -} - -float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val) -{ - ImGuiStoragePair* it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - it = Data.insert(it, ImGuiStoragePair(key, default_val)); - return &it->val_f; -} - -void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val) -{ - ImGuiStoragePair* it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - it = Data.insert(it, ImGuiStoragePair(key, default_val)); - return &it->val_p; -} - -// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame) -void ImGuiStorage::SetInt(ImGuiID key, int val) -{ - ImGuiStoragePair* it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - { - Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_i = val; -} - -void ImGuiStorage::SetBool(ImGuiID key, bool val) -{ - SetInt(key, val ? 1 : 0); -} - -void ImGuiStorage::SetFloat(ImGuiID key, float val) -{ - ImGuiStoragePair* it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - { - Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_f = val; -} - -void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val) -{ - ImGuiStoragePair* it = LowerBound(Data, key); - if (it == Data.end() || it->key != key) - { - Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_p = val; -} - -void ImGuiStorage::SetAllInt(int v) -{ - for (int i = 0; i < Data.Size; i++) - Data[i].val_i = v; -} - -//----------------------------------------------------------------------------- -// [SECTION] ImGuiTextFilter -//----------------------------------------------------------------------------- - -// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" -ImGuiTextFilter::ImGuiTextFilter(const char* default_filter) //-V1077 -{ - InputBuf[0] = 0; - CountGrep = 0; - if (default_filter) - { - ImStrncpy(InputBuf, default_filter, IM_ARRAYSIZE(InputBuf)); - Build(); - } -} - -bool ImGuiTextFilter::Draw(const char* label, float width) -{ - if (width != 0.0f) - ImGui::SetNextItemWidth(width); - bool value_changed = ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf)); - if (value_changed) - Build(); - return value_changed; -} - -void ImGuiTextFilter::ImGuiTextRange::split(char separator, ImVector* out) const -{ - out->resize(0); - const char* wb = b; - const char* we = wb; - while (we < e) - { - if (*we == separator) - { - out->push_back(ImGuiTextRange(wb, we)); - wb = we + 1; - } - we++; - } - if (wb != we) - out->push_back(ImGuiTextRange(wb, we)); -} - -void ImGuiTextFilter::Build() -{ - Filters.resize(0); - ImGuiTextRange input_range(InputBuf, InputBuf + strlen(InputBuf)); - input_range.split(',', &Filters); - - CountGrep = 0; - for (int i = 0; i != Filters.Size; i++) - { - ImGuiTextRange& f = Filters[i]; - while (f.b < f.e && ImCharIsBlankA(f.b[0])) - f.b++; - while (f.e > f.b && ImCharIsBlankA(f.e[-1])) - f.e--; - if (f.empty()) - continue; - if (Filters[i].b[0] != '-') - CountGrep += 1; - } -} - -bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const -{ - if (Filters.empty()) - return true; - - if (text == NULL) - text = ""; - - for (int i = 0; i != Filters.Size; i++) - { - const ImGuiTextRange& f = Filters[i]; - if (f.empty()) - continue; - if (f.b[0] == '-') - { - // Subtract - if (ImStristr(text, text_end, f.b + 1, f.e) != NULL) - return false; - } - else - { - // Grep - if (ImStristr(text, text_end, f.b, f.e) != NULL) - return true; - } - } - - // Implicit * grep - if (CountGrep == 0) - return true; - - return false; -} - -//----------------------------------------------------------------------------- -// [SECTION] ImGuiTextBuffer -//----------------------------------------------------------------------------- - -// On some platform vsnprintf() takes va_list by reference and modifies it. -// va_copy is the 'correct' way to copy a va_list but Visual Studio prior to 2013 doesn't have it. -#ifndef va_copy -#if defined(__GNUC__) || defined(__clang__) -#define va_copy(dest, src) __builtin_va_copy(dest, src) -#else -#define va_copy(dest, src) (dest = src) -#endif -#endif - -char ImGuiTextBuffer::EmptyString[1] = { 0 }; - -void ImGuiTextBuffer::append(const char* str, const char* str_end) -{ - int len = str_end ? (int)(str_end - str) : (int)strlen(str); - - // Add zero-terminator the first time - const int write_off = (Buf.Size != 0) ? Buf.Size : 1; - const int needed_sz = write_off + len; - if (write_off + len >= Buf.Capacity) - { - int new_capacity = Buf.Capacity * 2; - Buf.reserve(needed_sz > new_capacity ? needed_sz : new_capacity); - } - - Buf.resize(needed_sz); - memcpy(&Buf[write_off - 1], str, (size_t)len); - Buf[write_off - 1 + len] = 0; -} - -void ImGuiTextBuffer::appendf(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - appendfv(fmt, args); - va_end(args); -} - -// Helper: Text buffer for logging/accumulating text -void ImGuiTextBuffer::appendfv(const char* fmt, va_list args) -{ - va_list args_copy; - va_copy(args_copy, args); - - int len = ImFormatStringV(NULL, 0, fmt, args); // FIXME-OPT: could do a first pass write attempt, likely successful on first pass. - if (len <= 0) - { - va_end(args_copy); - return; - } - - // Add zero-terminator the first time - const int write_off = (Buf.Size != 0) ? Buf.Size : 1; - const int needed_sz = write_off + len; - if (write_off + len >= Buf.Capacity) - { - int new_capacity = Buf.Capacity * 2; - Buf.reserve(needed_sz > new_capacity ? needed_sz : new_capacity); - } - - Buf.resize(needed_sz); - ImFormatStringV(&Buf[write_off - 1], (size_t)len + 1, fmt, args_copy); - va_end(args_copy); -} - -//----------------------------------------------------------------------------- -// [SECTION] ImGuiListClipper -// This is currently not as flexible/powerful as it should be and really confusing/spaghetti, mostly because we changed -// the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO) -//----------------------------------------------------------------------------- - -// FIXME-TABLE: This prevents us from using ImGuiListClipper _inside_ a table cell. -// The problem we have is that without a Begin/End scheme for rows using the clipper is ambiguous. -static bool GetSkipItemForListClipping() -{ - ImGuiContext& g = *GImGui; - return (g.CurrentTable ? g.CurrentTable->HostSkipItems : g.CurrentWindow->SkipItems); -} - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -// Legacy helper to calculate coarse clipping of large list of evenly sized items. -// This legacy API is not ideal because it assume we will return a single contiguous rectangle. -// Prefer using ImGuiListClipper which can returns non-contiguous ranges. -void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.LogEnabled) - { - // If logging is active, do not perform any clipping - *out_items_display_start = 0; - *out_items_display_end = items_count; - return; - } - if (GetSkipItemForListClipping()) - { - *out_items_display_start = *out_items_display_end = 0; - return; - } - - // We create the union of the ClipRect and the scoring rect which at worst should be 1 page away from ClipRect - // We don't include g.NavId's rectangle in there (unless g.NavJustMovedToId is set) because the rectangle enlargement can get costly. - ImRect rect = window->ClipRect; - if (g.NavMoveScoringItems) - rect.Add(g.NavScoringNoClipRect); - if (g.NavJustMovedToId && window->NavLastIds[0] == g.NavJustMovedToId) - rect.Add(WindowRectRelToAbs(window, window->NavRectRel[0])); // Could store and use NavJustMovedToRectRel - - const ImVec2 pos = window->DC.CursorPos; - int start = (int)((rect.Min.y - pos.y) / items_height); - int end = (int)((rect.Max.y - pos.y) / items_height); - - // When performing a navigation request, ensure we have one item extra in the direction we are moving to - // FIXME: Verify this works with tabbing - const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); - if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) - start--; - if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) - end++; - - start = ImClamp(start, 0, items_count); - end = ImClamp(end + 1, start, items_count); - *out_items_display_start = start; - *out_items_display_end = end; -} -#endif - -static void ImGuiListClipper_SortAndFuseRanges(ImVector& ranges, int offset = 0) -{ - if (ranges.Size - offset <= 1) - return; - - // Helper to order ranges and fuse them together if possible (bubble sort is fine as we are only sorting 2-3 entries) - for (int sort_end = ranges.Size - offset - 1; sort_end > 0; --sort_end) - for (int i = offset; i < sort_end + offset; ++i) - if (ranges[i].Min > ranges[i + 1].Min) - ImSwap(ranges[i], ranges[i + 1]); - - // Now fuse ranges together as much as possible. - for (int i = 1 + offset; i < ranges.Size; i++) - { - IM_ASSERT(!ranges[i].PosToIndexConvert && !ranges[i - 1].PosToIndexConvert); - if (ranges[i - 1].Max < ranges[i].Min) - continue; - ranges[i - 1].Min = ImMin(ranges[i - 1].Min, ranges[i].Min); - ranges[i - 1].Max = ImMax(ranges[i - 1].Max, ranges[i].Max); - ranges.erase(ranges.Data + i); - i--; - } -} - -static void ImGuiListClipper_SeekCursorAndSetupPrevLine(float pos_y, float line_height) -{ - // Set cursor position and a few other things so that SetScrollHereY() and Columns() can work when seeking cursor. - // FIXME: It is problematic that we have to do that here, because custom/equivalent end-user code would stumble on the same issue. - // The clipper should probably have a final step to display the last item in a regular manner, maybe with an opt-out flag for data sets which may have costly seek? - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - float off_y = pos_y - window->DC.CursorPos.y; - window->DC.CursorPos.y = pos_y; - window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, pos_y - g.Style.ItemSpacing.y); - window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage. - window->DC.PrevLineSize.y = (line_height - g.Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list. - if (ImGuiOldColumns* columns = window->DC.CurrentColumns) - columns->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly - if (ImGuiTable* table = g.CurrentTable) - { - if (table->IsInsideRow) - ImGui::TableEndRow(table); - table->RowPosY2 = window->DC.CursorPos.y; - const int row_increase = (int)((off_y / line_height) + 0.5f); - //table->CurrentRow += row_increase; // Can't do without fixing TableEndRow() - table->RowBgColorCounter += row_increase; - } -} - -static void ImGuiListClipper_SeekCursorForItem(ImGuiListClipper* clipper, int item_n) -{ - // StartPosY starts from ItemsFrozen hence the subtraction - // Perform the add and multiply with double to allow seeking through larger ranges - ImGuiListClipperData* data = (ImGuiListClipperData*)clipper->TempData; - float pos_y = (float)((double)clipper->StartPosY + data->LossynessOffset + (double)(item_n - data->ItemsFrozen) * clipper->ItemsHeight); - ImGuiListClipper_SeekCursorAndSetupPrevLine(pos_y, clipper->ItemsHeight); -} - -ImGuiListClipper::ImGuiListClipper() -{ - memset(this, 0, sizeof(*this)); - ItemsCount = -1; -} - -ImGuiListClipper::~ImGuiListClipper() -{ - End(); -} - -// Use case A: Begin() called from constructor with items_height<0, then called again from Step() in StepNo 1 -// Use case B: Begin() called from constructor with items_height>0 -// FIXME-LEGACY: Ideally we should remove the Begin/End functions but they are part of the legacy API we still support. This is why some of the code in Step() calling Begin() and reassign some fields, spaghetti style. -void ImGuiListClipper::Begin(int items_count, float items_height) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - if (ImGuiTable* table = g.CurrentTable) - if (table->IsInsideRow) - ImGui::TableEndRow(table); - - StartPosY = window->DC.CursorPos.y; - ItemsHeight = items_height; - ItemsCount = items_count; - DisplayStart = -1; - DisplayEnd = 0; - - // Acquire temporary buffer - if (++g.ClipperTempDataStacked > g.ClipperTempData.Size) - g.ClipperTempData.resize(g.ClipperTempDataStacked, ImGuiListClipperData()); - ImGuiListClipperData* data = &g.ClipperTempData[g.ClipperTempDataStacked - 1]; - data->Reset(this); - data->LossynessOffset = window->DC.CursorStartPosLossyness.y; - TempData = data; -} - -void ImGuiListClipper::End() -{ - ImGuiContext& g = *GImGui; - if (ImGuiListClipperData* data = (ImGuiListClipperData*)TempData) - { - // In theory here we should assert that we are already at the right position, but it seems saner to just seek at the end and not assert/crash the user. - if (ItemsCount >= 0 && ItemsCount < INT_MAX && DisplayStart >= 0) - ImGuiListClipper_SeekCursorForItem(this, ItemsCount); - - // Restore temporary buffer and fix back pointers which may be invalidated when nesting - IM_ASSERT(data->ListClipper == this); - data->StepNo = data->Ranges.Size; - if (--g.ClipperTempDataStacked > 0) - { - data = &g.ClipperTempData[g.ClipperTempDataStacked - 1]; - data->ListClipper->TempData = data; - } - TempData = NULL; - } - ItemsCount = -1; -} - -void ImGuiListClipper::ForceDisplayRangeByIndices(int item_min, int item_max) -{ - ImGuiListClipperData* data = (ImGuiListClipperData*)TempData; - IM_ASSERT(DisplayStart < 0); // Only allowed after Begin() and if there has not been a specified range yet. - IM_ASSERT(item_min <= item_max); - if (item_min < item_max) - data->Ranges.push_back(ImGuiListClipperRange::FromIndices(item_min, item_max)); -} - -bool ImGuiListClipper::Step() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiListClipperData* data = (ImGuiListClipperData*)TempData; - IM_ASSERT(data != NULL && "Called ImGuiListClipper::Step() too many times, or before ImGuiListClipper::Begin() ?"); - - ImGuiTable* table = g.CurrentTable; - if (table && table->IsInsideRow) - ImGui::TableEndRow(table); - - // No items - if (ItemsCount == 0 || GetSkipItemForListClipping()) - return (void)End(), false; - - // While we are in frozen row state, keep displaying items one by one, unclipped - // FIXME: Could be stored as a table-agnostic state. - if (data->StepNo == 0 && table != NULL && !table->IsUnfrozenRows) - { - DisplayStart = data->ItemsFrozen; - DisplayEnd = data->ItemsFrozen + 1; - if (DisplayStart >= ItemsCount) - return (void)End(), false; - data->ItemsFrozen++; - return true; - } - - // Step 0: Let you process the first element (regardless of it being visible or not, so we can measure the element height) - bool calc_clipping = false; - if (data->StepNo == 0) - { - StartPosY = window->DC.CursorPos.y; - if (ItemsHeight <= 0.0f) - { - // Submit the first item (or range) so we can measure its height (generally the first range is 0..1) - data->Ranges.push_front(ImGuiListClipperRange::FromIndices(data->ItemsFrozen, data->ItemsFrozen + 1)); - DisplayStart = ImMax(data->Ranges[0].Min, data->ItemsFrozen); - DisplayEnd = ImMin(data->Ranges[0].Max, ItemsCount); - if (DisplayStart == DisplayEnd) - return (void)End(), false; - data->StepNo = 1; - return true; - } - calc_clipping = true; // If on the first step with known item height, calculate clipping. - } - - // Step 1: Let the clipper infer height from first range - if (ItemsHeight <= 0.0f) - { - IM_ASSERT(data->StepNo == 1); - if (table) - IM_ASSERT(table->RowPosY1 == StartPosY && table->RowPosY2 == window->DC.CursorPos.y); - - ItemsHeight = (window->DC.CursorPos.y - StartPosY) / (float)(DisplayEnd - DisplayStart); - bool affected_by_floating_point_precision = ImIsFloatAboveGuaranteedIntegerPrecision(StartPosY) || ImIsFloatAboveGuaranteedIntegerPrecision(window->DC.CursorPos.y); - if (affected_by_floating_point_precision) - ItemsHeight = window->DC.PrevLineSize.y + g.Style.ItemSpacing.y; // FIXME: Technically wouldn't allow multi-line entries. - - IM_ASSERT(ItemsHeight > 0.0f && "Unable to calculate item height! First item hasn't moved the cursor vertically!"); - calc_clipping = true; // If item height had to be calculated, calculate clipping afterwards. - } - - // Step 0 or 1: Calculate the actual ranges of visible elements. - const int already_submitted = DisplayEnd; - if (calc_clipping) - { - if (g.LogEnabled) - { - // If logging is active, do not perform any clipping - data->Ranges.push_back(ImGuiListClipperRange::FromIndices(0, ItemsCount)); - } - else - { - // Add range selected to be included for navigation - const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); - if (is_nav_request) - data->Ranges.push_back(ImGuiListClipperRange::FromPositions(g.NavScoringNoClipRect.Min.y, g.NavScoringNoClipRect.Max.y, 0, 0)); - if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && g.NavTabbingDir == -1) - data->Ranges.push_back(ImGuiListClipperRange::FromIndices(ItemsCount - 1, ItemsCount)); - - // Add focused/active item - ImRect nav_rect_abs = ImGui::WindowRectRelToAbs(window, window->NavRectRel[0]); - if (g.NavId != 0 && window->NavLastIds[0] == g.NavId) - data->Ranges.push_back(ImGuiListClipperRange::FromPositions(nav_rect_abs.Min.y, nav_rect_abs.Max.y, 0, 0)); - - // Add visible range - const int off_min = (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) ? -1 : 0; - const int off_max = (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) ? 1 : 0; - data->Ranges.push_back(ImGuiListClipperRange::FromPositions(window->ClipRect.Min.y, window->ClipRect.Max.y, off_min, off_max)); - } - - // Convert position ranges to item index ranges - // - Very important: when a starting position is after our maximum item, we set Min to (ItemsCount - 1). This allows us to handle most forms of wrapping. - // - Due to how Selectable extra padding they tend to be "unaligned" with exact unit in the item list, - // which with the flooring/ceiling tend to lead to 2 items instead of one being submitted. - for (int i = 0; i < data->Ranges.Size; i++) - if (data->Ranges[i].PosToIndexConvert) - { - int m1 = (int)(((double)data->Ranges[i].Min - window->DC.CursorPos.y - data->LossynessOffset) / ItemsHeight); - int m2 = (int)((((double)data->Ranges[i].Max - window->DC.CursorPos.y - data->LossynessOffset) / ItemsHeight) + 0.999999f); - data->Ranges[i].Min = ImClamp(already_submitted + m1 + data->Ranges[i].PosToIndexOffsetMin, already_submitted, ItemsCount - 1); - data->Ranges[i].Max = ImClamp(already_submitted + m2 + data->Ranges[i].PosToIndexOffsetMax, data->Ranges[i].Min + 1, ItemsCount); - data->Ranges[i].PosToIndexConvert = false; - } - ImGuiListClipper_SortAndFuseRanges(data->Ranges, data->StepNo); - } - - // Step 0+ (if item height is given in advance) or 1+: Display the next range in line. - if (data->StepNo < data->Ranges.Size) - { - DisplayStart = ImMax(data->Ranges[data->StepNo].Min, already_submitted); - DisplayEnd = ImMin(data->Ranges[data->StepNo].Max, ItemsCount); - if (DisplayStart > already_submitted) //-V1051 - ImGuiListClipper_SeekCursorForItem(this, DisplayStart); - data->StepNo++; - return true; - } - - // After the last step: Let the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), - // Advance the cursor to the end of the list and then returns 'false' to end the loop. - if (ItemsCount < INT_MAX) - ImGuiListClipper_SeekCursorForItem(this, ItemsCount); - - End(); - return false; -} - -//----------------------------------------------------------------------------- -// [SECTION] STYLING -//----------------------------------------------------------------------------- - -ImGuiStyle& ImGui::GetStyle() -{ - IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); - return GImGui->Style; -} - -ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul) -{ - ImGuiStyle& style = GImGui->Style; - ImVec4 c = style.Colors[idx]; - c.w *= style.Alpha * alpha_mul; - return ColorConvertFloat4ToU32(c); -} - -ImU32 ImGui::GetColorU32(const ImVec4& col) -{ - ImGuiStyle& style = GImGui->Style; - ImVec4 c = col; - c.w *= style.Alpha; - return ColorConvertFloat4ToU32(c); -} - -const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx) -{ - ImGuiStyle& style = GImGui->Style; - return style.Colors[idx]; -} - -ImU32 ImGui::GetColorU32(ImU32 col) -{ - ImGuiStyle& style = GImGui->Style; - if (style.Alpha >= 1.0f) - return col; - ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT; - a = (ImU32)(a * style.Alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range. - return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); -} - -// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32 -void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col) -{ - ImGuiContext& g = *GImGui; - ImGuiColorMod backup; - backup.Col = idx; - backup.BackupValue = g.Style.Colors[idx]; - g.ColorStack.push_back(backup); - g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); -} - -void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) -{ - ImGuiContext& g = *GImGui; - ImGuiColorMod backup; - backup.Col = idx; - backup.BackupValue = g.Style.Colors[idx]; - g.ColorStack.push_back(backup); - g.Style.Colors[idx] = col; -} - -void ImGui::PopStyleColor(int count) -{ - ImGuiContext& g = *GImGui; - while (count > 0) - { - ImGuiColorMod& backup = g.ColorStack.back(); - g.Style.Colors[backup.Col] = backup.BackupValue; - g.ColorStack.pop_back(); - count--; - } -} - -struct ImGuiStyleVarInfo -{ - ImGuiDataType Type; - ImU32 Count; - ImU32 Offset; - void* GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); } -}; - -static const ImGuiStyleVarInfo GStyleVarInfo[] = -{ - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign -}; - -static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx) -{ - IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_COUNT); - IM_ASSERT(IM_ARRAYSIZE(GStyleVarInfo) == ImGuiStyleVar_COUNT); - return &GStyleVarInfo[idx]; -} - -void ImGui::PushStyleVar(ImGuiStyleVar idx, float val) -{ - const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); - if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1) - { - ImGuiContext& g = *GImGui; - float* pvar = (float*)var_info->GetVarPtr(&g.Style); - g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar)); - *pvar = val; - return; - } - IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!"); -} - -void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) -{ - const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); - if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2) - { - ImGuiContext& g = *GImGui; - ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style); - g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar)); - *pvar = val; - return; - } - IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!"); -} - -void ImGui::PopStyleVar(int count) -{ - ImGuiContext& g = *GImGui; - while (count > 0) - { - // We avoid a generic memcpy(data, &backup.Backup.., GDataTypeSize[info->Type] * info->Count), the overhead in Debug is not worth it. - ImGuiStyleMod& backup = g.StyleVarStack.back(); - const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx); - void* data = info->GetVarPtr(&g.Style); - if (info->Type == ImGuiDataType_Float && info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; } - else if (info->Type == ImGuiDataType_Float && info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; } - g.StyleVarStack.pop_back(); - count--; - } -} - -const char* ImGui::GetStyleColorName(ImGuiCol idx) -{ - // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\1: return "\1"; - switch (idx) - { - case ImGuiCol_Text: return "Text"; - case ImGuiCol_TextDisabled: return "TextDisabled"; - case ImGuiCol_WindowBg: return "WindowBg"; - case ImGuiCol_ChildBg: return "ChildBg"; - case ImGuiCol_PopupBg: return "PopupBg"; - case ImGuiCol_Border: return "Border"; - case ImGuiCol_BorderShadow: return "BorderShadow"; - case ImGuiCol_FrameBg: return "FrameBg"; - case ImGuiCol_FrameBgHovered: return "FrameBgHovered"; - case ImGuiCol_FrameBgActive: return "FrameBgActive"; - case ImGuiCol_TitleBg: return "TitleBg"; - case ImGuiCol_TitleBgActive: return "TitleBgActive"; - case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed"; - case ImGuiCol_MenuBarBg: return "MenuBarBg"; - case ImGuiCol_ScrollbarBg: return "ScrollbarBg"; - case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab"; - case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered"; - case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive"; - case ImGuiCol_CheckMark: return "CheckMark"; - case ImGuiCol_SliderGrab: return "SliderGrab"; - case ImGuiCol_SliderGrabActive: return "SliderGrabActive"; - case ImGuiCol_Button: return "Button"; - case ImGuiCol_ButtonHovered: return "ButtonHovered"; - case ImGuiCol_ButtonActive: return "ButtonActive"; - case ImGuiCol_Header: return "Header"; - case ImGuiCol_HeaderHovered: return "HeaderHovered"; - case ImGuiCol_HeaderActive: return "HeaderActive"; - case ImGuiCol_Separator: return "Separator"; - case ImGuiCol_SeparatorHovered: return "SeparatorHovered"; - case ImGuiCol_SeparatorActive: return "SeparatorActive"; - case ImGuiCol_ResizeGrip: return "ResizeGrip"; - case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered"; - case ImGuiCol_ResizeGripActive: return "ResizeGripActive"; - case ImGuiCol_Tab: return "Tab"; - case ImGuiCol_TabHovered: return "TabHovered"; - case ImGuiCol_TabActive: return "TabActive"; - case ImGuiCol_TabUnfocused: return "TabUnfocused"; - case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive"; - case ImGuiCol_PlotLines: return "PlotLines"; - case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered"; - case ImGuiCol_PlotHistogram: return "PlotHistogram"; - case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered"; - case ImGuiCol_TableHeaderBg: return "TableHeaderBg"; - case ImGuiCol_TableBorderStrong: return "TableBorderStrong"; - case ImGuiCol_TableBorderLight: return "TableBorderLight"; - case ImGuiCol_TableRowBg: return "TableRowBg"; - case ImGuiCol_TableRowBgAlt: return "TableRowBgAlt"; - case ImGuiCol_TextSelectedBg: return "TextSelectedBg"; - case ImGuiCol_DragDropTarget: return "DragDropTarget"; - case ImGuiCol_NavHighlight: return "NavHighlight"; - case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight"; - case ImGuiCol_NavWindowingDimBg: return "NavWindowingDimBg"; - case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg"; - } - IM_ASSERT(0); - return "Unknown"; -} - - -//----------------------------------------------------------------------------- -// [SECTION] RENDER HELPERS -// Some of those (internal) functions are currently quite a legacy mess - their signature and behavior will change, -// we need a nicer separation between low-level functions and high-level functions relying on the ImGui context. -// Also see imgui_draw.cpp for some more which have been reworked to not rely on ImGui:: context. -//----------------------------------------------------------------------------- - -const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end) -{ - const char* text_display_end = text; - if (!text_end) - text_end = (const char*)-1; - - while (text_display_end < text_end && *text_display_end != '\0' && (text_display_end[0] != '#' || text_display_end[1] != '#')) - text_display_end++; - return text_display_end; -} - -// Internal ImGui functions to render text -// RenderText***() functions calls ImDrawList::AddText() calls ImBitmapFont::RenderText() -void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Hide anything after a '##' string - const char* text_display_end; - if (hide_text_after_hash) - { - text_display_end = FindRenderedTextEnd(text, text_end); - } - else - { - if (!text_end) - text_end = text + strlen(text); // FIXME-OPT - text_display_end = text_end; - } - - if (text != text_display_end) - { - window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end); - if (g.LogEnabled) - LogRenderedText(&pos, text, text_display_end); - } -} - -void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - if (!text_end) - text_end = text + strlen(text); // FIXME-OPT - - if (text != text_end) - { - window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_end, wrap_width); - if (g.LogEnabled) - LogRenderedText(&pos, text, text_end); - } -} - -// Default clip_rect uses (pos_min,pos_max) -// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges) -void ImGui::RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_display_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect) -{ - // Perform CPU side clipping for single clipped element to avoid using scissor state - ImVec2 pos = pos_min; - const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_display_end, false, 0.0f); - - const ImVec2* clip_min = clip_rect ? &clip_rect->Min : &pos_min; - const ImVec2* clip_max = clip_rect ? &clip_rect->Max : &pos_max; - bool need_clipping = (pos.x + text_size.x >= clip_max->x) || (pos.y + text_size.y >= clip_max->y); - if (clip_rect) // If we had no explicit clipping rectangle then pos==clip_min - need_clipping |= (pos.x < clip_min->x) || (pos.y < clip_min->y); - - // Align whole block. We should defer that to the better rendering function when we'll have support for individual line alignment. - if (align.x > 0.0f) pos.x = ImMax(pos.x, pos.x + (pos_max.x - pos.x - text_size.x) * align.x); - if (align.y > 0.0f) pos.y = ImMax(pos.y, pos.y + (pos_max.y - pos.y - text_size.y) * align.y); - - // Render - if (need_clipping) - { - ImVec4 fine_clip_rect(clip_min->x, clip_min->y, clip_max->x, clip_max->y); - draw_list->AddText(NULL, 0.0f, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect); - } - else - { - draw_list->AddText(NULL, 0.0f, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL); - } -} - -void ImGui::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, const ImRect* clip_rect) -{ - // Hide anything after a '##' string - const char* text_display_end = FindRenderedTextEnd(text, text_end); - const int text_len = (int)(text_display_end - text); - if (text_len == 0) - return; - - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - RenderTextClippedEx(window->DrawList, pos_min, pos_max, text, text_display_end, text_size_if_known, align, clip_rect); - if (g.LogEnabled) - LogRenderedText(&pos_min, text, text_display_end); -} - - -// Another overly complex function until we reorganize everything into a nice all-in-one helper. -// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display. -// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move. -void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end_full, const ImVec2* text_size_if_known) -{ - ImGuiContext& g = *GImGui; - if (text_end_full == NULL) - text_end_full = FindRenderedTextEnd(text); - const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_end_full, false, 0.0f); - - //draw_list->AddLine(ImVec2(pos_max.x, pos_min.y - 4), ImVec2(pos_max.x, pos_max.y + 4), IM_COL32(0, 0, 255, 255)); - //draw_list->AddLine(ImVec2(ellipsis_max_x, pos_min.y-2), ImVec2(ellipsis_max_x, pos_max.y+2), IM_COL32(0, 255, 0, 255)); - //draw_list->AddLine(ImVec2(clip_max_x, pos_min.y), ImVec2(clip_max_x, pos_max.y), IM_COL32(255, 0, 0, 255)); - // FIXME: We could technically remove (last_glyph->AdvanceX - last_glyph->X1) from text_size.x here and save a few pixels. - if (text_size.x > pos_max.x - pos_min.x) - { - // Hello wo... - // | | | - // min max ellipsis_max - // <-> this is generally some padding value - - const ImFont* font = draw_list->_Data->Font; - const float font_size = draw_list->_Data->FontSize; - const char* text_end_ellipsis = NULL; - - ImWchar ellipsis_char = font->EllipsisChar; - int ellipsis_char_count = 1; - if (ellipsis_char == (ImWchar)-1) - { - ellipsis_char = font->DotChar; - ellipsis_char_count = 3; - } - const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char); - - float ellipsis_glyph_width = glyph->X1; // Width of the glyph with no padding on either side - float ellipsis_total_width = ellipsis_glyph_width; // Full width of entire ellipsis - - if (ellipsis_char_count > 1) - { - // Full ellipsis size without free spacing after it. - const float spacing_between_dots = 1.0f * (draw_list->_Data->FontSize / font->FontSize); - ellipsis_glyph_width = glyph->X1 - glyph->X0 + spacing_between_dots; - ellipsis_total_width = ellipsis_glyph_width * (float)ellipsis_char_count - spacing_between_dots; - } - - // We can now claim the space between pos_max.x and ellipsis_max.x - const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_total_width) - pos_min.x, 1.0f); - float text_size_clipped_x = font->CalcTextSizeA(font_size, text_avail_width, 0.0f, text, text_end_full, &text_end_ellipsis).x; - if (text == text_end_ellipsis && text_end_ellipsis < text_end_full) - { - // Always display at least 1 character if there's no room for character + ellipsis - text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full); - text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x; - } - while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1])) - { - // Trim trailing space before ellipsis (FIXME: Supporting non-ascii blanks would be nice, for this we need a function to backtrack in UTF-8 text) - text_end_ellipsis--; - text_size_clipped_x -= font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text_end_ellipsis, text_end_ellipsis + 1).x; // Ascii blanks are always 1 byte - } - - // Render text, render ellipsis - RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f)); - float ellipsis_x = pos_min.x + text_size_clipped_x; - if (ellipsis_x + ellipsis_total_width <= ellipsis_max_x) - for (int i = 0; i < ellipsis_char_count; i++) - { - font->RenderChar(draw_list, font_size, ImVec2(ellipsis_x, pos_min.y), GetColorU32(ImGuiCol_Text), ellipsis_char); - ellipsis_x += ellipsis_glyph_width; - } - } - else - { - RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_full, &text_size, ImVec2(0.0f, 0.0f)); - } - - if (g.LogEnabled) - LogRenderedText(&pos_min, text, text_end_full); -} - -// Render a rectangle shaped with optional rounding and borders -void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, float rounding) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - window->DrawList->AddRectFilled(p_min, p_max, fill_col, rounding); - const float border_size = g.Style.FrameBorderSize; - if (border && border_size > 0.0f) - { - window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size); - window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); - } -} - -void ImGui::RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const float border_size = g.Style.FrameBorderSize; - if (border_size > 0.0f) - { - window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size); - window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); - } -} - -void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags) -{ - ImGuiContext& g = *GImGui; - if (id != g.NavId) - return; - if (g.NavDisableHighlight && !(flags & ImGuiNavHighlightFlags_AlwaysDraw)) - return; - ImGuiWindow* window = g.CurrentWindow; - if (window->DC.NavHideHighlightOneFrame) - return; - - float rounding = (flags & ImGuiNavHighlightFlags_NoRounding) ? 0.0f : g.Style.FrameRounding; - ImRect display_rect = bb; - display_rect.ClipWith(window->ClipRect); - if (flags & ImGuiNavHighlightFlags_TypeDefault) - { - const float THICKNESS = 2.0f; - const float DISTANCE = 3.0f + THICKNESS * 0.5f; - display_rect.Expand(ImVec2(DISTANCE, DISTANCE)); - bool fully_visible = window->ClipRect.Contains(display_rect); - if (!fully_visible) - window->DrawList->PushClipRect(display_rect.Min, display_rect.Max); - window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), display_rect.Max - ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, 0, THICKNESS); - if (!fully_visible) - window->DrawList->PopClipRect(); - } - if (flags & ImGuiNavHighlightFlags_TypeThin) - { - window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, 1.0f); - } -} - -void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT); - for (int n = 0; n < g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - ImDrawList* draw_list = GetForegroundDrawList(viewport); - ImFontAtlas* font_atlas = draw_list->_Data->Font->ContainerAtlas; - ImVec2 offset, size, uv[4]; - if (font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2])) - { - const ImVec2 pos = base_pos - offset; - const float scale = base_scale; - ImTextureID tex_id = font_atlas->TexID; - draw_list->PushTextureID(tex_id); - draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow); - draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow); - draw_list->AddImage(tex_id, pos, pos + size * scale, uv[2], uv[3], col_border); - draw_list->AddImage(tex_id, pos, pos + size * scale, uv[0], uv[1], col_fill); - draw_list->PopTextureID(); - } - } -} - - -//----------------------------------------------------------------------------- -// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) -//----------------------------------------------------------------------------- - -// ImGuiWindow is mostly a dumb struct. It merely has a constructor and a few helper methods -ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) : DrawListInst(NULL) -{ - memset(this, 0, sizeof(*this)); - Name = ImStrdup(name); - NameBufLen = (int)strlen(name) + 1; - ID = ImHashStr(name); - IDStack.push_back(ID); - MoveId = GetID("#MOVE"); - ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); - ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f); - AutoFitFramesX = AutoFitFramesY = -1; - AutoPosLastDirection = ImGuiDir_None; - SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing; - SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX); - LastFrameActive = -1; - LastTimeActive = -1.0f; - FontWindowScale = 1.0f; - SettingsOffset = -1; - DrawList = &DrawListInst; - DrawList->_Data = &context->DrawListSharedData; - DrawList->_OwnerName = Name; -} - -ImGuiWindow::~ImGuiWindow() -{ - IM_ASSERT(DrawList == &DrawListInst); - IM_DELETE(Name); - ColumnsStorage.clear_destruct(); -} - -ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); - ImGuiContext& g = *GImGui; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); - return id; -} - -ImGuiID ImGuiWindow::GetID(const void* ptr) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); - ImGuiContext& g = *GImGui; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL); - return id; -} - -ImGuiID ImGuiWindow::GetID(int n) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashData(&n, sizeof(n), seed); - ImGuiContext& g = *GImGui; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); - return id; -} - -// This is only used in rare/specific situations to manufacture an ID out of nowhere. -ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) -{ - ImGuiID seed = IDStack.back(); - ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs); - ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed); - return id; -} - -static void SetCurrentWindow(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - g.CurrentWindow = window; - g.CurrentTable = window && window->DC.CurrentTableIdx != -1 ? g.Tables.GetByIndex(window->DC.CurrentTableIdx) : NULL; - if (window) - g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); -} - -void ImGui::GcCompactTransientMiscBuffers() -{ - ImGuiContext& g = *GImGui; - g.ItemFlagsStack.clear(); - g.GroupStack.clear(); - TableGcCompactSettings(); -} - -// Free up/compact internal window buffers, we can use this when a window becomes unused. -// Not freed: -// - ImGuiWindow, ImGuiWindowSettings, Name, StateStorage, ColumnsStorage (may hold useful data) -// This should have no noticeable visual effect. When the window reappear however, expect new allocation/buffer growth/copy cost. -void ImGui::GcCompactTransientWindowBuffers(ImGuiWindow* window) -{ - window->MemoryCompacted = true; - window->MemoryDrawListIdxCapacity = window->DrawList->IdxBuffer.Capacity; - window->MemoryDrawListVtxCapacity = window->DrawList->VtxBuffer.Capacity; - window->IDStack.clear(); - window->DrawList->_ClearFreeMemory(); - window->DC.ChildWindows.clear(); - window->DC.ItemWidthStack.clear(); - window->DC.TextWrapPosStack.clear(); -} - -void ImGui::GcAwakeTransientWindowBuffers(ImGuiWindow* window) -{ - // We stored capacity of the ImDrawList buffer to reduce growth-caused allocation/copy when awakening. - // The other buffers tends to amortize much faster. - window->MemoryCompacted = false; - window->DrawList->IdxBuffer.reserve(window->MemoryDrawListIdxCapacity); - window->DrawList->VtxBuffer.reserve(window->MemoryDrawListVtxCapacity); - window->MemoryDrawListIdxCapacity = window->MemoryDrawListVtxCapacity = 0; -} - -void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - - // While most behaved code would make an effort to not steal active id during window move/drag operations, - // we at least need to be resilient to it. Cancelling the move is rather aggressive and users of 'master' branch - // may prefer the weird ill-defined half working situation ('docking' did assert), so may need to rework that. - if (g.MovingWindow != NULL && g.ActiveId == g.MovingWindow->MoveId) - { - IMGUI_DEBUG_LOG_ACTIVEID("SetActiveID() cancel MovingWindow\n"); - g.MovingWindow = NULL; - } - - // Set active id - g.ActiveIdIsJustActivated = (g.ActiveId != id); - if (g.ActiveIdIsJustActivated) - { - IMGUI_DEBUG_LOG_ACTIVEID("SetActiveID() old:0x%08X (window \"%s\") -> new:0x%08X (window \"%s\")\n", g.ActiveId, g.ActiveIdWindow ? g.ActiveIdWindow->Name : "", id, window ? window->Name : ""); - g.ActiveIdTimer = 0.0f; - g.ActiveIdHasBeenPressedBefore = false; - g.ActiveIdHasBeenEditedBefore = false; - g.ActiveIdMouseButton = -1; - if (id != 0) - { - g.LastActiveId = id; - g.LastActiveIdTimer = 0.0f; - } - } - g.ActiveId = id; - g.ActiveIdAllowOverlap = false; - g.ActiveIdNoClearOnFocusLoss = false; - g.ActiveIdWindow = window; - g.ActiveIdHasBeenEditedThisFrame = false; - if (id) - { - g.ActiveIdIsAlive = id; - g.ActiveIdSource = (g.NavActivateId == id || g.NavActivateInputId == id || g.NavJustMovedToId == id) ? (ImGuiInputSource)ImGuiInputSource_Nav : ImGuiInputSource_Mouse; - } - - // Clear declaration of inputs claimed by the widget - // (Please note that this is WIP and not all keys/inputs are thoroughly declared by all widgets yet) - g.ActiveIdUsingNavDirMask = 0x00; - g.ActiveIdUsingKeyInputMask.ClearAllBits(); -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - g.ActiveIdUsingNavInputMask = 0x00; -#endif -} - -void ImGui::ClearActiveID() -{ - SetActiveID(0, NULL); // g.ActiveId = 0; -} - -void ImGui::SetHoveredID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - g.HoveredId = id; - g.HoveredIdAllowOverlap = false; - g.HoveredIdUsingMouseWheel = false; - if (id != 0 && g.HoveredIdPreviousFrame != id) - g.HoveredIdTimer = g.HoveredIdNotActiveTimer = 0.0f; -} - -ImGuiID ImGui::GetHoveredID() -{ - ImGuiContext& g = *GImGui; - return g.HoveredId ? g.HoveredId : g.HoveredIdPreviousFrame; -} - -// This is called by ItemAdd(). -// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID(). -void ImGui::KeepAliveID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - if (g.ActiveId == id) - g.ActiveIdIsAlive = id; - if (g.ActiveIdPreviousFrame == id) - g.ActiveIdPreviousFrameIsAlive = true; -} - -void ImGui::MarkItemEdited(ImGuiID id) -{ - // This marking is solely to be able to provide info for IsItemDeactivatedAfterEdit(). - // ActiveId might have been released by the time we call this (as in the typical press/release button behavior) but still need need to fill the data. - ImGuiContext& g = *GImGui; - IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive); - IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out. - //IM_ASSERT(g.CurrentWindow->DC.LastItemId == id); - g.ActiveIdHasBeenEditedThisFrame = true; - g.ActiveIdHasBeenEditedBefore = true; - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Edited; -} - -static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags) -{ - // An active popup disable hovering on other windows (apart from its own children) - // FIXME-OPT: This could be cached/stored within the window. - ImGuiContext& g = *GImGui; - if (g.NavWindow) - if (ImGuiWindow* focused_root_window = g.NavWindow->RootWindow) - if (focused_root_window->WasActive && focused_root_window != window->RootWindow) - { - // For the purpose of those flags we differentiate "standard popup" from "modal popup" - // NB: The order of those two tests is important because Modal windows are also Popups. - if (focused_root_window->Flags & ImGuiWindowFlags_Modal) - return false; - if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - return false; - } - return true; -} - -// This is roughly matching the behavior of internal-facing ItemHoverable() -// - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered() -// - this should work even for non-interactive items that have no ID, so we cannot use LastItemId -bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.NavDisableMouseHover && !g.NavDisableHighlight && !(flags & ImGuiHoveredFlags_NoNavOverride)) - { - if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) - return false; - if (!IsItemFocused()) - return false; - } - else - { - // Test for bounding box overlap, as updated as ItemAdd() - ImGuiItemStatusFlags status_flags = g.LastItemData.StatusFlags; - if (!(status_flags & ImGuiItemStatusFlags_HoveredRect)) - return false; - IM_ASSERT((flags & (ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy)) == 0); // Flags not supported by this function - - // Test if we are hovering the right window (our window could be behind another window) - // [2021/03/02] Reworked / reverted the revert, finally. Note we want e.g. BeginGroup/ItemAdd/EndGroup to work as well. (#3851) - // [2017/10/16] Reverted commit 344d48be3 and testing RootWindow instead. I believe it is correct to NOT test for RootWindow but this leaves us unable - // to use IsItemHovered() after EndChild() itself. Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was - // the test that has been running for a long while. - if (g.HoveredWindow != window && (status_flags & ImGuiItemStatusFlags_HoveredWindow) == 0) - if ((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0) - return false; - - // Test if another item is active (e.g. being dragged) - if ((flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) == 0) - if (g.ActiveId != 0 && g.ActiveId != g.LastItemData.ID && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) - return false; - - // Test if interactions on this window are blocked by an active popup or modal. - // The ImGuiHoveredFlags_AllowWhenBlockedByPopup flag will be tested here. - if (!IsWindowContentHoverable(window, flags)) - return false; - - // Test if the item is disabled - if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) - return false; - - // Special handling for calling after Begin() which represent the title bar or tab. - // When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case. - if (g.LastItemData.ID == window->MoveId && window->WriteAccessed) - return false; - } - - return true; -} - -// Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered(). -bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) -{ - ImGuiContext& g = *GImGui; - if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap) - return false; - - ImGuiWindow* window = g.CurrentWindow; - if (g.HoveredWindow != window) - return false; - if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap) - return false; - if (!IsMouseHoveringRect(bb.Min, bb.Max)) - return false; - if (!IsWindowContentHoverable(window, ImGuiHoveredFlags_None)) - { - g.HoveredIdDisabled = true; - return false; - } - - // We exceptionally allow this function to be called with id==0 to allow using it for easy high-level - // hover test in widgets code. We could also decide to split this function is two. - if (id != 0) - SetHoveredID(id); - - // When disabled we'll return false but still set HoveredId - ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.InFlags : g.CurrentItemFlags); - if (item_flags & ImGuiItemFlags_Disabled) - { - // Release active id if turning disabled - if (g.ActiveId == id) - ClearActiveID(); - g.HoveredIdDisabled = true; - return false; - } - - if (id != 0) - { - // [DEBUG] Item Picker tool! - // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making - // the cost of this tool near-zero. We can get slightly better call-stack and support picking non-hovered - // items if we perform the test in ItemAdd(), but that would incur a small runtime cost. - // #define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX in imconfig.h if you want this check to also be performed in ItemAdd(). - if (g.DebugItemPickerActive && g.HoveredIdPreviousFrame == id) - GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255)); - if (g.DebugItemPickerBreakId == id) - IM_DEBUG_BREAK(); - } - - if (g.NavDisableMouseHover) - return false; - - return true; -} - -bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (!bb.Overlaps(window->ClipRect)) - if (id == 0 || (id != g.ActiveId && id != g.NavId)) - if (!g.LogEnabled) - return true; - return false; -} - -// This is also inlined in ItemAdd() -// Note: if ImGuiItemStatusFlags_HasDisplayRect is set, user needs to set window->DC.LastItemDisplayRect! -void ImGui::SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags item_flags, const ImRect& item_rect) -{ - ImGuiContext& g = *GImGui; - g.LastItemData.ID = item_id; - g.LastItemData.InFlags = in_flags; - g.LastItemData.StatusFlags = item_flags; - g.LastItemData.Rect = item_rect; -} - -float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x) -{ - if (wrap_pos_x < 0.0f) - return 0.0f; - - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (wrap_pos_x == 0.0f) - { - // We could decide to setup a default wrapping max point for auto-resizing windows, - // or have auto-wrap (with unspecified wrapping pos) behave as a ContentSize extending function? - //if (window->Hidden && (window->Flags & ImGuiWindowFlags_AlwaysAutoResize)) - // wrap_pos_x = ImMax(window->WorkRect.Min.x + g.FontSize * 10.0f, window->WorkRect.Max.x); - //else - wrap_pos_x = window->WorkRect.Max.x; - } - else if (wrap_pos_x > 0.0f) - { - wrap_pos_x += window->Pos.x - window->Scroll.x; // wrap_pos_x is provided is window local space - } - - return ImMax(wrap_pos_x - pos.x, 1.0f); -} - -// IM_ALLOC() == ImGui::MemAlloc() -void* ImGui::MemAlloc(size_t size) -{ - if (ImGuiContext* ctx = GImGui) - ctx->IO.MetricsActiveAllocations++; - return (*GImAllocatorAllocFunc)(size, GImAllocatorUserData); -} - -// IM_FREE() == ImGui::MemFree() -void ImGui::MemFree(void* ptr) -{ - if (ptr) - if (ImGuiContext* ctx = GImGui) - ctx->IO.MetricsActiveAllocations--; - return (*GImAllocatorFreeFunc)(ptr, GImAllocatorUserData); -} - -const char* ImGui::GetClipboardText() -{ - ImGuiContext& g = *GImGui; - return g.IO.GetClipboardTextFn ? g.IO.GetClipboardTextFn(g.IO.ClipboardUserData) : ""; -} - -void ImGui::SetClipboardText(const char* text) -{ - ImGuiContext& g = *GImGui; - if (g.IO.SetClipboardTextFn) - g.IO.SetClipboardTextFn(g.IO.ClipboardUserData, text); -} - -const char* ImGui::GetVersion() -{ - return IMGUI_VERSION; -} - -// Internal state access - if you want to share Dear ImGui state between modules (e.g. DLL) or allocate it yourself -// Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module -ImGuiContext* ImGui::GetCurrentContext() -{ - return GImGui; -} - -void ImGui::SetCurrentContext(ImGuiContext* ctx) -{ -#ifdef IMGUI_SET_CURRENT_CONTEXT_FUNC - IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx); // For custom thread-based hackery you may want to have control over this. -#else - GImGui = ctx; -#endif -} - -void ImGui::SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data) -{ - GImAllocatorAllocFunc = alloc_func; - GImAllocatorFreeFunc = free_func; - GImAllocatorUserData = user_data; -} - -// This is provided to facilitate copying allocators from one static/DLL boundary to another (e.g. retrieve default allocator of your executable address space) -void ImGui::GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data) -{ - *p_alloc_func = GImAllocatorAllocFunc; - *p_free_func = GImAllocatorFreeFunc; - *p_user_data = GImAllocatorUserData; -} - -ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas) -{ - ImGuiContext* prev_ctx = GetCurrentContext(); - ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas); - SetCurrentContext(ctx); - Initialize(); - if (prev_ctx != NULL) - SetCurrentContext(prev_ctx); // Restore previous context if any, else keep new one. - return ctx; -} - -void ImGui::DestroyContext(ImGuiContext* ctx) -{ - ImGuiContext* prev_ctx = GetCurrentContext(); - if (ctx == NULL) //-V1051 - ctx = prev_ctx; - SetCurrentContext(ctx); - Shutdown(); - SetCurrentContext((prev_ctx != ctx) ? prev_ctx : NULL); - IM_DELETE(ctx); -} - -// No specific ordering/dependency support, will see as needed -ImGuiID ImGui::AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook) -{ - ImGuiContext& g = *ctx; - IM_ASSERT(hook->Callback != NULL && hook->HookId == 0 && hook->Type != ImGuiContextHookType_PendingRemoval_); - g.Hooks.push_back(*hook); - g.Hooks.back().HookId = ++g.HookIdNext; - return g.HookIdNext; -} - -// Deferred removal, avoiding issue with changing vector while iterating it -void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id) -{ - ImGuiContext& g = *ctx; - IM_ASSERT(hook_id != 0); - for (int n = 0; n < g.Hooks.Size; n++) - if (g.Hooks[n].HookId == hook_id) - g.Hooks[n].Type = ImGuiContextHookType_PendingRemoval_; -} - -// Call context hooks (used by e.g. test engine) -// We assume a small number of hooks so all stored in same array -void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type) -{ - ImGuiContext& g = *ctx; - for (int n = 0; n < g.Hooks.Size; n++) - if (g.Hooks[n].Type == hook_type) - g.Hooks[n].Callback(&g, &g.Hooks[n]); -} - -ImGuiIO& ImGui::GetIO() -{ - IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); - return GImGui->IO; -} - -// Pass this to your backend rendering function! Valid after Render() and until the next call to NewFrame() -ImDrawData* ImGui::GetDrawData() -{ - ImGuiContext& g = *GImGui; - ImGuiViewportP* viewport = g.Viewports[0]; - return viewport->DrawDataP.Valid ? &viewport->DrawDataP : NULL; -} - -double ImGui::GetTime() -{ - return GImGui->Time; -} - -int ImGui::GetFrameCount() -{ - return GImGui->FrameCount; -} - -static ImDrawList* GetViewportDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name) -{ - // Create the draw list on demand, because they are not frequently used for all viewports - ImGuiContext& g = *GImGui; - IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->DrawLists)); - ImDrawList* draw_list = viewport->DrawLists[drawlist_no]; - if (draw_list == NULL) - { - draw_list = IM_NEW(ImDrawList)(&g.DrawListSharedData); - draw_list->_OwnerName = drawlist_name; - viewport->DrawLists[drawlist_no] = draw_list; - } - - // Our ImDrawList system requires that there is always a command - if (viewport->DrawListsLastFrame[drawlist_no] != g.FrameCount) - { - draw_list->_ResetForNewFrame(); - draw_list->PushTextureID(g.IO.Fonts->TexID); - draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false); - viewport->DrawListsLastFrame[drawlist_no] = g.FrameCount; - } - return draw_list; -} - -ImDrawList* ImGui::GetBackgroundDrawList(ImGuiViewport* viewport) -{ - return GetViewportDrawList((ImGuiViewportP*)viewport, 0, "##Background"); -} - -ImDrawList* ImGui::GetBackgroundDrawList() -{ - ImGuiContext& g = *GImGui; - return GetBackgroundDrawList(g.Viewports[0]); -} - -ImDrawList* ImGui::GetForegroundDrawList(ImGuiViewport* viewport) -{ - return GetViewportDrawList((ImGuiViewportP*)viewport, 1, "##Foreground"); -} - -ImDrawList* ImGui::GetForegroundDrawList() -{ - ImGuiContext& g = *GImGui; - return GetForegroundDrawList(g.Viewports[0]); -} - -ImDrawListSharedData* ImGui::GetDrawListSharedData() -{ - return &GImGui->DrawListSharedData; -} - -void ImGui::StartMouseMovingWindow(ImGuiWindow* window) -{ - // Set ActiveId even if the _NoMove flag is set. Without it, dragging away from a window with _NoMove would activate hover on other windows. - // We _also_ call this when clicking in a window empty space when io.ConfigWindowsMoveFromTitleBarOnly is set, but clear g.MovingWindow afterward. - // This is because we want ActiveId to be set even when the window is not permitted to move. - ImGuiContext& g = *GImGui; - FocusWindow(window); - SetActiveID(window->MoveId, window); - g.NavDisableHighlight = true; - g.ActiveIdClickOffset = g.IO.MouseClickedPos[0] - window->RootWindow->Pos; - g.ActiveIdNoClearOnFocusLoss = true; - SetActiveIdUsingNavAndKeys(); - - bool can_move_window = true; - if ((window->Flags & ImGuiWindowFlags_NoMove) || (window->RootWindow->Flags & ImGuiWindowFlags_NoMove)) - can_move_window = false; - if (can_move_window) - g.MovingWindow = window; -} - -// Handle mouse moving window -// Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing() -// FIXME: We don't have strong guarantee that g.MovingWindow stay synched with g.ActiveId == g.MovingWindow->MoveId. -// This is currently enforced by the fact that BeginDragDropSource() is setting all g.ActiveIdUsingXXXX flags to inhibit navigation inputs, -// but if we should more thoroughly test cases where g.ActiveId or g.MovingWindow gets changed and not the other. -void ImGui::UpdateMouseMovingWindowNewFrame() -{ - ImGuiContext& g = *GImGui; - if (g.MovingWindow != NULL) - { - // We actually want to move the root window. g.MovingWindow == window we clicked on (could be a child window). - // We track it to preserve Focus and so that generally ActiveIdWindow == MovingWindow and ActiveId == MovingWindow->MoveId for consistency. - KeepAliveID(g.ActiveId); - IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindow); - ImGuiWindow* moving_window = g.MovingWindow->RootWindow; - if (g.IO.MouseDown[0] && IsMousePosValid(&g.IO.MousePos)) - { - ImVec2 pos = g.IO.MousePos - g.ActiveIdClickOffset; - SetWindowPos(moving_window, pos, ImGuiCond_Always); - FocusWindow(g.MovingWindow); - } - else - { - g.MovingWindow = NULL; - ClearActiveID(); - } - } - else - { - // When clicking/dragging from a window that has the _NoMove flag, we still set the ActiveId in order to prevent hovering others. - if (g.ActiveIdWindow && g.ActiveIdWindow->MoveId == g.ActiveId) - { - KeepAliveID(g.ActiveId); - if (!g.IO.MouseDown[0]) - ClearActiveID(); - } - } -} - -// Initiate moving window when clicking on empty space or title bar. -// Handle left-click and right-click focus. -void ImGui::UpdateMouseMovingWindowEndFrame() -{ - ImGuiContext& g = *GImGui; - if (g.ActiveId != 0 || g.HoveredId != 0) - return; - - // Unless we just made a window/popup appear - if (g.NavWindow && g.NavWindow->Appearing) - return; - - // Click on empty space to focus window and start moving - // (after we're done with all our widgets) - if (g.IO.MouseClicked[0]) - { - // Handle the edge case of a popup being closed while clicking in its empty space. - // If we try to focus it, FocusWindow() > ClosePopupsOverWindow() will accidentally close any parent popups because they are not linked together any more. - ImGuiWindow* root_window = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL; - const bool is_closed_popup = root_window && (root_window->Flags & ImGuiWindowFlags_Popup) && !IsPopupOpen(root_window->PopupId, ImGuiPopupFlags_AnyPopupLevel); - - if (root_window != NULL && !is_closed_popup) - { - StartMouseMovingWindow(g.HoveredWindow); //-V595 - - // Cancel moving if clicked outside of title bar - if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(root_window->Flags & ImGuiWindowFlags_NoTitleBar)) - if (!root_window->TitleBarRect().Contains(g.IO.MouseClickedPos[0])) - g.MovingWindow = NULL; - - // Cancel moving if clicked over an item which was disabled or inhibited by popups (note that we know HoveredId == 0 already) - if (g.HoveredIdDisabled) - g.MovingWindow = NULL; - } - else if (root_window == NULL && g.NavWindow != NULL && GetTopMostPopupModal() == NULL) - { - // Clicking on void disable focus - FocusWindow(NULL); - } - } - - // With right mouse button we close popups without changing focus based on where the mouse is aimed - // Instead, focus will be restored to the window under the bottom-most closed popup. - // (The left mouse button path calls FocusWindow on the hovered window, which will lead NewFrame->ClosePopupsOverWindow to trigger) - if (g.IO.MouseClicked[1]) - { - // Find the top-most window between HoveredWindow and the top-most Modal Window. - // This is where we can trim the popup stack. - ImGuiWindow* modal = GetTopMostPopupModal(); - bool hovered_window_above_modal = g.HoveredWindow && (modal == NULL || IsWindowAbove(g.HoveredWindow, modal)); - ClosePopupsOverWindow(hovered_window_above_modal ? g.HoveredWindow : modal, true); - } -} - -static bool IsWindowActiveAndVisible(ImGuiWindow* window) -{ - return (window->Active) && (!window->Hidden); -} - -static void UpdateAliasKey(ImGuiKey key, bool v, float analog_value) -{ - IM_ASSERT(ImGui::IsAliasKey(key)); - ImGuiKeyData* key_data = ImGui::GetKeyData(key); - key_data->Down = v; - key_data->AnalogValue = analog_value; -} - -static void ImGui::UpdateKeyboardInputs() -{ - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - - // Import legacy keys or verify they are not used -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - if (io.BackendUsingLegacyKeyArrays == 0) - { - // Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written to externally. - for (int n = 0; n < ImGuiKey_LegacyNativeKey_END; n++) - IM_ASSERT((io.KeysDown[n] == false || IsKeyDown(n)) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); - } - else - { - if (g.FrameCount == 0) - for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++) - IM_ASSERT(g.IO.KeyMap[n] == -1 && "Backend is not allowed to write to io.KeyMap[0..511]!"); - - // Build reverse KeyMap (Named -> Legacy) - for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++) - if (io.KeyMap[n] != -1) - { - IM_ASSERT(IsLegacyKey((ImGuiKey)io.KeyMap[n])); - io.KeyMap[io.KeyMap[n]] = n; - } - - // Import legacy keys into new ones - for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++) - if (io.KeysDown[n] || io.BackendUsingLegacyKeyArrays == 1) - { - const ImGuiKey key = (ImGuiKey)(io.KeyMap[n] != -1 ? io.KeyMap[n] : n); - IM_ASSERT(io.KeyMap[n] == -1 || IsNamedKey(key)); - io.KeysData[key].Down = io.KeysDown[n]; - if (key != n) - io.KeysDown[key] = io.KeysDown[n]; // Allow legacy code using io.KeysDown[GetKeyIndex()] with old backends - io.BackendUsingLegacyKeyArrays = 1; - } - if (io.BackendUsingLegacyKeyArrays == 1) - { - io.KeysData[ImGuiKey_ModCtrl].Down = io.KeyCtrl; - io.KeysData[ImGuiKey_ModShift].Down = io.KeyShift; - io.KeysData[ImGuiKey_ModAlt].Down = io.KeyAlt; - io.KeysData[ImGuiKey_ModSuper].Down = io.KeySuper; - } - } - -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; - if (io.BackendUsingLegacyNavInputArray && nav_gamepad_active) - { - #define MAP_LEGACY_NAV_INPUT_TO_KEY1(_KEY, _NAV1) do { io.KeysData[_KEY].Down = (io.NavInputs[_NAV1] > 0.0f); io.KeysData[_KEY].AnalogValue = io.NavInputs[_NAV1]; } while (0) - #define MAP_LEGACY_NAV_INPUT_TO_KEY2(_KEY, _NAV1, _NAV2) do { io.KeysData[_KEY].Down = (io.NavInputs[_NAV1] > 0.0f) || (io.NavInputs[_NAV2] > 0.0f); io.KeysData[_KEY].AnalogValue = ImMax(io.NavInputs[_NAV1], io.NavInputs[_NAV2]); } while (0) - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceDown, ImGuiNavInput_Activate); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceRight, ImGuiNavInput_Cancel); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceLeft, ImGuiNavInput_Menu); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceUp, ImGuiNavInput_Input); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadLeft, ImGuiNavInput_DpadLeft); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadRight, ImGuiNavInput_DpadRight); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadUp, ImGuiNavInput_DpadUp); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadDown, ImGuiNavInput_DpadDown); - MAP_LEGACY_NAV_INPUT_TO_KEY2(ImGuiKey_GamepadL1, ImGuiNavInput_FocusPrev, ImGuiNavInput_TweakSlow); - MAP_LEGACY_NAV_INPUT_TO_KEY2(ImGuiKey_GamepadR1, ImGuiNavInput_FocusNext, ImGuiNavInput_TweakFast); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickLeft, ImGuiNavInput_LStickLeft); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickRight, ImGuiNavInput_LStickRight); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickUp, ImGuiNavInput_LStickUp); - MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickDown, ImGuiNavInput_LStickDown); - #undef NAV_MAP_KEY - } -#endif - -#endif - - // Synchronize io.KeyMods with individual modifiers io.KeyXXX bools, update aliases - io.KeyMods = GetMergedModFlags(); - for (int n = 0; n < ImGuiMouseButton_COUNT; n++) - UpdateAliasKey(MouseButtonToKey(n), io.MouseDown[n], io.MouseDown[n] ? 1.0f : 0.0f); - UpdateAliasKey(ImGuiKey_MouseWheelX, io.MouseWheelH != 0.0f, io.MouseWheelH); - UpdateAliasKey(ImGuiKey_MouseWheelY, io.MouseWheel != 0.0f, io.MouseWheel); - - // Clear gamepad data if disabled - if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0) - for (int i = ImGuiKey_Gamepad_BEGIN; i < ImGuiKey_Gamepad_END; i++) - { - io.KeysData[i - ImGuiKey_KeysData_OFFSET].Down = false; - io.KeysData[i - ImGuiKey_KeysData_OFFSET].AnalogValue = 0.0f; - } - - // Update keys - for (int i = 0; i < IM_ARRAYSIZE(io.KeysData); i++) - { - ImGuiKeyData* key_data = &io.KeysData[i]; - key_data->DownDurationPrev = key_data->DownDuration; - key_data->DownDuration = key_data->Down ? (key_data->DownDuration < 0.0f ? 0.0f : key_data->DownDuration + io.DeltaTime) : -1.0f; - } -} - -static void ImGui::UpdateMouseInputs() -{ - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - - // Round mouse position to avoid spreading non-rounded position (e.g. UpdateManualResize doesn't support them well) - if (IsMousePosValid(&io.MousePos)) - io.MousePos = g.MouseLastValidPos = ImFloorSigned(io.MousePos); - - // If mouse just appeared or disappeared (usually denoted by -FLT_MAX components) we cancel out movement in MouseDelta - if (IsMousePosValid(&io.MousePos) && IsMousePosValid(&io.MousePosPrev)) - io.MouseDelta = io.MousePos - io.MousePosPrev; - else - io.MouseDelta = ImVec2(0.0f, 0.0f); - - // If mouse moved we re-enable mouse hovering in case it was disabled by gamepad/keyboard. In theory should use a >0.0f threshold but would need to reset in everywhere we set this to true. - if (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f) - g.NavDisableMouseHover = false; - - io.MousePosPrev = io.MousePos; - for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) - { - io.MouseClicked[i] = io.MouseDown[i] && io.MouseDownDuration[i] < 0.0f; - io.MouseClickedCount[i] = 0; // Will be filled below - io.MouseReleased[i] = !io.MouseDown[i] && io.MouseDownDuration[i] >= 0.0f; - io.MouseDownDurationPrev[i] = io.MouseDownDuration[i]; - io.MouseDownDuration[i] = io.MouseDown[i] ? (io.MouseDownDuration[i] < 0.0f ? 0.0f : io.MouseDownDuration[i] + io.DeltaTime) : -1.0f; - if (io.MouseClicked[i]) - { - bool is_repeated_click = false; - if ((float)(g.Time - io.MouseClickedTime[i]) < io.MouseDoubleClickTime) - { - ImVec2 delta_from_click_pos = IsMousePosValid(&io.MousePos) ? (io.MousePos - io.MouseClickedPos[i]) : ImVec2(0.0f, 0.0f); - if (ImLengthSqr(delta_from_click_pos) < io.MouseDoubleClickMaxDist * io.MouseDoubleClickMaxDist) - is_repeated_click = true; - } - if (is_repeated_click) - io.MouseClickedLastCount[i]++; - else - io.MouseClickedLastCount[i] = 1; - io.MouseClickedTime[i] = g.Time; - io.MouseClickedPos[i] = io.MousePos; - io.MouseClickedCount[i] = io.MouseClickedLastCount[i]; - io.MouseDragMaxDistanceSqr[i] = 0.0f; - } - else if (io.MouseDown[i]) - { - // Maintain the maximum distance we reaching from the initial click position, which is used with dragging threshold - float delta_sqr_click_pos = IsMousePosValid(&io.MousePos) ? ImLengthSqr(io.MousePos - io.MouseClickedPos[i]) : 0.0f; - io.MouseDragMaxDistanceSqr[i] = ImMax(io.MouseDragMaxDistanceSqr[i], delta_sqr_click_pos); - } - - // We provide io.MouseDoubleClicked[] as a legacy service - io.MouseDoubleClicked[i] = (io.MouseClickedCount[i] == 2); - - // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation - if (io.MouseClicked[i]) - g.NavDisableMouseHover = false; - } -} - -static void StartLockWheelingWindow(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - if (g.WheelingWindow == window) - return; - g.WheelingWindow = window; - g.WheelingWindowRefMousePos = g.IO.MousePos; - g.WheelingWindowTimer = WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER; -} - -void ImGui::UpdateMouseWheel() -{ - ImGuiContext& g = *GImGui; - - // Reset the locked window if we move the mouse or after the timer elapses - if (g.WheelingWindow != NULL) - { - g.WheelingWindowTimer -= g.IO.DeltaTime; - if (IsMousePosValid() && ImLengthSqr(g.IO.MousePos - g.WheelingWindowRefMousePos) > g.IO.MouseDragThreshold * g.IO.MouseDragThreshold) - g.WheelingWindowTimer = 0.0f; - if (g.WheelingWindowTimer <= 0.0f) - { - g.WheelingWindow = NULL; - g.WheelingWindowTimer = 0.0f; - } - } - - const bool hovered_id_using_mouse_wheel = (g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrameUsingMouseWheel); - const bool active_id_using_mouse_wheel_x = g.ActiveIdUsingKeyInputMask.TestBit(ImGuiKey_MouseWheelX); - const bool active_id_using_mouse_wheel_y = g.ActiveIdUsingKeyInputMask.TestBit(ImGuiKey_MouseWheelY); - - float wheel_x = (!hovered_id_using_mouse_wheel && !active_id_using_mouse_wheel_x) ? g.IO.MouseWheelH : 0.0f; - float wheel_y = (!hovered_id_using_mouse_wheel && !active_id_using_mouse_wheel_y) ? g.IO.MouseWheel : 0; - if (wheel_x == 0.0f && wheel_y == 0.0f) - return; - - ImGuiWindow* window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow; - if (!window || window->Collapsed) - return; - - // Zoom / Scale window - // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned. - if (wheel_y != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling) - { - StartLockWheelingWindow(window); - const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f); - const float scale = new_font_scale / window->FontWindowScale; - window->FontWindowScale = new_font_scale; - if (window == window->RootWindow) - { - const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size; - SetWindowPos(window, window->Pos + offset, 0); - window->Size = ImFloor(window->Size * scale); - window->SizeFull = ImFloor(window->SizeFull * scale); - } - return; - } - - // Mouse wheel scrolling - // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent - if (g.IO.KeyCtrl) - return; - - // As a standard behavior holding SHIFT while using Vertical Mouse Wheel triggers Horizontal scroll instead - // (we avoid doing it on OSX as it the OS input layer handles this already) - const bool swap_axis = g.IO.KeyShift && !g.IO.ConfigMacOSXBehaviors; - if (swap_axis) - { - wheel_x = wheel_y; - wheel_y = 0.0f; - } - - // Vertical Mouse Wheel scrolling - if (wheel_y != 0.0f) - { - StartLockWheelingWindow(window); - while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)))) - window = window->ParentWindow; - if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) - { - float max_step = window->InnerRect.GetHeight() * 0.67f; - float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step)); - SetScrollY(window, window->Scroll.y - wheel_y * scroll_step); - } - } - - // Horizontal Mouse Wheel scrolling, or Vertical Mouse Wheel w/ Shift held - if (wheel_x != 0.0f) - { - StartLockWheelingWindow(window); - while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.x == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)))) - window = window->ParentWindow; - if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) - { - float max_step = window->InnerRect.GetWidth() * 0.67f; - float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step)); - SetScrollX(window, window->Scroll.x - wheel_x * scroll_step); - } - } -} - -// The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app) -void ImGui::UpdateHoveredWindowAndCaptureFlags() -{ - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - g.WindowsHoverPadding = ImMax(g.Style.TouchExtraPadding, ImVec2(WINDOWS_HOVER_PADDING, WINDOWS_HOVER_PADDING)); - - // Find the window hovered by mouse: - // - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow. - // - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame. - // - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms. - bool clear_hovered_windows = false; - FindHoveredWindow(); - - // Modal windows prevents mouse from hovering behind them. - ImGuiWindow* modal_window = GetTopMostPopupModal(); - if (modal_window && g.HoveredWindow && !IsWindowWithinBeginStackOf(g.HoveredWindow->RootWindow, modal_window)) - clear_hovered_windows = true; - - // Disabled mouse? - if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) - clear_hovered_windows = true; - - // We track click ownership. When clicked outside of a window the click is owned by the application and - // won't report hovering nor request capture even while dragging over our windows afterward. - const bool has_open_popup = (g.OpenPopupStack.Size > 0); - const bool has_open_modal = (modal_window != NULL); - int mouse_earliest_down = -1; - bool mouse_any_down = false; - for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) - { - if (io.MouseClicked[i]) - { - io.MouseDownOwned[i] = (g.HoveredWindow != NULL) || has_open_popup; - io.MouseDownOwnedUnlessPopupClose[i] = (g.HoveredWindow != NULL) || has_open_modal; - } - mouse_any_down |= io.MouseDown[i]; - if (io.MouseDown[i]) - if (mouse_earliest_down == -1 || io.MouseClickedTime[i] < io.MouseClickedTime[mouse_earliest_down]) - mouse_earliest_down = i; - } - const bool mouse_avail = (mouse_earliest_down == -1) || io.MouseDownOwned[mouse_earliest_down]; - const bool mouse_avail_unless_popup_close = (mouse_earliest_down == -1) || io.MouseDownOwnedUnlessPopupClose[mouse_earliest_down]; - - // If mouse was first clicked outside of ImGui bounds we also cancel out hovering. - // FIXME: For patterns of drag and drop across OS windows, we may need to rework/remove this test (first committed 311c0ca9 on 2015/02) - const bool mouse_dragging_extern_payload = g.DragDropActive && (g.DragDropSourceFlags & ImGuiDragDropFlags_SourceExtern) != 0; - if (!mouse_avail && !mouse_dragging_extern_payload) - clear_hovered_windows = true; - - if (clear_hovered_windows) - g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL; - - // Update io.WantCaptureMouse for the user application (true = dispatch mouse info to Dear ImGui only, false = dispatch mouse to Dear ImGui + underlying app) - // Update io.WantCaptureMouseAllowPopupClose (experimental) to give a chance for app to react to popup closure with a drag - if (g.WantCaptureMouseNextFrame != -1) - { - io.WantCaptureMouse = io.WantCaptureMouseUnlessPopupClose = (g.WantCaptureMouseNextFrame != 0); - } - else - { - io.WantCaptureMouse = (mouse_avail && (g.HoveredWindow != NULL || mouse_any_down)) || has_open_popup; - io.WantCaptureMouseUnlessPopupClose = (mouse_avail_unless_popup_close && (g.HoveredWindow != NULL || mouse_any_down)) || has_open_modal; - } - - // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to Dear ImGui only, false = dispatch keyboard info to Dear ImGui + underlying app) - if (g.WantCaptureKeyboardNextFrame != -1) - io.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); - else - io.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL); - if (io.NavActive && (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && !(io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard)) - io.WantCaptureKeyboard = true; - - // Update io.WantTextInput flag, this is to allow systems without a keyboard (e.g. mobile, hand-held) to show a software keyboard if possible - io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false; -} - -// [Internal] Do not use directly (can read io.KeyMods instead) -ImGuiModFlags ImGui::GetMergedModFlags() -{ - ImGuiContext& g = *GImGui; - ImGuiModFlags key_mods = ImGuiModFlags_None; - if (g.IO.KeyCtrl) { key_mods |= ImGuiModFlags_Ctrl; } - if (g.IO.KeyShift) { key_mods |= ImGuiModFlags_Shift; } - if (g.IO.KeyAlt) { key_mods |= ImGuiModFlags_Alt; } - if (g.IO.KeySuper) { key_mods |= ImGuiModFlags_Super; } - return key_mods; -} - -void ImGui::NewFrame() -{ - IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); - ImGuiContext& g = *GImGui; - - // Remove pending delete hooks before frame start. - // This deferred removal avoid issues of removal while iterating the hook vector - for (int n = g.Hooks.Size - 1; n >= 0; n--) - if (g.Hooks[n].Type == ImGuiContextHookType_PendingRemoval_) - g.Hooks.erase(&g.Hooks[n]); - - CallContextHooks(&g, ImGuiContextHookType_NewFramePre); - - // Check and assert for various common IO and Configuration mistakes - ErrorCheckNewFrameSanityChecks(); - - // Load settings on first frame, save settings when modified (after a delay) - UpdateSettings(); - - g.Time += g.IO.DeltaTime; - g.WithinFrameScope = true; - g.FrameCount += 1; - g.TooltipOverrideCount = 0; - g.WindowsActiveCount = 0; - g.MenusIdSubmittedThisFrame.resize(0); - - // Calculate frame-rate for the user, as a purely luxurious feature - g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx]; - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime; - g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame); - g.FramerateSecPerFrameCount = ImMin(g.FramerateSecPerFrameCount + 1, IM_ARRAYSIZE(g.FramerateSecPerFrame)); - g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)g.FramerateSecPerFrameCount)) : FLT_MAX; - - UpdateViewportsNewFrame(); - - // Setup current font and draw list shared data - g.IO.Fonts->Locked = true; - SetCurrentFont(GetDefaultFont()); - IM_ASSERT(g.Font->IsLoaded()); - ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); - for (int n = 0; n < g.Viewports.Size; n++) - virtual_space.Add(g.Viewports[n]->GetMainRect()); - g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4(); - g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; - g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError); - g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; - if (g.Style.AntiAliasedLines) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; - if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; - if (g.Style.AntiAliasedFill) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; - if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; - - // Mark rendering data as invalid to prevent user who may have a handle on it to use it. - for (int n = 0; n < g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataP.Clear(); - } - - // Drag and drop keep the source ID alive so even if the source disappear our state is consistent - if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId) - KeepAliveID(g.DragDropPayload.SourceId); - - // Update HoveredId data - if (!g.HoveredIdPreviousFrame) - g.HoveredIdTimer = 0.0f; - if (!g.HoveredIdPreviousFrame || (g.HoveredId && g.ActiveId == g.HoveredId)) - g.HoveredIdNotActiveTimer = 0.0f; - if (g.HoveredId) - g.HoveredIdTimer += g.IO.DeltaTime; - if (g.HoveredId && g.ActiveId != g.HoveredId) - g.HoveredIdNotActiveTimer += g.IO.DeltaTime; - g.HoveredIdPreviousFrame = g.HoveredId; - g.HoveredIdPreviousFrameUsingMouseWheel = g.HoveredIdUsingMouseWheel; - g.HoveredId = 0; - g.HoveredIdAllowOverlap = false; - g.HoveredIdUsingMouseWheel = false; - g.HoveredIdDisabled = false; - - // Clear ActiveID if the item is not alive anymore. - // In 1.87, the common most call to KeepAliveID() was moved from GetID() to ItemAdd(). - // As a result, custom widget using ButtonBehavior() _without_ ItemAdd() need to call KeepAliveID() themselves. - if (g.ActiveId != 0 && g.ActiveIdIsAlive != g.ActiveId && g.ActiveIdPreviousFrame == g.ActiveId) - { - IMGUI_DEBUG_LOG_ACTIVEID("NewFrame(): ClearActiveID() because it isn't marked alive anymore!\n"); - ClearActiveID(); - } - - // Update ActiveId data (clear reference to active widget if the widget isn't alive anymore) - if (g.ActiveId) - g.ActiveIdTimer += g.IO.DeltaTime; - g.LastActiveIdTimer += g.IO.DeltaTime; - g.ActiveIdPreviousFrame = g.ActiveId; - g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow; - g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore; - g.ActiveIdIsAlive = 0; - g.ActiveIdHasBeenEditedThisFrame = false; - g.ActiveIdPreviousFrameIsAlive = false; - g.ActiveIdIsJustActivated = false; - if (g.TempInputId != 0 && g.ActiveId != g.TempInputId) - g.TempInputId = 0; - if (g.ActiveId == 0) - { - g.ActiveIdUsingNavDirMask = 0x00; - g.ActiveIdUsingKeyInputMask.ClearAllBits(); - } - -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - if (g.ActiveId == 0) - g.ActiveIdUsingNavInputMask = 0; - else if (g.ActiveIdUsingNavInputMask != 0) - { - // If your custom widget code used: { g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel); } - // Since IMGUI_VERSION_NUM >= 18804 it should be: { SetActiveIdUsingKey(ImGuiKey_Escape); SetActiveIdUsingKey(ImGuiKey_NavGamepadCancel); } - if (g.ActiveIdUsingNavInputMask & (1 << ImGuiNavInput_Cancel)) - SetActiveIdUsingKey(ImGuiKey_Escape); - if (g.ActiveIdUsingNavInputMask & ~(1 << ImGuiNavInput_Cancel)) - IM_ASSERT(0); // Other values unsupported - } -#endif - - // Drag and drop - g.DragDropAcceptIdPrev = g.DragDropAcceptIdCurr; - g.DragDropAcceptIdCurr = 0; - g.DragDropAcceptIdCurrRectSurface = FLT_MAX; - g.DragDropWithinSource = false; - g.DragDropWithinTarget = false; - g.DragDropHoldJustPressedId = 0; - - // Close popups on focus lost (currently wip/opt-in) - //if (g.IO.AppFocusLost) - // ClosePopupsExceptModals(); - - // Process input queue (trickle as many events as possible) - g.InputEventsTrail.resize(0); - UpdateInputEvents(g.IO.ConfigInputTrickleEventQueue); - - // Update keyboard input state - UpdateKeyboardInputs(); - - //IM_ASSERT(g.IO.KeyCtrl == IsKeyDown(ImGuiKey_LeftCtrl) || IsKeyDown(ImGuiKey_RightCtrl)); - //IM_ASSERT(g.IO.KeyShift == IsKeyDown(ImGuiKey_LeftShift) || IsKeyDown(ImGuiKey_RightShift)); - //IM_ASSERT(g.IO.KeyAlt == IsKeyDown(ImGuiKey_LeftAlt) || IsKeyDown(ImGuiKey_RightAlt)); - //IM_ASSERT(g.IO.KeySuper == IsKeyDown(ImGuiKey_LeftSuper) || IsKeyDown(ImGuiKey_RightSuper)); - - // Update gamepad/keyboard navigation - NavUpdate(); - - // Update mouse input state - UpdateMouseInputs(); - - // Find hovered window - // (needs to be before UpdateMouseMovingWindowNewFrame so we fill g.HoveredWindowUnderMovingWindow on the mouse release frame) - UpdateHoveredWindowAndCaptureFlags(); - - // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering) - UpdateMouseMovingWindowNewFrame(); - - // Background darkening/whitening - if (GetTopMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f)) - g.DimBgRatio = ImMin(g.DimBgRatio + g.IO.DeltaTime * 6.0f, 1.0f); - else - g.DimBgRatio = ImMax(g.DimBgRatio - g.IO.DeltaTime * 10.0f, 0.0f); - - g.MouseCursor = ImGuiMouseCursor_Arrow; - g.WantCaptureMouseNextFrame = g.WantCaptureKeyboardNextFrame = g.WantTextInputNextFrame = -1; - - // Platform IME data: reset for the frame - g.PlatformImeDataPrev = g.PlatformImeData; - g.PlatformImeData.WantVisible = false; - - // Mouse wheel scrolling, scale - UpdateMouseWheel(); - - // Mark all windows as not visible and compact unused memory. - IM_ASSERT(g.WindowsFocusOrder.Size <= g.Windows.Size); - const float memory_compact_start_time = (g.GcCompactAll || g.IO.ConfigMemoryCompactTimer < 0.0f) ? FLT_MAX : (float)g.Time - g.IO.ConfigMemoryCompactTimer; - for (int i = 0; i != g.Windows.Size; i++) - { - ImGuiWindow* window = g.Windows[i]; - window->WasActive = window->Active; - window->BeginCount = 0; - window->Active = false; - window->WriteAccessed = false; - - // Garbage collect transient buffers of recently unused windows - if (!window->WasActive && !window->MemoryCompacted && window->LastTimeActive < memory_compact_start_time) - GcCompactTransientWindowBuffers(window); - } - - // Garbage collect transient buffers of recently unused tables - for (int i = 0; i < g.TablesLastTimeActive.Size; i++) - if (g.TablesLastTimeActive[i] >= 0.0f && g.TablesLastTimeActive[i] < memory_compact_start_time) - TableGcCompactTransientBuffers(g.Tables.GetByIndex(i)); - for (int i = 0; i < g.TablesTempData.Size; i++) - if (g.TablesTempData[i].LastTimeActive >= 0.0f && g.TablesTempData[i].LastTimeActive < memory_compact_start_time) - TableGcCompactTransientBuffers(&g.TablesTempData[i]); - if (g.GcCompactAll) - GcCompactTransientMiscBuffers(); - g.GcCompactAll = false; - - // Closing the focused window restore focus to the first active root window in descending z-order - if (g.NavWindow && !g.NavWindow->WasActive) - FocusTopMostWindowUnderOne(NULL, NULL); - - // No window should be open at the beginning of the frame. - // But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear. - g.CurrentWindowStack.resize(0); - g.BeginPopupStack.resize(0); - g.ItemFlagsStack.resize(0); - g.ItemFlagsStack.push_back(ImGuiItemFlags_None); - g.GroupStack.resize(0); - - // [DEBUG] Update debug features - UpdateDebugToolItemPicker(); - UpdateDebugToolStackQueries(); - - // Create implicit/fallback window - which we will only render it if the user has added something to it. - // We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags. - // This fallback is particularly important as it avoid ImGui:: calls from crashing. - g.WithinFrameScopeWithImplicitWindow = true; - SetNextWindowSize(ImVec2(400, 400), ImGuiCond_FirstUseEver); - Begin("Debug##Default"); - IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true); - - CallContextHooks(&g, ImGuiContextHookType_NewFramePost); -} - -void ImGui::Initialize() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(!g.Initialized && !g.SettingsLoaded); - - // Add .ini handle for ImGuiWindow type - { - ImGuiSettingsHandler ini_handler; - ini_handler.TypeName = "Window"; - ini_handler.TypeHash = ImHashStr("Window"); - ini_handler.ClearAllFn = WindowSettingsHandler_ClearAll; - ini_handler.ReadOpenFn = WindowSettingsHandler_ReadOpen; - ini_handler.ReadLineFn = WindowSettingsHandler_ReadLine; - ini_handler.ApplyAllFn = WindowSettingsHandler_ApplyAll; - ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll; - AddSettingsHandler(&ini_handler); - } - - // Add .ini handle for ImGuiTable type - TableSettingsAddSettingsHandler(); - - // Create default viewport - ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)(); - g.Viewports.push_back(viewport); - g.TempBuffer.resize(1024 * 3 + 1, 0); - -#ifdef IMGUI_HAS_DOCK -#endif - - g.Initialized = true; -} - -// This function is merely here to free heap allocations. -void ImGui::Shutdown() -{ - // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) - ImGuiContext& g = *GImGui; - if (g.IO.Fonts && g.FontAtlasOwnedByContext) - { - g.IO.Fonts->Locked = false; - IM_DELETE(g.IO.Fonts); - } - g.IO.Fonts = NULL; - - // Cleanup of other data are conditional on actually having initialized Dear ImGui. - if (!g.Initialized) - return; - - // Save settings (unless we haven't attempted to load them: CreateContext/DestroyContext without a call to NewFrame shouldn't save an empty file) - if (g.SettingsLoaded && g.IO.IniFilename != NULL) - SaveIniSettingsToDisk(g.IO.IniFilename); - - CallContextHooks(&g, ImGuiContextHookType_Shutdown); - - // Clear everything else - g.Windows.clear_delete(); - g.WindowsFocusOrder.clear(); - g.WindowsTempSortBuffer.clear(); - g.CurrentWindow = NULL; - g.CurrentWindowStack.clear(); - g.WindowsById.Clear(); - g.NavWindow = NULL; - g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL; - g.ActiveIdWindow = g.ActiveIdPreviousFrameWindow = NULL; - g.MovingWindow = NULL; - g.ColorStack.clear(); - g.StyleVarStack.clear(); - g.FontStack.clear(); - g.OpenPopupStack.clear(); - g.BeginPopupStack.clear(); - - g.Viewports.clear_delete(); - - g.TabBars.Clear(); - g.CurrentTabBarStack.clear(); - g.ShrinkWidthBuffer.clear(); - - g.ClipperTempData.clear_destruct(); - - g.Tables.Clear(); - g.TablesTempData.clear_destruct(); - g.DrawChannelsTempMergeBuffer.clear(); - - g.ClipboardHandlerData.clear(); - g.MenusIdSubmittedThisFrame.clear(); - g.InputTextState.ClearFreeMemory(); - - g.SettingsWindows.clear(); - g.SettingsHandlers.clear(); - - if (g.LogFile) - { -#ifndef IMGUI_DISABLE_TTY_FUNCTIONS - if (g.LogFile != stdout) -#endif - ImFileClose(g.LogFile); - g.LogFile = NULL; - } - g.LogBuffer.clear(); - g.DebugLogBuf.clear(); - - g.Initialized = false; -} - -// FIXME: Add a more explicit sort order in the window structure. -static int IMGUI_CDECL ChildWindowComparer(const void* lhs, const void* rhs) -{ - const ImGuiWindow* const a = *(const ImGuiWindow* const *)lhs; - const ImGuiWindow* const b = *(const ImGuiWindow* const *)rhs; - if (int d = (a->Flags & ImGuiWindowFlags_Popup) - (b->Flags & ImGuiWindowFlags_Popup)) - return d; - if (int d = (a->Flags & ImGuiWindowFlags_Tooltip) - (b->Flags & ImGuiWindowFlags_Tooltip)) - return d; - return (a->BeginOrderWithinParent - b->BeginOrderWithinParent); -} - -static void AddWindowToSortBuffer(ImVector* out_sorted_windows, ImGuiWindow* window) -{ - out_sorted_windows->push_back(window); - if (window->Active) - { - int count = window->DC.ChildWindows.Size; - ImQsort(window->DC.ChildWindows.Data, (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer); - for (int i = 0; i < count; i++) - { - ImGuiWindow* child = window->DC.ChildWindows[i]; - if (child->Active) - AddWindowToSortBuffer(out_sorted_windows, child); - } - } -} - -static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list) -{ - if (draw_list->CmdBuffer.Size == 0) - return; - if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL) - return; - - // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. - // May trigger for you if you are using PrimXXX functions incorrectly. - IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); - IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); - if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) - IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); - - // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) - // If this assert triggers because you are drawing lots of stuff manually: - // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds. - // Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents. - // - If you want large meshes with more than 64K vertices, you can either: - // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'. - // Most example backends already support this from 1.71. Pre-1.71 backends won't. - // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. - // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. - // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time: - // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); - // Your own engine or render API may use different parameters or function calls to specify index sizes. - // 2 and 4 bytes indices are generally supported by most graphics API. - // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching - // the 64K limit to split your draw commands in multiple draw lists. - if (sizeof(ImDrawIdx) == 2) - IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); - - out_list->push_back(draw_list); -} - -static void AddWindowToDrawData(ImGuiWindow* window, int layer) -{ - ImGuiContext& g = *GImGui; - ImGuiViewportP* viewport = g.Viewports[0]; - g.IO.MetricsRenderWindows++; - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[layer], window->DrawList); - for (int i = 0; i < window->DC.ChildWindows.Size; i++) - { - ImGuiWindow* child = window->DC.ChildWindows[i]; - if (IsWindowActiveAndVisible(child)) // Clipped children may have been marked not active - AddWindowToDrawData(child, layer); - } -} - -static inline int GetWindowDisplayLayer(ImGuiWindow* window) -{ - return (window->Flags & ImGuiWindowFlags_Tooltip) ? 1 : 0; -} - -// Layer is locked for the root window, however child windows may use a different viewport (e.g. extruding menu) -static inline void AddRootWindowToDrawData(ImGuiWindow* window) -{ - AddWindowToDrawData(window, GetWindowDisplayLayer(window)); -} - -void ImDrawDataBuilder::FlattenIntoSingleLayer() -{ - int n = Layers[0].Size; - int size = n; - for (int i = 1; i < IM_ARRAYSIZE(Layers); i++) - size += Layers[i].Size; - Layers[0].resize(size); - for (int layer_n = 1; layer_n < IM_ARRAYSIZE(Layers); layer_n++) - { - ImVector& layer = Layers[layer_n]; - if (layer.empty()) - continue; - memcpy(&Layers[0][n], &layer[0], layer.Size * sizeof(ImDrawList*)); - n += layer.Size; - layer.resize(0); - } -} - -static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector* draw_lists) -{ - ImGuiIO& io = ImGui::GetIO(); - ImDrawData* draw_data = &viewport->DrawDataP; - draw_data->Valid = true; - draw_data->CmdLists = (draw_lists->Size > 0) ? draw_lists->Data : NULL; - draw_data->CmdListsCount = draw_lists->Size; - draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0; - draw_data->DisplayPos = viewport->Pos; - draw_data->DisplaySize = viewport->Size; - draw_data->FramebufferScale = io.DisplayFramebufferScale; - for (int n = 0; n < draw_lists->Size; n++) - { - ImDrawList* draw_list = draw_lists->Data[n]; - draw_list->_PopUnusedDrawCmd(); - draw_data->TotalVtxCount += draw_list->VtxBuffer.Size; - draw_data->TotalIdxCount += draw_list->IdxBuffer.Size; - } -} - -// Push a clipping rectangle for both ImGui logic (hit-testing etc.) and low-level ImDrawList rendering. -// - When using this function it is sane to ensure that float are perfectly rounded to integer values, -// so that e.g. (int)(max.x-min.x) in user's render produce correct result. -// - If the code here changes, may need to update code of functions like NextColumn() and PushColumnClipRect(): -// some frequently called functions which to modify both channels and clipping simultaneously tend to use the -// more specialized SetWindowClipRectBeforeSetChannel() to avoid extraneous updates of underlying ImDrawCmds. -void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DrawList->PushClipRect(clip_rect_min, clip_rect_max, intersect_with_current_clip_rect); - window->ClipRect = window->DrawList->_ClipRectStack.back(); -} - -void ImGui::PopClipRect() -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DrawList->PopClipRect(); - window->ClipRect = window->DrawList->_ClipRectStack.back(); -} - -static void ImGui::RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - ImGuiViewportP* viewport = (ImGuiViewportP*)GetMainViewport(); - ImRect viewport_rect = viewport->GetMainRect(); - - // Draw behind window by moving the draw command at the FRONT of the draw list - { - // We've already called AddWindowToDrawData() which called DrawList->ChannelsMerge() on DockNodeHost windows, - // and draw list have been trimmed already, hence the explicit recreation of a draw command if missing. - // FIXME: This is creating complication, might be simpler if we could inject a drawlist in drawdata at a given position and not attempt to manipulate ImDrawCmd order. - ImDrawList* draw_list = window->RootWindow->DrawList; - if (draw_list->CmdBuffer.Size == 0) - draw_list->AddDrawCmd(); - draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // Ensure ImDrawCmd are not merged - draw_list->AddRectFilled(viewport_rect.Min, viewport_rect.Max, col); - ImDrawCmd cmd = draw_list->CmdBuffer.back(); - IM_ASSERT(cmd.ElemCount == 6); - draw_list->CmdBuffer.pop_back(); - draw_list->CmdBuffer.push_front(cmd); - draw_list->PopClipRect(); - draw_list->AddDrawCmd(); // We need to create a command as CmdBuffer.back().IdxOffset won't be correct if we append to same command. - } -} - -ImGuiWindow* ImGui::FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* parent_window) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* bottom_most_visible_window = parent_window; - for (int i = FindWindowDisplayIndex(parent_window); i >= 0; i--) - { - ImGuiWindow* window = g.Windows[i]; - if (window->Flags & ImGuiWindowFlags_ChildWindow) - continue; - if (!IsWindowWithinBeginStackOf(window, parent_window)) - break; - if (IsWindowActiveAndVisible(window) && GetWindowDisplayLayer(window) <= GetWindowDisplayLayer(parent_window)) - bottom_most_visible_window = window; - } - return bottom_most_visible_window; -} - -static void ImGui::RenderDimmedBackgrounds() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* modal_window = GetTopMostAndVisiblePopupModal(); - if (g.DimBgRatio <= 0.0f && g.NavWindowingHighlightAlpha <= 0.0f) - return; - const bool dim_bg_for_modal = (modal_window != NULL); - const bool dim_bg_for_window_list = (g.NavWindowingTargetAnim != NULL && g.NavWindowingTargetAnim->Active); - if (!dim_bg_for_modal && !dim_bg_for_window_list) - return; - - if (dim_bg_for_modal) - { - // Draw dimming behind modal or a begin stack child, whichever comes first in draw order. - ImGuiWindow* dim_behind_window = FindBottomMostVisibleWindowWithinBeginStack(modal_window); - RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(ImGuiCol_ModalWindowDimBg, g.DimBgRatio)); - } - else if (dim_bg_for_window_list) - { - // Draw dimming behind CTRL+Tab target window - RenderDimmedBackgroundBehindWindow(g.NavWindowingTargetAnim, GetColorU32(ImGuiCol_NavWindowingDimBg, g.DimBgRatio)); - - // Draw border around CTRL+Tab target window - ImGuiWindow* window = g.NavWindowingTargetAnim; - ImGuiViewport* viewport = GetMainViewport(); - float distance = g.FontSize; - ImRect bb = window->Rect(); - bb.Expand(distance); - if (bb.GetWidth() >= viewport->Size.x && bb.GetHeight() >= viewport->Size.y) - bb.Expand(-distance - 1.0f); // If a window fits the entire viewport, adjust its highlight inward - if (window->DrawList->CmdBuffer.Size == 0) - window->DrawList->AddDrawCmd(); - window->DrawList->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size); - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), window->WindowRounding, 0, 3.0f); - window->DrawList->PopClipRect(); - } -} - -// This is normally called by Render(). You may want to call it directly if you want to avoid calling Render() but the gain will be very minimal. -void ImGui::EndFrame() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.Initialized); - - // Don't process EndFrame() multiple times. - if (g.FrameCountEnded == g.FrameCount) - return; - IM_ASSERT(g.WithinFrameScope && "Forgot to call ImGui::NewFrame()?"); - - CallContextHooks(&g, ImGuiContextHookType_EndFramePre); - - ErrorCheckEndFrameSanityChecks(); - - // Notify Platform/OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME) - if (g.IO.SetPlatformImeDataFn && memcmp(&g.PlatformImeData, &g.PlatformImeDataPrev, sizeof(ImGuiPlatformImeData)) != 0) - g.IO.SetPlatformImeDataFn(GetMainViewport(), &g.PlatformImeData); - - // Hide implicit/fallback "Debug" window if it hasn't been used - g.WithinFrameScopeWithImplicitWindow = false; - if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed) - g.CurrentWindow->Active = false; - End(); - - // Update navigation: CTRL+Tab, wrap-around requests - NavEndFrame(); - - // Drag and Drop: Elapse payload (if delivered, or if source stops being submitted) - if (g.DragDropActive) - { - bool is_delivered = g.DragDropPayload.Delivery; - bool is_elapsed = (g.DragDropPayload.DataFrameCount + 1 < g.FrameCount) && ((g.DragDropSourceFlags & ImGuiDragDropFlags_SourceAutoExpirePayload) || !IsMouseDown(g.DragDropMouseButton)); - if (is_delivered || is_elapsed) - ClearDragDrop(); - } - - // Drag and Drop: Fallback for source tooltip. This is not ideal but better than nothing. - if (g.DragDropActive && g.DragDropSourceFrameCount < g.FrameCount && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) - { - g.DragDropWithinSource = true; - SetTooltip("..."); - g.DragDropWithinSource = false; - } - - // End frame - g.WithinFrameScope = false; - g.FrameCountEnded = g.FrameCount; - - // Initiate moving window + handle left-click and right-click focus - UpdateMouseMovingWindowEndFrame(); - - // Sort the window list so that all child windows are after their parent - // We cannot do that on FocusWindow() because children may not exist yet - g.WindowsTempSortBuffer.resize(0); - g.WindowsTempSortBuffer.reserve(g.Windows.Size); - for (int i = 0; i != g.Windows.Size; i++) - { - ImGuiWindow* window = g.Windows[i]; - if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it - continue; - AddWindowToSortBuffer(&g.WindowsTempSortBuffer, window); - } - - // This usually assert if there is a mismatch between the ImGuiWindowFlags_ChildWindow / ParentWindow values and DC.ChildWindows[] in parents, aka we've done something wrong. - IM_ASSERT(g.Windows.Size == g.WindowsTempSortBuffer.Size); - g.Windows.swap(g.WindowsTempSortBuffer); - g.IO.MetricsActiveWindows = g.WindowsActiveCount; - - // Unlock font atlas - g.IO.Fonts->Locked = false; - - // Clear Input data for next frame - g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; - g.IO.InputQueueCharacters.resize(0); - - CallContextHooks(&g, ImGuiContextHookType_EndFramePost); -} - -// Prepare the data for rendering so you can call GetDrawData() -// (As with anything within the ImGui:: namspace this doesn't touch your GPU or graphics API at all: -// it is the role of the ImGui_ImplXXXX_RenderDrawData() function provided by the renderer backend) -void ImGui::Render() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.Initialized); - - if (g.FrameCountEnded != g.FrameCount) - EndFrame(); - const bool first_render_of_frame = (g.FrameCountRendered != g.FrameCount); - g.FrameCountRendered = g.FrameCount; - g.IO.MetricsRenderWindows = 0; - - CallContextHooks(&g, ImGuiContextHookType_RenderPre); - - // Add background ImDrawList (for each active viewport) - for (int n = 0; n != g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataBuilder.Clear(); - if (viewport->DrawLists[0] != NULL) - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); - } - - // Draw modal/window whitening backgrounds - if (first_render_of_frame) - RenderDimmedBackgrounds(); - - // Add ImDrawList to render - ImGuiWindow* windows_to_render_top_most[2]; - windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL; - windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingListWindow : NULL); - for (int n = 0; n != g.Windows.Size; n++) - { - ImGuiWindow* window = g.Windows[n]; - IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" - if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1]) - AddRootWindowToDrawData(window); - } - for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_top_most); n++) - if (windows_to_render_top_most[n] && IsWindowActiveAndVisible(windows_to_render_top_most[n])) // NavWindowingTarget is always temporarily displayed as the top-most window - AddRootWindowToDrawData(windows_to_render_top_most[n]); - - // Draw software mouse cursor if requested by io.MouseDrawCursor flag - if (g.IO.MouseDrawCursor && first_render_of_frame && g.MouseCursor != ImGuiMouseCursor_None) - RenderMouseCursor(g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48)); - - // Setup ImDrawData structures for end-user - g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0; - for (int n = 0; n < g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataBuilder.FlattenIntoSingleLayer(); - - // Add foreground ImDrawList (for each active viewport) - if (viewport->DrawLists[1] != NULL) - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); - - SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]); - ImDrawData* draw_data = &viewport->DrawDataP; - g.IO.MetricsRenderVertices += draw_data->TotalVtxCount; - g.IO.MetricsRenderIndices += draw_data->TotalIdxCount; - } - - CallContextHooks(&g, ImGuiContextHookType_RenderPost); -} - -// Calculate text size. Text can be multi-line. Optionally ignore text after a ## marker. -// CalcTextSize("") should return ImVec2(0.0f, g.FontSize) -ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width) -{ - ImGuiContext& g = *GImGui; - - const char* text_display_end; - if (hide_text_after_double_hash) - text_display_end = FindRenderedTextEnd(text, text_end); // Hide anything after a '##' string - else - text_display_end = text_end; - - ImFont* font = g.Font; - const float font_size = g.FontSize; - if (text == text_display_end) - return ImVec2(0.0f, font_size); - ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL); - - // Round - // FIXME: This has been here since Dec 2015 (7b0bf230) but down the line we want this out. - // FIXME: Investigate using ceilf or e.g. - // - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c - // - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html - text_size.x = IM_FLOOR(text_size.x + 0.99999f); - - return text_size; -} - -// Find window given position, search front-to-back -// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically -// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is -// called, aka before the next Begin(). Moving window isn't affected. -static void FindHoveredWindow() -{ - ImGuiContext& g = *GImGui; - - ImGuiWindow* hovered_window = NULL; - ImGuiWindow* hovered_window_ignoring_moving_window = NULL; - if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) - hovered_window = g.MovingWindow; - - ImVec2 padding_regular = g.Style.TouchExtraPadding; - ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular; - for (int i = g.Windows.Size - 1; i >= 0; i--) - { - ImGuiWindow* window = g.Windows[i]; - IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. - if (!window->Active || window->Hidden) - continue; - if (window->Flags & ImGuiWindowFlags_NoMouseInputs) - continue; - - // Using the clipped AABB, a child window will typically be clipped by its parent (not always) - ImRect bb(window->OuterRectClipped); - if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) - bb.Expand(padding_regular); - else - bb.Expand(padding_for_resize); - if (!bb.Contains(g.IO.MousePos)) - continue; - - // Support for one rectangular hole in any given window - // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512) - if (window->HitTestHoleSize.x != 0) - { - ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); - ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); - if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) - continue; - } - - if (hovered_window == NULL) - hovered_window = window; - IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. - if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) - hovered_window_ignoring_moving_window = window; - if (hovered_window && hovered_window_ignoring_moving_window) - break; - } - - g.HoveredWindow = hovered_window; - g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; -} - -bool ImGui::IsItemActive() -{ - ImGuiContext& g = *GImGui; - if (g.ActiveId) - return g.ActiveId == g.LastItemData.ID; - return false; -} - -bool ImGui::IsItemActivated() -{ - ImGuiContext& g = *GImGui; - if (g.ActiveId) - if (g.ActiveId == g.LastItemData.ID && g.ActiveIdPreviousFrame != g.LastItemData.ID) - return true; - return false; -} - -bool ImGui::IsItemDeactivated() -{ - ImGuiContext& g = *GImGui; - if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasDeactivated) - return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Deactivated) != 0; - return (g.ActiveIdPreviousFrame == g.LastItemData.ID && g.ActiveIdPreviousFrame != 0 && g.ActiveId != g.LastItemData.ID); -} - -bool ImGui::IsItemDeactivatedAfterEdit() -{ - ImGuiContext& g = *GImGui; - return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEditedBefore || (g.ActiveId == 0 && g.ActiveIdHasBeenEditedBefore)); -} - -// == GetItemID() == GetFocusID() -bool ImGui::IsItemFocused() -{ - ImGuiContext& g = *GImGui; - if (g.NavId != g.LastItemData.ID || g.NavId == 0) - return false; - return true; -} - -// Important: this can be useful but it is NOT equivalent to the behavior of e.g.Button()! -// Most widgets have specific reactions based on mouse-up/down state, mouse position etc. -bool ImGui::IsItemClicked(ImGuiMouseButton mouse_button) -{ - return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None); -} - -bool ImGui::IsItemToggledOpen() -{ - ImGuiContext& g = *GImGui; - return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledOpen) ? true : false; -} - -bool ImGui::IsItemToggledSelection() -{ - ImGuiContext& g = *GImGui; - return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledSelection) ? true : false; -} - -bool ImGui::IsAnyItemHovered() -{ - ImGuiContext& g = *GImGui; - return g.HoveredId != 0 || g.HoveredIdPreviousFrame != 0; -} - -bool ImGui::IsAnyItemActive() -{ - ImGuiContext& g = *GImGui; - return g.ActiveId != 0; -} - -bool ImGui::IsAnyItemFocused() -{ - ImGuiContext& g = *GImGui; - return g.NavId != 0 && !g.NavDisableHighlight; -} - -bool ImGui::IsItemVisible() -{ - ImGuiContext& g = *GImGui; - return g.CurrentWindow->ClipRect.Overlaps(g.LastItemData.Rect); -} - -bool ImGui::IsItemEdited() -{ - ImGuiContext& g = *GImGui; - return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Edited) != 0; -} - -// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority. -// FIXME: Although this is exposed, its interaction and ideal idiom with using ImGuiButtonFlags_AllowItemOverlap flag are extremely confusing, need rework. -void ImGui::SetItemAllowOverlap() -{ - ImGuiContext& g = *GImGui; - ImGuiID id = g.LastItemData.ID; - if (g.HoveredId == id) - g.HoveredIdAllowOverlap = true; - if (g.ActiveId == id) - g.ActiveIdAllowOverlap = true; -} - -void ImGui::SetItemUsingMouseWheel() -{ - ImGuiContext& g = *GImGui; - ImGuiID id = g.LastItemData.ID; - if (g.HoveredId == id) - g.HoveredIdUsingMouseWheel = true; - if (g.ActiveId == id) - { - g.ActiveIdUsingKeyInputMask.SetBit(ImGuiKey_MouseWheelX); - g.ActiveIdUsingKeyInputMask.SetBit(ImGuiKey_MouseWheelY); - } -} - -void ImGui::SetActiveIdUsingNavAndKeys() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.ActiveId != 0); - g.ActiveIdUsingNavDirMask = ~(ImU32)0; - g.ActiveIdUsingKeyInputMask.SetAllBits(); - NavMoveRequestCancel(); -} - -ImVec2 ImGui::GetItemRectMin() -{ - ImGuiContext& g = *GImGui; - return g.LastItemData.Rect.Min; -} - -ImVec2 ImGui::GetItemRectMax() -{ - ImGuiContext& g = *GImGui; - return g.LastItemData.Rect.Max; -} - -ImVec2 ImGui::GetItemRectSize() -{ - ImGuiContext& g = *GImGui; - return g.LastItemData.Rect.GetSize(); -} - -bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* parent_window = g.CurrentWindow; - - flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_ChildWindow; - flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag - - // Size - const ImVec2 content_avail = GetContentRegionAvail(); - ImVec2 size = ImFloor(size_arg); - const int auto_fit_axises = ((size.x == 0.0f) ? (1 << ImGuiAxis_X) : 0x00) | ((size.y == 0.0f) ? (1 << ImGuiAxis_Y) : 0x00); - if (size.x <= 0.0f) - size.x = ImMax(content_avail.x + size.x, 4.0f); // Arbitrary minimum child size (0.0f causing too much issues) - if (size.y <= 0.0f) - size.y = ImMax(content_avail.y + size.y, 4.0f); - SetNextWindowSize(size); - - // Build up name. If you need to append to a same child from multiple location in the ID stack, use BeginChild(ImGuiID id) with a stable value. - const char* temp_window_name; - if (name) - ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%s_%08X", parent_window->Name, name, id); - else - ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%08X", parent_window->Name, id); - - const float backup_border_size = g.Style.ChildBorderSize; - if (!border) - g.Style.ChildBorderSize = 0.0f; - bool ret = Begin(temp_window_name, NULL, flags); - g.Style.ChildBorderSize = backup_border_size; - - ImGuiWindow* child_window = g.CurrentWindow; - child_window->ChildId = id; - child_window->AutoFitChildAxises = (ImS8)auto_fit_axises; - - // Set the cursor to handle case where the user called SetNextWindowPos()+BeginChild() manually. - // While this is not really documented/defined, it seems that the expected thing to do. - if (child_window->BeginCount == 1) - parent_window->DC.CursorPos = child_window->Pos; - - // Process navigation-in immediately so NavInit can run on first frame - if (g.NavActivateId == id && !(flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavHasScroll)) - { - FocusWindow(child_window); - NavInitWindow(child_window, false); - SetActiveID(id + 1, child_window); // Steal ActiveId with another arbitrary id so that key-press won't activate child item - g.ActiveIdSource = ImGuiInputSource_Nav; - } - return ret; -} - -bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - return BeginChildEx(str_id, window->GetID(str_id), size_arg, border, extra_flags); -} - -bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - IM_ASSERT(id != 0); - return BeginChildEx(NULL, id, size_arg, border, extra_flags); -} - -void ImGui::EndChild() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - IM_ASSERT(g.WithinEndChild == false); - IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls - - g.WithinEndChild = true; - if (window->BeginCount > 1) - { - End(); - } - else - { - ImVec2 sz = window->Size; - if (window->AutoFitChildAxises & (1 << ImGuiAxis_X)) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f - sz.x = ImMax(4.0f, sz.x); - if (window->AutoFitChildAxises & (1 << ImGuiAxis_Y)) - sz.y = ImMax(4.0f, sz.y); - End(); - - ImGuiWindow* parent_window = g.CurrentWindow; - ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + sz); - ItemSize(sz); - if ((window->DC.NavLayersActiveMask != 0 || window->DC.NavHasScroll) && !(window->Flags & ImGuiWindowFlags_NavFlattened)) - { - ItemAdd(bb, window->ChildId); - RenderNavHighlight(bb, window->ChildId); - - // When browsing a window that has no activable items (scroll only) we keep a highlight on the child (pass g.NavId to trick into always displaying) - if (window->DC.NavLayersActiveMask == 0 && window == g.NavWindow) - RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_TypeThin); - } - else - { - // Not navigable into - ItemAdd(bb, 0); - } - if (g.HoveredWindow == window) - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; - } - g.WithinEndChild = false; - g.LogLinePosY = -FLT_MAX; // To enforce a carriage return -} - -// Helper to create a child window / scrolling region that looks like a normal widget frame. -bool ImGui::BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); - PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); - PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); - PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding); - bool ret = BeginChild(id, size, true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding | extra_flags); - PopStyleVar(3); - PopStyleColor(); - return ret; -} - -void ImGui::EndChildFrame() -{ - EndChild(); -} - -static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled) -{ - window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags); - window->SetWindowSizeAllowFlags = enabled ? (window->SetWindowSizeAllowFlags | flags) : (window->SetWindowSizeAllowFlags & ~flags); - window->SetWindowCollapsedAllowFlags = enabled ? (window->SetWindowCollapsedAllowFlags | flags) : (window->SetWindowCollapsedAllowFlags & ~flags); -} - -ImGuiWindow* ImGui::FindWindowByID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - return (ImGuiWindow*)g.WindowsById.GetVoidPtr(id); -} - -ImGuiWindow* ImGui::FindWindowByName(const char* name) -{ - ImGuiID id = ImHashStr(name); - return FindWindowByID(id); -} - -static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings) -{ - window->Pos = ImFloor(ImVec2(settings->Pos.x, settings->Pos.y)); - if (settings->Size.x > 0 && settings->Size.y > 0) - window->Size = window->SizeFull = ImFloor(ImVec2(settings->Size.x, settings->Size.y)); - window->Collapsed = settings->Collapsed; -} - -static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags) -{ - ImGuiContext& g = *GImGui; - - const bool new_is_explicit_child = (new_flags & ImGuiWindowFlags_ChildWindow) != 0; - const bool child_flag_changed = new_is_explicit_child != window->IsExplicitChild; - if ((just_created || child_flag_changed) && !new_is_explicit_child) - { - IM_ASSERT(!g.WindowsFocusOrder.contains(window)); - g.WindowsFocusOrder.push_back(window); - window->FocusOrder = (short)(g.WindowsFocusOrder.Size - 1); - } - else if (!just_created && child_flag_changed && new_is_explicit_child) - { - IM_ASSERT(g.WindowsFocusOrder[window->FocusOrder] == window); - for (int n = window->FocusOrder + 1; n < g.WindowsFocusOrder.Size; n++) - g.WindowsFocusOrder[n]->FocusOrder--; - g.WindowsFocusOrder.erase(g.WindowsFocusOrder.Data + window->FocusOrder); - window->FocusOrder = -1; - } - window->IsExplicitChild = new_is_explicit_child; -} - -static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - //IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags); - - // Create window the first time - ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name); - window->Flags = flags; - g.WindowsById.SetVoidPtr(window->ID, window); - - // Default/arbitrary window position. Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window. - const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); - window->Pos = main_viewport->Pos + ImVec2(60, 60); - - // User can disable loading and saving of settings. Tooltip and child windows also don't store settings. - if (!(flags & ImGuiWindowFlags_NoSavedSettings)) - if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID)) - { - // Retrieve settings from .ini file - window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings); - SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false); - ApplyWindowSettings(window, settings); - } - window->DC.CursorStartPos = window->DC.CursorMaxPos = window->DC.IdealMaxPos = window->Pos; // So first call to CalcWindowContentSizes() doesn't return crazy values - - if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0) - { - window->AutoFitFramesX = window->AutoFitFramesY = 2; - window->AutoFitOnlyGrows = false; - } - else - { - if (window->Size.x <= 0.0f) - window->AutoFitFramesX = 2; - if (window->Size.y <= 0.0f) - window->AutoFitFramesY = 2; - window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0); - } - - if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus) - g.Windows.push_front(window); // Quite slow but rare and only once - else - g.Windows.push_back(window); - UpdateWindowInFocusOrderList(window, true, window->Flags); - - return window; -} - -static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& size_desired) -{ - ImGuiContext& g = *GImGui; - ImVec2 new_size = size_desired; - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) - { - // Using -1,-1 on either X/Y axis to preserve the current size. - ImRect cr = g.NextWindowData.SizeConstraintRect; - new_size.x = (cr.Min.x >= 0 && cr.Max.x >= 0) ? ImClamp(new_size.x, cr.Min.x, cr.Max.x) : window->SizeFull.x; - new_size.y = (cr.Min.y >= 0 && cr.Max.y >= 0) ? ImClamp(new_size.y, cr.Min.y, cr.Max.y) : window->SizeFull.y; - if (g.NextWindowData.SizeCallback) - { - ImGuiSizeCallbackData data; - data.UserData = g.NextWindowData.SizeCallbackUserData; - data.Pos = window->Pos; - data.CurrentSize = window->SizeFull; - data.DesiredSize = new_size; - g.NextWindowData.SizeCallback(&data); - new_size = data.DesiredSize; - } - new_size.x = IM_FLOOR(new_size.x); - new_size.y = IM_FLOOR(new_size.y); - } - - // Minimum size - if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize))) - { - ImGuiWindow* window_for_height = window; - const float decoration_up_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight(); - new_size = ImMax(new_size, g.Style.WindowMinSize); - new_size.y = ImMax(new_size.y, decoration_up_height + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows - } - return new_size; -} - -static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_current, ImVec2* content_size_ideal) -{ - bool preserve_old_content_sizes = false; - if (window->Collapsed && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) - preserve_old_content_sizes = true; - else if (window->Hidden && window->HiddenFramesCannotSkipItems == 0 && window->HiddenFramesCanSkipItems > 0) - preserve_old_content_sizes = true; - if (preserve_old_content_sizes) - { - *content_size_current = window->ContentSize; - *content_size_ideal = window->ContentSizeIdeal; - return; - } - - content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x); - content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y); - content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x); - content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y); -} - -static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_contents) -{ - ImGuiContext& g = *GImGui; - ImGuiStyle& style = g.Style; - const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); - ImVec2 size_pad = window->WindowPadding * 2.0f; - ImVec2 size_desired = size_contents + size_pad + ImVec2(0.0f, decoration_up_height); - if (window->Flags & ImGuiWindowFlags_Tooltip) - { - // Tooltip always resize - return size_desired; - } - else - { - // Maximum window size is determined by the viewport size or monitor size - const bool is_popup = (window->Flags & ImGuiWindowFlags_Popup) != 0; - const bool is_menu = (window->Flags & ImGuiWindowFlags_ChildMenu) != 0; - ImVec2 size_min = style.WindowMinSize; - if (is_popup || is_menu) // Popups and menus bypass style.WindowMinSize by default, but we give then a non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups) - size_min = ImMin(size_min, ImVec2(4.0f, 4.0f)); - - // FIXME-VIEWPORT-WORKAREA: May want to use GetWorkSize() instead of Size depending on the type of windows? - ImVec2 avail_size = ImGui::GetMainViewport()->Size; - ImVec2 size_auto_fit = ImClamp(size_desired, size_min, ImMax(size_min, avail_size - style.DisplaySafeAreaPadding * 2.0f)); - - // When the window cannot fit all contents (either because of constraints, either because screen is too small), - // we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding. - ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit); - bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - 0.0f < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar); - bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_up_height < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar); - if (will_have_scrollbar_x) - size_auto_fit.y += style.ScrollbarSize; - if (will_have_scrollbar_y) - size_auto_fit.x += style.ScrollbarSize; - return size_auto_fit; - } -} - -ImVec2 ImGui::CalcWindowNextAutoFitSize(ImGuiWindow* window) -{ - ImVec2 size_contents_current; - ImVec2 size_contents_ideal; - CalcWindowContentSizes(window, &size_contents_current, &size_contents_ideal); - ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, size_contents_ideal); - ImVec2 size_final = CalcWindowSizeAfterConstraint(window, size_auto_fit); - return size_final; -} - -static ImGuiCol GetWindowBgColorIdx(ImGuiWindow* window) -{ - if (window->Flags & (ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) - return ImGuiCol_PopupBg; - if (window->Flags & ImGuiWindowFlags_ChildWindow) - return ImGuiCol_ChildBg; - return ImGuiCol_WindowBg; -} - -static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& corner_target, const ImVec2& corner_norm, ImVec2* out_pos, ImVec2* out_size) -{ - ImVec2 pos_min = ImLerp(corner_target, window->Pos, corner_norm); // Expected window upper-left - ImVec2 pos_max = ImLerp(window->Pos + window->Size, corner_target, corner_norm); // Expected window lower-right - ImVec2 size_expected = pos_max - pos_min; - ImVec2 size_constrained = CalcWindowSizeAfterConstraint(window, size_expected); - *out_pos = pos_min; - if (corner_norm.x == 0.0f) - out_pos->x -= (size_constrained.x - size_expected.x); - if (corner_norm.y == 0.0f) - out_pos->y -= (size_constrained.y - size_expected.y); - *out_size = size_constrained; -} - -// Data for resizing from corner -struct ImGuiResizeGripDef -{ - ImVec2 CornerPosN; - ImVec2 InnerDir; - int AngleMin12, AngleMax12; -}; -static const ImGuiResizeGripDef resize_grip_def[4] = -{ - { ImVec2(1, 1), ImVec2(-1, -1), 0, 3 }, // Lower-right - { ImVec2(0, 1), ImVec2(+1, -1), 3, 6 }, // Lower-left - { ImVec2(0, 0), ImVec2(+1, +1), 6, 9 }, // Upper-left (Unused) - { ImVec2(1, 0), ImVec2(-1, +1), 9, 12 } // Upper-right (Unused) -}; - -// Data for resizing from borders -struct ImGuiResizeBorderDef -{ - ImVec2 InnerDir; - ImVec2 SegmentN1, SegmentN2; - float OuterAngle; -}; -static const ImGuiResizeBorderDef resize_border_def[4] = -{ - { ImVec2(+1, 0), ImVec2(0, 1), ImVec2(0, 0), IM_PI * 1.00f }, // Left - { ImVec2(-1, 0), ImVec2(1, 0), ImVec2(1, 1), IM_PI * 0.00f }, // Right - { ImVec2(0, +1), ImVec2(0, 0), ImVec2(1, 0), IM_PI * 1.50f }, // Up - { ImVec2(0, -1), ImVec2(1, 1), ImVec2(0, 1), IM_PI * 0.50f } // Down -}; - -static ImRect GetResizeBorderRect(ImGuiWindow* window, int border_n, float perp_padding, float thickness) -{ - ImRect rect = window->Rect(); - if (thickness == 0.0f) - rect.Max -= ImVec2(1, 1); - if (border_n == ImGuiDir_Left) { return ImRect(rect.Min.x - thickness, rect.Min.y + perp_padding, rect.Min.x + thickness, rect.Max.y - perp_padding); } - if (border_n == ImGuiDir_Right) { return ImRect(rect.Max.x - thickness, rect.Min.y + perp_padding, rect.Max.x + thickness, rect.Max.y - perp_padding); } - if (border_n == ImGuiDir_Up) { return ImRect(rect.Min.x + perp_padding, rect.Min.y - thickness, rect.Max.x - perp_padding, rect.Min.y + thickness); } - if (border_n == ImGuiDir_Down) { return ImRect(rect.Min.x + perp_padding, rect.Max.y - thickness, rect.Max.x - perp_padding, rect.Max.y + thickness); } - IM_ASSERT(0); - return ImRect(); -} - -// 0..3: corners (Lower-right, Lower-left, Unused, Unused) -ImGuiID ImGui::GetWindowResizeCornerID(ImGuiWindow* window, int n) -{ - IM_ASSERT(n >= 0 && n < 4); - ImGuiID id = window->ID; - id = ImHashStr("#RESIZE", 0, id); - id = ImHashData(&n, sizeof(int), id); - return id; -} - -// Borders (Left, Right, Up, Down) -ImGuiID ImGui::GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir) -{ - IM_ASSERT(dir >= 0 && dir < 4); - int n = (int)dir + 4; - ImGuiID id = window->ID; - id = ImHashStr("#RESIZE", 0, id); - id = ImHashData(&n, sizeof(int), id); - return id; -} - -// Handle resize for: Resize Grips, Borders, Gamepad -// Return true when using auto-fit (double click on resize grip) -static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect) -{ - ImGuiContext& g = *GImGui; - ImGuiWindowFlags flags = window->Flags; - - if ((flags & ImGuiWindowFlags_NoResize) || (flags & ImGuiWindowFlags_AlwaysAutoResize) || window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) - return false; - if (window->WasActive == false) // Early out to avoid running this code for e.g. an hidden implicit/fallback Debug window. - return false; - - bool ret_auto_fit = false; - const int resize_border_count = g.IO.ConfigWindowsResizeFromEdges ? 4 : 0; - const float grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); - const float grip_hover_inner_size = IM_FLOOR(grip_draw_size * 0.75f); - const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_HOVER_PADDING : 0.0f; - - ImVec2 pos_target(FLT_MAX, FLT_MAX); - ImVec2 size_target(FLT_MAX, FLT_MAX); - - // Resize grips and borders are on layer 1 - window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; - - // Manual resize grips - PushID("#RESIZE"); - for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) - { - const ImGuiResizeGripDef& def = resize_grip_def[resize_grip_n]; - const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, def.CornerPosN); - - // Using the FlattenChilds button flag we make the resize button accessible even if we are hovering over a child window - bool hovered, held; - ImRect resize_rect(corner - def.InnerDir * grip_hover_outer_size, corner + def.InnerDir * grip_hover_inner_size); - if (resize_rect.Min.x > resize_rect.Max.x) ImSwap(resize_rect.Min.x, resize_rect.Max.x); - if (resize_rect.Min.y > resize_rect.Max.y) ImSwap(resize_rect.Min.y, resize_rect.Max.y); - ImGuiID resize_grip_id = window->GetID(resize_grip_n); // == GetWindowResizeCornerID() - KeepAliveID(resize_grip_id); - ButtonBehavior(resize_rect, resize_grip_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); - //GetForegroundDrawList(window)->AddRect(resize_rect.Min, resize_rect.Max, IM_COL32(255, 255, 0, 255)); - if (hovered || held) - g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE; - - if (held && g.IO.MouseClickedCount[0] == 2 && resize_grip_n == 0) - { - // Manual auto-fit when double-clicking - size_target = CalcWindowSizeAfterConstraint(window, size_auto_fit); - ret_auto_fit = true; - ClearActiveID(); - } - else if (held) - { - // Resize from any of the four corners - // We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position - ImVec2 clamp_min = ImVec2(def.CornerPosN.x == 1.0f ? visibility_rect.Min.x : -FLT_MAX, def.CornerPosN.y == 1.0f ? visibility_rect.Min.y : -FLT_MAX); - ImVec2 clamp_max = ImVec2(def.CornerPosN.x == 0.0f ? visibility_rect.Max.x : +FLT_MAX, def.CornerPosN.y == 0.0f ? visibility_rect.Max.y : +FLT_MAX); - ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + ImLerp(def.InnerDir * grip_hover_outer_size, def.InnerDir * -grip_hover_inner_size, def.CornerPosN); // Corner of the window corresponding to our corner grip - corner_target = ImClamp(corner_target, clamp_min, clamp_max); - CalcResizePosSizeFromAnyCorner(window, corner_target, def.CornerPosN, &pos_target, &size_target); - } - - // Only lower-left grip is visible before hovering/activating - if (resize_grip_n == 0 || held || hovered) - resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip); - } - for (int border_n = 0; border_n < resize_border_count; border_n++) - { - const ImGuiResizeBorderDef& def = resize_border_def[border_n]; - const ImGuiAxis axis = (border_n == ImGuiDir_Left || border_n == ImGuiDir_Right) ? ImGuiAxis_X : ImGuiAxis_Y; - - bool hovered, held; - ImRect border_rect = GetResizeBorderRect(window, border_n, grip_hover_inner_size, WINDOWS_HOVER_PADDING); - ImGuiID border_id = window->GetID(border_n + 4); // == GetWindowResizeBorderID() - KeepAliveID(border_id); - ButtonBehavior(border_rect, border_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); - //GetForegroundDrawLists(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255)); - if ((hovered && g.HoveredIdTimer > WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) || held) - { - g.MouseCursor = (axis == ImGuiAxis_X) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS; - if (held) - *border_held = border_n; - } - if (held) - { - ImVec2 clamp_min(border_n == ImGuiDir_Right ? visibility_rect.Min.x : -FLT_MAX, border_n == ImGuiDir_Down ? visibility_rect.Min.y : -FLT_MAX); - ImVec2 clamp_max(border_n == ImGuiDir_Left ? visibility_rect.Max.x : +FLT_MAX, border_n == ImGuiDir_Up ? visibility_rect.Max.y : +FLT_MAX); - ImVec2 border_target = window->Pos; - border_target[axis] = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + WINDOWS_HOVER_PADDING; - border_target = ImClamp(border_target, clamp_min, clamp_max); - CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target); - } - } - PopID(); - - // Restore nav layer - window->DC.NavLayerCurrent = ImGuiNavLayer_Main; - - // Navigation resize (keyboard/gamepad) - // FIXME: This cannot be moved to NavUpdateWindowing() because CalcWindowSizeAfterConstraint() need to callback into user. - // Not even sure the callback works here. - if (g.NavWindowingTarget && g.NavWindowingTarget->RootWindow == window) - { - ImVec2 nav_resize_dir; - if (g.NavInputSource == ImGuiInputSource_Keyboard && g.IO.KeyShift) - nav_resize_dir = GetKeyVector2d(ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow); - if (g.NavInputSource == ImGuiInputSource_Gamepad) - nav_resize_dir = GetKeyVector2d(ImGuiKey_GamepadDpadLeft, ImGuiKey_GamepadDpadRight, ImGuiKey_GamepadDpadUp, ImGuiKey_GamepadDpadDown); - if (nav_resize_dir.x != 0.0f || nav_resize_dir.y != 0.0f) - { - const float NAV_RESIZE_SPEED = 600.0f; - const float resize_step = NAV_RESIZE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y); - g.NavWindowingAccumDeltaSize += nav_resize_dir * resize_step; - g.NavWindowingAccumDeltaSize = ImMax(g.NavWindowingAccumDeltaSize, visibility_rect.Min - window->Pos - window->Size); // We need Pos+Size >= visibility_rect.Min, so Size >= visibility_rect.Min - Pos, so size_delta >= visibility_rect.Min - window->Pos - window->Size - g.NavWindowingToggleLayer = false; - g.NavDisableMouseHover = true; - resize_grip_col[0] = GetColorU32(ImGuiCol_ResizeGripActive); - ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaSize); - if (accum_floored.x != 0.0f || accum_floored.y != 0.0f) - { - // FIXME-NAV: Should store and accumulate into a separate size buffer to handle sizing constraints properly, right now a constraint will make us stuck. - size_target = CalcWindowSizeAfterConstraint(window, window->SizeFull + accum_floored); - g.NavWindowingAccumDeltaSize -= accum_floored; - } - } - } - - // Apply back modified position/size to window - if (size_target.x != FLT_MAX) - { - window->SizeFull = size_target; - MarkIniSettingsDirty(window); - } - if (pos_target.x != FLT_MAX) - { - window->Pos = ImFloor(pos_target); - MarkIniSettingsDirty(window); - } - - window->Size = window->SizeFull; - return ret_auto_fit; -} - -static inline void ClampWindowRect(ImGuiWindow* window, const ImRect& visibility_rect) -{ - ImGuiContext& g = *GImGui; - ImVec2 size_for_clamping = window->Size; - if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) - size_for_clamping.y = window->TitleBarHeight(); - window->Pos = ImClamp(window->Pos, visibility_rect.Min - size_for_clamping, visibility_rect.Max); -} - -static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - float rounding = window->WindowRounding; - float border_size = window->WindowBorderSize; - if (border_size > 0.0f && !(window->Flags & ImGuiWindowFlags_NoBackground)) - window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); - - int border_held = window->ResizeBorderHeld; - if (border_held != -1) - { - const ImGuiResizeBorderDef& def = resize_border_def[border_held]; - ImRect border_r = GetResizeBorderRect(window, border_held, rounding, 0.0f); - window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle); - window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f); - window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), 0, ImMax(2.0f, border_size)); // Thicker than usual - } - if (g.Style.FrameBorderSize > 0 && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) - { - float y = window->Pos.y + window->TitleBarHeight() - 1; - window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), GetColorU32(ImGuiCol_Border), g.Style.FrameBorderSize); - } -} - -// Draw background and borders -// Draw and handle scrollbars -void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size) -{ - ImGuiContext& g = *GImGui; - ImGuiStyle& style = g.Style; - ImGuiWindowFlags flags = window->Flags; - - // Ensure that ScrollBar doesn't read last frame's SkipItems - IM_ASSERT(window->BeginCount == 0); - window->SkipItems = false; - - // Draw window + handle manual resize - // As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame. - const float window_rounding = window->WindowRounding; - const float window_border_size = window->WindowBorderSize; - if (window->Collapsed) - { - // Title bar only - float backup_border_size = style.FrameBorderSize; - g.Style.FrameBorderSize = window->WindowBorderSize; - ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed); - RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding); - g.Style.FrameBorderSize = backup_border_size; - } - else - { - // Window background - if (!(flags & ImGuiWindowFlags_NoBackground)) - { - ImU32 bg_col = GetColorU32(GetWindowBgColorIdx(window)); - bool override_alpha = false; - float alpha = 1.0f; - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasBgAlpha) - { - alpha = g.NextWindowData.BgAlphaVal; - override_alpha = true; - } - if (override_alpha) - bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT); - window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? 0 : ImDrawFlags_RoundCornersBottom); - } - - // Title bar - if (!(flags & ImGuiWindowFlags_NoTitleBar)) - { - ImU32 title_bar_col = GetColorU32(title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg); - window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawFlags_RoundCornersTop); - } - - // Menu bar - if (flags & ImGuiWindowFlags_MenuBar) - { - ImRect menu_bar_rect = window->MenuBarRect(); - menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them. - window->DrawList->AddRectFilled(menu_bar_rect.Min + ImVec2(window_border_size, 0), menu_bar_rect.Max - ImVec2(window_border_size, 0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawFlags_RoundCornersTop); - if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y) - window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize); - } - - // Scrollbars - if (window->ScrollbarX) - Scrollbar(ImGuiAxis_X); - if (window->ScrollbarY) - Scrollbar(ImGuiAxis_Y); - - // Render resize grips (after their input handling so we don't have a frame of latency) - if (!(flags & ImGuiWindowFlags_NoResize)) - { - for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) - { - const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n]; - const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN); - window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, resize_grip_draw_size) : ImVec2(resize_grip_draw_size, window_border_size))); - window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_grip_draw_size, window_border_size) : ImVec2(window_border_size, resize_grip_draw_size))); - window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12); - window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]); - } - } - - // Borders - RenderWindowOuterBorders(window); - } -} - -// Render title text, collapse button, close button -void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open) -{ - ImGuiContext& g = *GImGui; - ImGuiStyle& style = g.Style; - ImGuiWindowFlags flags = window->Flags; - - const bool has_close_button = (p_open != NULL); - const bool has_collapse_button = !(flags & ImGuiWindowFlags_NoCollapse) && (style.WindowMenuButtonPosition != ImGuiDir_None); - - // Close & Collapse button are on the Menu NavLayer and don't default focus (unless there's nothing else on that layer) - // FIXME-NAV: Might want (or not?) to set the equivalent of ImGuiButtonFlags_NoNavFocus so that mouse clicks on standard title bar items don't necessarily set nav/keyboard ref? - const ImGuiItemFlags item_flags_backup = g.CurrentItemFlags; - g.CurrentItemFlags |= ImGuiItemFlags_NoNavDefaultFocus; - window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; - - // Layout buttons - // FIXME: Would be nice to generalize the subtleties expressed here into reusable code. - float pad_l = style.FramePadding.x; - float pad_r = style.FramePadding.x; - float button_sz = g.FontSize; - ImVec2 close_button_pos; - ImVec2 collapse_button_pos; - if (has_close_button) - { - pad_r += button_sz; - close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); - } - if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Right) - { - pad_r += button_sz; - collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); - } - if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Left) - { - collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l - style.FramePadding.x, title_bar_rect.Min.y); - pad_l += button_sz; - } - - // Collapse button (submitting first so it gets priority when choosing a navigation init fallback) - if (has_collapse_button) - if (CollapseButton(window->GetID("#COLLAPSE"), collapse_button_pos)) - window->WantCollapseToggle = true; // Defer actual collapsing to next frame as we are too far in the Begin() function - - // Close button - if (has_close_button) - if (CloseButton(window->GetID("#CLOSE"), close_button_pos)) - *p_open = false; - - window->DC.NavLayerCurrent = ImGuiNavLayer_Main; - g.CurrentItemFlags = item_flags_backup; - - // Title bar text (with: horizontal alignment, avoiding collapse/close button, optional "unsaved document" marker) - // FIXME: Refactor text alignment facilities along with RenderText helpers, this is WAY too much messy code.. - const float marker_size_x = (flags & ImGuiWindowFlags_UnsavedDocument) ? button_sz * 0.80f : 0.0f; - const ImVec2 text_size = CalcTextSize(name, NULL, true) + ImVec2(marker_size_x, 0.0f); - - // As a nice touch we try to ensure that centered title text doesn't get affected by visibility of Close/Collapse button, - // while uncentered title text will still reach edges correctly. - if (pad_l > style.FramePadding.x) - pad_l += g.Style.ItemInnerSpacing.x; - if (pad_r > style.FramePadding.x) - pad_r += g.Style.ItemInnerSpacing.x; - if (style.WindowTitleAlign.x > 0.0f && style.WindowTitleAlign.x < 1.0f) - { - float centerness = ImSaturate(1.0f - ImFabs(style.WindowTitleAlign.x - 0.5f) * 2.0f); // 0.0f on either edges, 1.0f on center - float pad_extend = ImMin(ImMax(pad_l, pad_r), title_bar_rect.GetWidth() - pad_l - pad_r - text_size.x); - pad_l = ImMax(pad_l, pad_extend * centerness); - pad_r = ImMax(pad_r, pad_extend * centerness); - } - - ImRect layout_r(title_bar_rect.Min.x + pad_l, title_bar_rect.Min.y, title_bar_rect.Max.x - pad_r, title_bar_rect.Max.y); - ImRect clip_r(layout_r.Min.x, layout_r.Min.y, ImMin(layout_r.Max.x + g.Style.ItemInnerSpacing.x, title_bar_rect.Max.x), layout_r.Max.y); - if (flags & ImGuiWindowFlags_UnsavedDocument) - { - ImVec2 marker_pos; - marker_pos.x = ImClamp(layout_r.Min.x + (layout_r.GetWidth() - text_size.x) * style.WindowTitleAlign.x + text_size.x, layout_r.Min.x, layout_r.Max.x); - marker_pos.y = (layout_r.Min.y + layout_r.Max.y) * 0.5f; - if (marker_pos.x > layout_r.Min.x) - { - RenderBullet(window->DrawList, marker_pos, GetColorU32(ImGuiCol_Text)); - clip_r.Max.x = ImMin(clip_r.Max.x, marker_pos.x - (int)(marker_size_x * 0.5f)); - } - } - //if (g.IO.KeyShift) window->DrawList->AddRect(layout_r.Min, layout_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG] - //if (g.IO.KeyCtrl) window->DrawList->AddRect(clip_r.Min, clip_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG] - RenderTextClipped(layout_r.Min, layout_r.Max, name, NULL, &text_size, style.WindowTitleAlign, &clip_r); -} - -void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window) -{ - window->ParentWindow = parent_window; - window->RootWindow = window->RootWindowPopupTree = window->RootWindowForTitleBarHighlight = window->RootWindowForNav = window; - if (parent_window && (flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Tooltip)) - window->RootWindow = parent_window->RootWindow; - if (parent_window && (flags & ImGuiWindowFlags_Popup)) - window->RootWindowPopupTree = parent_window->RootWindowPopupTree; - if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup))) - window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight; - while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened) - { - IM_ASSERT(window->RootWindowForNav->ParentWindow != NULL); - window->RootWindowForNav = window->RootWindowForNav->ParentWindow; - } -} - -// When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing) -// should be positioned behind that modal window, unless the window was created inside the modal begin-stack. -// In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent. -// - Window // FindBlockingModal() returns Modal1 -// - Window // .. returns Modal1 -// - Modal1 // .. returns Modal2 -// - Window // .. returns Modal2 -// - Window // .. returns Modal2 -// - Modal2 // .. returns Modal2 -static ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - if (g.OpenPopupStack.Size <= 0) - return NULL; - - // Find a modal that has common parent with specified window. Specified window should be positioned behind that modal. - for (int i = g.OpenPopupStack.Size - 1; i >= 0; i--) - { - ImGuiWindow* popup_window = g.OpenPopupStack.Data[i].Window; - if (popup_window == NULL || !(popup_window->Flags & ImGuiWindowFlags_Modal)) - continue; - if (!popup_window->Active && !popup_window->WasActive) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows. - continue; - if (IsWindowWithinBeginStackOf(window, popup_window)) // Window is rendered over last modal, no render order change needed. - break; - for (ImGuiWindow* parent = popup_window->ParentWindowInBeginStack->RootWindow; parent != NULL; parent = parent->ParentWindowInBeginStack->RootWindow) - if (IsWindowWithinBeginStackOf(window, parent)) - return popup_window; // Place window above its begin stack parent. - } - return NULL; -} - -// Push a new Dear ImGui window to add widgets to. -// - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair. -// - Begin/End can be called multiple times during the frame with the same window name to append content. -// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file). -// You can use the "##" or "###" markers to use the same label with different id, or same id with different label. See documentation at the top of this file. -// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned. -// - Passing 'bool* p_open' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed. -bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - IM_ASSERT(name != NULL && name[0] != '\0'); // Window name required - IM_ASSERT(g.WithinFrameScope); // Forgot to call ImGui::NewFrame() - IM_ASSERT(g.FrameCountEnded != g.FrameCount); // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet - - // Find or create - ImGuiWindow* window = FindWindowByName(name); - const bool window_just_created = (window == NULL); - if (window_just_created) - window = CreateNewWindow(name, flags); - else - UpdateWindowInFocusOrderList(window, window_just_created, flags); - - // Automatically disable manual moving/resizing when NoInputs is set - if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs) - flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize; - - if (flags & ImGuiWindowFlags_NavFlattened) - IM_ASSERT(flags & ImGuiWindowFlags_ChildWindow); - - const int current_frame = g.FrameCount; - const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame); - window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow); - - // Update the Appearing flag - bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on - if (flags & ImGuiWindowFlags_Popup) - { - ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; - window_just_activated_by_user |= (window->PopupId != popup_ref.PopupId); // We recycle popups so treat window as activated if popup id changed - window_just_activated_by_user |= (window != popup_ref.Window); - } - window->Appearing = window_just_activated_by_user; - if (window->Appearing) - SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, true); - - // Update Flags, LastFrameActive, BeginOrderXXX fields - if (first_begin_of_the_frame) - { - window->Flags = (ImGuiWindowFlags)flags; - window->LastFrameActive = current_frame; - window->LastTimeActive = (float)g.Time; - window->BeginOrderWithinParent = 0; - window->BeginOrderWithinContext = (short)(g.WindowsActiveCount++); - } - else - { - flags = window->Flags; - } - - // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack - ImGuiWindow* parent_window_in_stack = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back().Window; - ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow; - IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow)); - - // We allow window memory to be compacted so recreate the base stack when needed. - if (window->IDStack.Size == 0) - window->IDStack.push_back(window->ID); - - // Add to stack - // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow() - g.CurrentWindow = window; - ImGuiWindowStackData window_stack_data; - window_stack_data.Window = window; - window_stack_data.ParentLastItemDataBackup = g.LastItemData; - window_stack_data.StackSizesOnBegin.SetToCurrentState(); - g.CurrentWindowStack.push_back(window_stack_data); - g.CurrentWindow = NULL; - if (flags & ImGuiWindowFlags_ChildMenu) - g.BeginMenuCount++; - - if (flags & ImGuiWindowFlags_Popup) - { - ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; - popup_ref.Window = window; - popup_ref.ParentNavLayer = parent_window_in_stack->DC.NavLayerCurrent; - g.BeginPopupStack.push_back(popup_ref); - window->PopupId = popup_ref.PopupId; - } - - // Update ->RootWindow and others pointers (before any possible call to FocusWindow) - if (first_begin_of_the_frame) - { - UpdateWindowParentAndRootLinks(window, flags, parent_window); - window->ParentWindowInBeginStack = parent_window_in_stack; - } - - // Process SetNextWindow***() calls - // (FIXME: Consider splitting the HasXXX flags into X/Y components - bool window_pos_set_by_api = false; - bool window_size_x_set_by_api = false, window_size_y_set_by_api = false; - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) - { - window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.NextWindowData.PosCond) != 0; - if (window_pos_set_by_api && ImLengthSqr(g.NextWindowData.PosPivotVal) > 0.00001f) - { - // May be processed on the next frame if this is our first frame and we are measuring size - // FIXME: Look into removing the branch so everything can go through this same code path for consistency. - window->SetWindowPosVal = g.NextWindowData.PosVal; - window->SetWindowPosPivot = g.NextWindowData.PosPivotVal; - window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); - } - else - { - SetWindowPos(window, g.NextWindowData.PosVal, g.NextWindowData.PosCond); - } - } - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize) - { - window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.x > 0.0f); - window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.y > 0.0f); - SetWindowSize(window, g.NextWindowData.SizeVal, g.NextWindowData.SizeCond); - } - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasScroll) - { - if (g.NextWindowData.ScrollVal.x >= 0.0f) - { - window->ScrollTarget.x = g.NextWindowData.ScrollVal.x; - window->ScrollTargetCenterRatio.x = 0.0f; - } - if (g.NextWindowData.ScrollVal.y >= 0.0f) - { - window->ScrollTarget.y = g.NextWindowData.ScrollVal.y; - window->ScrollTargetCenterRatio.y = 0.0f; - } - } - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasContentSize) - window->ContentSizeExplicit = g.NextWindowData.ContentSizeVal; - else if (first_begin_of_the_frame) - window->ContentSizeExplicit = ImVec2(0.0f, 0.0f); - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasCollapsed) - SetWindowCollapsed(window, g.NextWindowData.CollapsedVal, g.NextWindowData.CollapsedCond); - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasFocus) - FocusWindow(window); - if (window->Appearing) - SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false); - - // When reusing window again multiple times a frame, just append content (don't need to setup again) - if (first_begin_of_the_frame) - { - // Initialize - const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345) - const bool window_just_appearing_after_hidden_for_resize = (window->HiddenFramesCannotSkipItems > 0); - window->Active = true; - window->HasCloseButton = (p_open != NULL); - window->ClipRect = ImVec4(-FLT_MAX, -FLT_MAX, +FLT_MAX, +FLT_MAX); - window->IDStack.resize(1); - window->DrawList->_ResetForNewFrame(); - window->DC.CurrentTableIdx = -1; - - // Restore buffer capacity when woken from a compacted state, to avoid - if (window->MemoryCompacted) - GcAwakeTransientWindowBuffers(window); - - // Update stored window name when it changes (which can _only_ happen with the "###" operator, so the ID would stay unchanged). - // The title bar always display the 'name' parameter, so we only update the string storage if it needs to be visible to the end-user elsewhere. - bool window_title_visible_elsewhere = false; - if (g.NavWindowingListWindow != NULL && (window->Flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB - window_title_visible_elsewhere = true; - if (window_title_visible_elsewhere && !window_just_created && strcmp(name, window->Name) != 0) - { - size_t buf_len = (size_t)window->NameBufLen; - window->Name = ImStrdupcpy(window->Name, &buf_len, name); - window->NameBufLen = (int)buf_len; - } - - // UPDATE CONTENTS SIZE, UPDATE HIDDEN STATUS - - // Update contents size from last frame for auto-fitting (or use explicit size) - CalcWindowContentSizes(window, &window->ContentSize, &window->ContentSizeIdeal); - if (window->HiddenFramesCanSkipItems > 0) - window->HiddenFramesCanSkipItems--; - if (window->HiddenFramesCannotSkipItems > 0) - window->HiddenFramesCannotSkipItems--; - if (window->HiddenFramesForRenderOnly > 0) - window->HiddenFramesForRenderOnly--; - - // Hide new windows for one frame until they calculate their size - if (window_just_created && (!window_size_x_set_by_api || !window_size_y_set_by_api)) - window->HiddenFramesCannotSkipItems = 1; - - // Hide popup/tooltip window when re-opening while we measure size (because we recycle the windows) - // We reset Size/ContentSize for reappearing popups/tooltips early in this function, so further code won't be tempted to use the old size. - if (window_just_activated_by_user && (flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) != 0) - { - window->HiddenFramesCannotSkipItems = 1; - if (flags & ImGuiWindowFlags_AlwaysAutoResize) - { - if (!window_size_x_set_by_api) - window->Size.x = window->SizeFull.x = 0.f; - if (!window_size_y_set_by_api) - window->Size.y = window->SizeFull.y = 0.f; - window->ContentSize = window->ContentSizeIdeal = ImVec2(0.f, 0.f); - } - } - - // SELECT VIEWPORT - // FIXME-VIEWPORT: In the docking/viewport branch, this is the point where we select the current viewport (which may affect the style) - - ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); - SetWindowViewport(window, viewport); - SetCurrentWindow(window); - - // LOCK BORDER SIZE AND PADDING FOR THE FRAME (so that altering them doesn't cause inconsistencies) - - if (flags & ImGuiWindowFlags_ChildWindow) - window->WindowBorderSize = style.ChildBorderSize; - else - window->WindowBorderSize = ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize; - window->WindowPadding = style.WindowPadding; - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f) - window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f); - - // Lock menu offset so size calculation can use it as menu-bar windows need a minimum size. - window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x); - window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y; - - // Collapse window by double-clicking on title bar - // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing - if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse)) - { - // We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed), so verify that we don't have items over the title bar. - ImRect title_bar_rect = window->TitleBarRect(); - if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseClickedCount[0] == 2) - window->WantCollapseToggle = true; - if (window->WantCollapseToggle) - { - window->Collapsed = !window->Collapsed; - MarkIniSettingsDirty(window); - } - } - else - { - window->Collapsed = false; - } - window->WantCollapseToggle = false; - - // SIZE - - // Calculate auto-fit size, handle automatic resize - const ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, window->ContentSizeIdeal); - bool use_current_size_for_scrollbar_x = window_just_created; - bool use_current_size_for_scrollbar_y = window_just_created; - if ((flags & ImGuiWindowFlags_AlwaysAutoResize) && !window->Collapsed) - { - // Using SetNextWindowSize() overrides ImGuiWindowFlags_AlwaysAutoResize, so it can be used on tooltips/popups, etc. - if (!window_size_x_set_by_api) - { - window->SizeFull.x = size_auto_fit.x; - use_current_size_for_scrollbar_x = true; - } - if (!window_size_y_set_by_api) - { - window->SizeFull.y = size_auto_fit.y; - use_current_size_for_scrollbar_y = true; - } - } - else if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) - { - // Auto-fit may only grow window during the first few frames - // We still process initial auto-fit on collapsed windows to get a window width, but otherwise don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed. - if (!window_size_x_set_by_api && window->AutoFitFramesX > 0) - { - window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x; - use_current_size_for_scrollbar_x = true; - } - if (!window_size_y_set_by_api && window->AutoFitFramesY > 0) - { - window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y; - use_current_size_for_scrollbar_y = true; - } - if (!window->Collapsed) - MarkIniSettingsDirty(window); - } - - // Apply minimum/maximum window size constraints and final size - window->SizeFull = CalcWindowSizeAfterConstraint(window, window->SizeFull); - window->Size = window->Collapsed && !(flags & ImGuiWindowFlags_ChildWindow) ? window->TitleBarRect().GetSize() : window->SizeFull; - - // Decoration size - const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); - - // POSITION - - // Popup latch its initial position, will position itself when it appears next frame - if (window_just_activated_by_user) - { - window->AutoPosLastDirection = ImGuiDir_None; - if ((flags & ImGuiWindowFlags_Popup) != 0 && !(flags & ImGuiWindowFlags_Modal) && !window_pos_set_by_api) // FIXME: BeginPopup() could use SetNextWindowPos() - window->Pos = g.BeginPopupStack.back().OpenPopupPos; - } - - // Position child window - if (flags & ImGuiWindowFlags_ChildWindow) - { - IM_ASSERT(parent_window && parent_window->Active); - window->BeginOrderWithinParent = (short)parent_window->DC.ChildWindows.Size; - parent_window->DC.ChildWindows.push_back(window); - if (!(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api && !window_is_child_tooltip) - window->Pos = parent_window->DC.CursorPos; - } - - const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFramesCannotSkipItems == 0); - if (window_pos_with_pivot) - SetWindowPos(window, window->SetWindowPosVal - window->Size * window->SetWindowPosPivot, 0); // Position given a pivot (e.g. for centering) - else if ((flags & ImGuiWindowFlags_ChildMenu) != 0) - window->Pos = FindBestWindowPosForPopup(window); - else if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api && window_just_appearing_after_hidden_for_resize) - window->Pos = FindBestWindowPosForPopup(window); - else if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api && !window_is_child_tooltip) - window->Pos = FindBestWindowPosForPopup(window); - - // Calculate the range of allowed position for that window (to be movable and visible past safe area padding) - // When clamping to stay visible, we will enforce that window->Pos stays inside of visibility_rect. - ImRect viewport_rect(viewport->GetMainRect()); - ImRect viewport_work_rect(viewport->GetWorkRect()); - ImVec2 visibility_padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding); - ImRect visibility_rect(viewport_work_rect.Min + visibility_padding, viewport_work_rect.Max - visibility_padding); - - // Clamp position/size so window stays visible within its viewport or monitor - // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing. - if (!window_pos_set_by_api && !(flags & ImGuiWindowFlags_ChildWindow) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) - if (viewport_rect.GetWidth() > 0.0f && viewport_rect.GetHeight() > 0.0f) - ClampWindowRect(window, visibility_rect); - window->Pos = ImFloor(window->Pos); - - // Lock window rounding for the frame (so that altering them doesn't cause inconsistencies) - // Large values tend to lead to variety of artifacts and are not recommended. - window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding; - - // For windows with title bar or menu bar, we clamp to FrameHeight(FontSize + FramePadding.y * 2.0f) to completely hide artifacts. - //if ((window->Flags & ImGuiWindowFlags_MenuBar) || !(window->Flags & ImGuiWindowFlags_NoTitleBar)) - // window->WindowRounding = ImMin(window->WindowRounding, g.FontSize + style.FramePadding.y * 2.0f); - - // Apply window focus (new and reactivated windows are moved to front) - bool want_focus = false; - if (window_just_activated_by_user && !(flags & ImGuiWindowFlags_NoFocusOnAppearing)) - { - if (flags & ImGuiWindowFlags_Popup) - want_focus = true; - else if ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) == 0) - want_focus = true; - - ImGuiWindow* modal = GetTopMostPopupModal(); - if (modal != NULL && !IsWindowWithinBeginStackOf(window, modal)) - { - // Avoid focusing a window that is created outside of active modal. This will prevent active modal from being closed. - // Since window is not focused it would reappear at the same display position like the last time it was visible. - // In case of completely new windows it would go to the top (over current modal), but input to such window would still be blocked by modal. - // Position window behind a modal that is not a begin-parent of this window. - want_focus = false; - if (window == window->RootWindow) - { - ImGuiWindow* blocking_modal = FindBlockingModal(window); - IM_ASSERT(blocking_modal != NULL); - BringWindowToDisplayBehind(window, blocking_modal); - } - } - } - - // [Test Engine] Register whole window in the item system -#ifdef IMGUI_ENABLE_TEST_ENGINE - if (g.TestEngineHookItems) - { - IM_ASSERT(window->IDStack.Size == 1); - window->IDStack.Size = 0; - IMGUI_TEST_ENGINE_ITEM_ADD(window->Rect(), window->ID); - IMGUI_TEST_ENGINE_ITEM_INFO(window->ID, window->Name, (g.HoveredWindow == window) ? ImGuiItemStatusFlags_HoveredRect : 0); - window->IDStack.Size = 1; - } -#endif - - // Handle manual resize: Resize Grips, Borders, Gamepad - int border_held = -1; - ImU32 resize_grip_col[4] = {}; - const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it. - const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); - if (!window->Collapsed) - if (UpdateWindowManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect)) - use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true; - window->ResizeBorderHeld = (signed char)border_held; - - // SCROLLBAR VISIBILITY - - // Update scrollbar visibility (based on the Size that was effective during last frame or the auto-resized Size). - if (!window->Collapsed) - { - // When reading the current size we need to read it after size constraints have been applied. - // When we use InnerRect here we are intentionally reading last frame size, same for ScrollbarSizes values before we set them again. - ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - decoration_up_height); - ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + window->ScrollbarSizes; - ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f; - float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x; - float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y; - //bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons? - window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar)); - window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); - if (window->ScrollbarX && !window->ScrollbarY) - window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar); - window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); - } - - // UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING) - // Update various regions. Variables they depends on should be set above in this function. - // We set this up after processing the resize grip so that our rectangles doesn't lag by a frame. - - // Outer rectangle - // Not affected by window border size. Used by: - // - FindHoveredWindow() (w/ extra padding when border resize is enabled) - // - Begin() initial clipping rect for drawing window background and borders. - // - Begin() clipping whole child - const ImRect host_rect = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) ? parent_window->ClipRect : viewport_rect; - const ImRect outer_rect = window->Rect(); - const ImRect title_bar_rect = window->TitleBarRect(); - window->OuterRectClipped = outer_rect; - window->OuterRectClipped.ClipWith(host_rect); - - // Inner rectangle - // Not affected by window border size. Used by: - // - InnerClipRect - // - ScrollToRectEx() - // - NavUpdatePageUpPageDown() - // - Scrollbar() - window->InnerRect.Min.x = window->Pos.x; - window->InnerRect.Min.y = window->Pos.y + decoration_up_height; - window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x; - window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y; - - // Inner clipping rectangle. - // Will extend a little bit outside the normal work region. - // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. - // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. - // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. - // Affected by window/frame border size. Used by: - // - Begin() initial clip rect - float top_border_size = (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); - window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); - window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size); - window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); - window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize); - window->InnerClipRect.ClipWithFull(host_rect); - - // Default item width. Make it proportional to window size if window manually resizes - if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize)) - window->ItemWidthDefault = ImFloor(window->Size.x * 0.65f); - else - window->ItemWidthDefault = ImFloor(g.FontSize * 16.0f); - - // SCROLLING - - // Lock down maximum scrolling - // The value of ScrollMax are ahead from ScrollbarX/ScrollbarY which is intentionally using InnerRect from previous rect in order to accommodate - // for right/bottom aligned items without creating a scrollbar. - window->ScrollMax.x = ImMax(0.0f, window->ContentSize.x + window->WindowPadding.x * 2.0f - window->InnerRect.GetWidth()); - window->ScrollMax.y = ImMax(0.0f, window->ContentSize.y + window->WindowPadding.y * 2.0f - window->InnerRect.GetHeight()); - - // Apply scrolling - window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window); - window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); - - // DRAWING - - // Setup draw list and outer clipping rectangle - IM_ASSERT(window->DrawList->CmdBuffer.Size == 1 && window->DrawList->CmdBuffer[0].ElemCount == 0); - window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID); - PushClipRect(host_rect.Min, host_rect.Max, false); - - // Child windows can render their decoration (bg color, border, scrollbars, etc.) within their parent to save a draw call (since 1.71) - // When using overlapping child windows, this will break the assumption that child z-order is mapped to submission order. - // FIXME: User code may rely on explicit sorting of overlapping child window and would need to disable this somehow. Please get in contact if you are affected (github #4493) - { - bool render_decorations_in_parent = false; - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) - { - // - We test overlap with the previous child window only (testing all would end up being O(log N) not a good investment here) - // - We disable this when the parent window has zero vertices, which is a common pattern leading to laying out multiple overlapping childs - ImGuiWindow* previous_child = parent_window->DC.ChildWindows.Size >= 2 ? parent_window->DC.ChildWindows[parent_window->DC.ChildWindows.Size - 2] : NULL; - bool previous_child_overlapping = previous_child ? previous_child->Rect().Overlaps(window->Rect()) : false; - bool parent_is_empty = parent_window->DrawList->VtxBuffer.Size > 0; - if (window->DrawList->CmdBuffer.back().ElemCount == 0 && parent_is_empty && !previous_child_overlapping) - render_decorations_in_parent = true; - } - if (render_decorations_in_parent) - window->DrawList = parent_window->DrawList; - - // Handle title bar, scrollbar, resize grips and resize borders - const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow; - const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight); - RenderWindowDecorations(window, title_bar_rect, title_bar_is_highlight, resize_grip_count, resize_grip_col, resize_grip_draw_size); - - if (render_decorations_in_parent) - window->DrawList = &window->DrawListInst; - } - - // UPDATE RECTANGLES (2- THOSE AFFECTED BY SCROLLING) - - // Work rectangle. - // Affected by window padding and border size. Used by: - // - Columns() for right-most edge - // - TreeNode(), CollapsingHeader() for right-most edge - // - BeginTabBar() for right-most edge - const bool allow_scrollbar_x = !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar); - const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar); - const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x)); - const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y)); - window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize)); - window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize)); - window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x; - window->WorkRect.Max.y = window->WorkRect.Min.y + work_rect_size_y; - window->ParentWorkRect = window->WorkRect; - - // [LEGACY] Content Region - // FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. - // Used by: - // - Mouse wheel scrolling + many other things - window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x; - window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + decoration_up_height; - window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x)); - window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y)); - - // Setup drawing context - // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) - window->DC.Indent.x = 0.0f + window->WindowPadding.x - window->Scroll.x; - window->DC.GroupOffset.x = 0.0f; - window->DC.ColumnsOffset.x = 0.0f; - - // Record the loss of precision of CursorStartPos which can happen due to really large scrolling amount. - // This is used by clipper to compensate and fix the most common use case of large scroll area. Easy and cheap, next best thing compared to switching everything to double or ImU64. - double start_pos_highp_x = (double)window->Pos.x + window->WindowPadding.x - (double)window->Scroll.x + window->DC.ColumnsOffset.x; - double start_pos_highp_y = (double)window->Pos.y + window->WindowPadding.y - (double)window->Scroll.y + decoration_up_height; - window->DC.CursorStartPos = ImVec2((float)start_pos_highp_x, (float)start_pos_highp_y); - window->DC.CursorStartPosLossyness = ImVec2((float)(start_pos_highp_x - window->DC.CursorStartPos.x), (float)(start_pos_highp_y - window->DC.CursorStartPos.y)); - window->DC.CursorPos = window->DC.CursorStartPos; - window->DC.CursorPosPrevLine = window->DC.CursorPos; - window->DC.CursorMaxPos = window->DC.CursorStartPos; - window->DC.IdealMaxPos = window->DC.CursorStartPos; - window->DC.CurrLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f); - window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f; - window->DC.IsSameLine = false; - - window->DC.NavLayerCurrent = ImGuiNavLayer_Main; - window->DC.NavLayersActiveMask = window->DC.NavLayersActiveMaskNext; - window->DC.NavLayersActiveMaskNext = 0x00; - window->DC.NavHideHighlightOneFrame = false; - window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f); - - window->DC.MenuBarAppending = false; - window->DC.MenuColumns.Update(style.ItemSpacing.x, window_just_activated_by_user); - window->DC.TreeDepth = 0; - window->DC.TreeJumpToParentOnPopMask = 0x00; - window->DC.ChildWindows.resize(0); - window->DC.StateStorage = &window->StateStorage; - window->DC.CurrentColumns = NULL; - window->DC.LayoutType = ImGuiLayoutType_Vertical; - window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical; - - window->DC.ItemWidth = window->ItemWidthDefault; - window->DC.TextWrapPos = -1.0f; // disabled - window->DC.ItemWidthStack.resize(0); - window->DC.TextWrapPosStack.resize(0); - - if (window->AutoFitFramesX > 0) - window->AutoFitFramesX--; - if (window->AutoFitFramesY > 0) - window->AutoFitFramesY--; - - // Apply focus (we need to call FocusWindow() AFTER setting DC.CursorStartPos so our initial navigation reference rectangle can start around there) - if (want_focus) - { - FocusWindow(window); - NavInitWindow(window, false); // <-- this is in the way for us to be able to defer and sort reappearing FocusWindow() calls - } - - // Title bar - if (!(flags & ImGuiWindowFlags_NoTitleBar)) - RenderWindowTitleBarContents(window, ImRect(title_bar_rect.Min.x + window->WindowBorderSize, title_bar_rect.Min.y, title_bar_rect.Max.x - window->WindowBorderSize, title_bar_rect.Max.y), name, p_open); - - // Clear hit test shape every frame - window->HitTestHoleSize.x = window->HitTestHoleSize.y = 0; - - // Pressing CTRL+C while holding on a window copy its content to the clipboard - // This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope. - // Maybe we can support CTRL+C on every element? - /* - //if (g.NavWindow == window && g.ActiveId == 0) - if (g.ActiveId == window->MoveId) - if (g.IO.KeyCtrl && IsKeyPressed(ImGuiKey_C)) - LogToClipboard(); - */ - - // We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin(). - // This is useful to allow creating context menus on title bar only, etc. - SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, title_bar_rect); - - // [Test Engine] Register title bar / tab - if (!(window->Flags & ImGuiWindowFlags_NoTitleBar)) - IMGUI_TEST_ENGINE_ITEM_ADD(g.LastItemData.Rect, g.LastItemData.ID); - } - else - { - // Append - SetCurrentWindow(window); - } - - // Pull/inherit current state - window->DC.NavFocusScopeIdCurrent = (flags & ImGuiWindowFlags_ChildWindow) ? parent_window->DC.NavFocusScopeIdCurrent : window->GetID("#FOCUSSCOPE"); // Inherit from parent only // -V595 - - PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); - - // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused) - window->WriteAccessed = false; - window->BeginCount++; - g.NextWindowData.ClearFlags(); - - // Update visibility - if (first_begin_of_the_frame) - { - if (flags & ImGuiWindowFlags_ChildWindow) - { - // Child window can be out of sight and have "negative" clip windows. - // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar). - IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); - if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) // FIXME: Doesn't make sense for ChildWindow?? - { - const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); - if (!g.LogEnabled && !nav_request) - if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) - window->HiddenFramesCanSkipItems = 1; - } - - // Hide along with parent or if parent is collapsed - if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCanSkipItems > 0)) - window->HiddenFramesCanSkipItems = 1; - if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCannotSkipItems > 0)) - window->HiddenFramesCannotSkipItems = 1; - } - - // Don't render if style alpha is 0.0 at the time of Begin(). This is arbitrary and inconsistent but has been there for a long while (may remove at some point) - if (style.Alpha <= 0.0f) - window->HiddenFramesCanSkipItems = 1; - - // Update the Hidden flag - bool hidden_regular = (window->HiddenFramesCanSkipItems > 0) || (window->HiddenFramesCannotSkipItems > 0); - window->Hidden = hidden_regular || (window->HiddenFramesForRenderOnly > 0); - - // Disable inputs for requested number of frames - if (window->DisableInputsFrames > 0) - { - window->DisableInputsFrames--; - window->Flags |= ImGuiWindowFlags_NoInputs; - } - - // Update the SkipItems flag, used to early out of all items functions (no layout required) - bool skip_items = false; - if (window->Collapsed || !window->Active || hidden_regular) - if (window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && window->HiddenFramesCannotSkipItems <= 0) - skip_items = true; - window->SkipItems = skip_items; - } - - return !window->SkipItems; -} - -void ImGui::End() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Error checking: verify that user hasn't called End() too many times! - if (g.CurrentWindowStack.Size <= 1 && g.WithinFrameScopeWithImplicitWindow) - { - IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size > 1, "Calling End() too many times!"); - return; - } - IM_ASSERT(g.CurrentWindowStack.Size > 0); - - // Error checking: verify that user doesn't directly call End() on a child window. - if (window->Flags & ImGuiWindowFlags_ChildWindow) - IM_ASSERT_USER_ERROR(g.WithinEndChild, "Must call EndChild() and not End()!"); - - // Close anything that is open - if (window->DC.CurrentColumns) - EndColumns(); - PopClipRect(); // Inner window clip rectangle - - // Stop logging - if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) // FIXME: add more options for scope of logging - LogFinish(); - - // Pop from window stack - g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup; - if (window->Flags & ImGuiWindowFlags_ChildMenu) - g.BeginMenuCount--; - if (window->Flags & ImGuiWindowFlags_Popup) - g.BeginPopupStack.pop_back(); - g.CurrentWindowStack.back().StackSizesOnBegin.CompareWithCurrentState(); - g.CurrentWindowStack.pop_back(); - SetCurrentWindow(g.CurrentWindowStack.Size == 0 ? NULL : g.CurrentWindowStack.back().Window); -} - -void ImGui::BringWindowToFocusFront(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(window == window->RootWindow); - - const int cur_order = window->FocusOrder; - IM_ASSERT(g.WindowsFocusOrder[cur_order] == window); - if (g.WindowsFocusOrder.back() == window) - return; - - const int new_order = g.WindowsFocusOrder.Size - 1; - for (int n = cur_order; n < new_order; n++) - { - g.WindowsFocusOrder[n] = g.WindowsFocusOrder[n + 1]; - g.WindowsFocusOrder[n]->FocusOrder--; - IM_ASSERT(g.WindowsFocusOrder[n]->FocusOrder == n); - } - g.WindowsFocusOrder[new_order] = window; - window->FocusOrder = (short)new_order; -} - -void ImGui::BringWindowToDisplayFront(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* current_front_window = g.Windows.back(); - if (current_front_window == window || current_front_window->RootWindow == window) // Cheap early out (could be better) - return; - for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the top-most window - if (g.Windows[i] == window) - { - memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*)); - g.Windows[g.Windows.Size - 1] = window; - break; - } -} - -void ImGui::BringWindowToDisplayBack(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - if (g.Windows[0] == window) - return; - for (int i = 0; i < g.Windows.Size; i++) - if (g.Windows[i] == window) - { - memmove(&g.Windows[1], &g.Windows[0], (size_t)i * sizeof(ImGuiWindow*)); - g.Windows[0] = window; - break; - } -} - -void ImGui::BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* behind_window) -{ - IM_ASSERT(window != NULL && behind_window != NULL); - ImGuiContext& g = *GImGui; - window = window->RootWindow; - behind_window = behind_window->RootWindow; - int pos_wnd = FindWindowDisplayIndex(window); - int pos_beh = FindWindowDisplayIndex(behind_window); - if (pos_wnd < pos_beh) - { - size_t copy_bytes = (pos_beh - pos_wnd - 1) * sizeof(ImGuiWindow*); - memmove(&g.Windows.Data[pos_wnd], &g.Windows.Data[pos_wnd + 1], copy_bytes); - g.Windows[pos_beh - 1] = window; - } - else - { - size_t copy_bytes = (pos_wnd - pos_beh) * sizeof(ImGuiWindow*); - memmove(&g.Windows.Data[pos_beh + 1], &g.Windows.Data[pos_beh], copy_bytes); - g.Windows[pos_beh] = window; - } -} - -int ImGui::FindWindowDisplayIndex(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - return g.Windows.index_from_ptr(g.Windows.find(window)); -} - -// Moving window to front of display and set focus (which happens to be back of our sorted list) -void ImGui::FocusWindow(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - - if (g.NavWindow != window) - { - SetNavWindow(window); - if (window && g.NavDisableMouseHover) - g.NavMousePosDirty = true; - g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId - g.NavLayer = ImGuiNavLayer_Main; - g.NavFocusScopeId = 0; - g.NavIdIsAlive = false; - } - - // Close popups if any - ClosePopupsOverWindow(window, false); - - // Move the root window to the top of the pile - IM_ASSERT(window == NULL || window->RootWindow != NULL); - ImGuiWindow* focus_front_window = window ? window->RootWindow : NULL; // NB: In docking branch this is window->RootWindowDockStop - ImGuiWindow* display_front_window = window ? window->RootWindow : NULL; - - // Steal active widgets. Some of the cases it triggers includes: - // - Focus a window while an InputText in another window is active, if focus happens before the old InputText can run. - // - When using Nav to activate menu items (due to timing of activating on press->new window appears->losing ActiveId) - if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != focus_front_window) - if (!g.ActiveIdNoClearOnFocusLoss) - ClearActiveID(); - - // Passing NULL allow to disable keyboard focus - if (!window) - return; - - // Bring to front - BringWindowToFocusFront(focus_front_window); - if (((window->Flags | display_front_window->Flags) & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0) - BringWindowToDisplayFront(display_front_window); -} - -void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window) -{ - ImGuiContext& g = *GImGui; - int start_idx = g.WindowsFocusOrder.Size - 1; - if (under_this_window != NULL) - { - // Aim at root window behind us, if we are in a child window that's our own root (see #4640) - int offset = -1; - while (under_this_window->Flags & ImGuiWindowFlags_ChildWindow) - { - under_this_window = under_this_window->ParentWindow; - offset = 0; - } - start_idx = FindWindowFocusIndex(under_this_window) + offset; - } - for (int i = start_idx; i >= 0; i--) - { - // We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user. - ImGuiWindow* window = g.WindowsFocusOrder[i]; - IM_ASSERT(window == window->RootWindow); - if (window != ignore_window && window->WasActive) - if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) - { - ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window); - FocusWindow(focus_window); - return; - } - } - FocusWindow(NULL); -} - -// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only. -void ImGui::SetCurrentFont(ImFont* font) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(font && font->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ? - IM_ASSERT(font->Scale > 0.0f); - g.Font = font; - g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale); - g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f; - - ImFontAtlas* atlas = g.Font->ContainerAtlas; - g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel; - g.DrawListSharedData.TexUvLines = atlas->TexUvLines; - g.DrawListSharedData.Font = g.Font; - g.DrawListSharedData.FontSize = g.FontSize; -} - -void ImGui::PushFont(ImFont* font) -{ - ImGuiContext& g = *GImGui; - if (!font) - font = GetDefaultFont(); - SetCurrentFont(font); - g.FontStack.push_back(font); - g.CurrentWindow->DrawList->PushTextureID(font->ContainerAtlas->TexID); -} - -void ImGui::PopFont() -{ - ImGuiContext& g = *GImGui; - g.CurrentWindow->DrawList->PopTextureID(); - g.FontStack.pop_back(); - SetCurrentFont(g.FontStack.empty() ? GetDefaultFont() : g.FontStack.back()); -} - -void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled) -{ - ImGuiContext& g = *GImGui; - ImGuiItemFlags item_flags = g.CurrentItemFlags; - IM_ASSERT(item_flags == g.ItemFlagsStack.back()); - if (enabled) - item_flags |= option; - else - item_flags &= ~option; - g.CurrentItemFlags = item_flags; - g.ItemFlagsStack.push_back(item_flags); -} - -void ImGui::PopItemFlag() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.ItemFlagsStack.Size > 1); // Too many calls to PopItemFlag() - we always leave a 0 at the bottom of the stack. - g.ItemFlagsStack.pop_back(); - g.CurrentItemFlags = g.ItemFlagsStack.back(); -} - -// BeginDisabled()/EndDisabled() -// - Those can be nested but it cannot be used to enable an already disabled section (a single BeginDisabled(true) in the stack is enough to keep everything disabled) -// - Visually this is currently altering alpha, but it is expected that in a future styling system this would work differently. -// - Feedback welcome at https://github.com/ocornut/imgui/issues/211 -// - BeginDisabled(false) essentially does nothing useful but is provided to facilitate use of boolean expressions. If you can avoid calling BeginDisabled(False)/EndDisabled() best to avoid it. -// - Optimized shortcuts instead of PushStyleVar() + PushItemFlag() -void ImGui::BeginDisabled(bool disabled) -{ - ImGuiContext& g = *GImGui; - bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; - if (!was_disabled && disabled) - { - g.DisabledAlphaBackup = g.Style.Alpha; - g.Style.Alpha *= g.Style.DisabledAlpha; // PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * g.Style.DisabledAlpha); - } - if (was_disabled || disabled) - g.CurrentItemFlags |= ImGuiItemFlags_Disabled; - g.ItemFlagsStack.push_back(g.CurrentItemFlags); - g.DisabledStackSize++; -} - -void ImGui::EndDisabled() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.DisabledStackSize > 0); - g.DisabledStackSize--; - bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; - //PopItemFlag(); - g.ItemFlagsStack.pop_back(); - g.CurrentItemFlags = g.ItemFlagsStack.back(); - if (was_disabled && (g.CurrentItemFlags & ImGuiItemFlags_Disabled) == 0) - g.Style.Alpha = g.DisabledAlphaBackup; //PopStyleVar(); -} - -// FIXME: Look into renaming this once we have settled the new Focus/Activation/TabStop system. -void ImGui::PushAllowKeyboardFocus(bool allow_keyboard_focus) -{ - PushItemFlag(ImGuiItemFlags_NoTabStop, !allow_keyboard_focus); -} - -void ImGui::PopAllowKeyboardFocus() -{ - PopItemFlag(); -} - -void ImGui::PushButtonRepeat(bool repeat) -{ - PushItemFlag(ImGuiItemFlags_ButtonRepeat, repeat); -} - -void ImGui::PopButtonRepeat() -{ - PopItemFlag(); -} - -void ImGui::PushTextWrapPos(float wrap_pos_x) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.TextWrapPosStack.push_back(window->DC.TextWrapPos); - window->DC.TextWrapPos = wrap_pos_x; -} - -void ImGui::PopTextWrapPos() -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.TextWrapPos = window->DC.TextWrapPosStack.back(); - window->DC.TextWrapPosStack.pop_back(); -} - -static ImGuiWindow* GetCombinedRootWindow(ImGuiWindow* window, bool popup_hierarchy) -{ - ImGuiWindow* last_window = NULL; - while (last_window != window) - { - last_window = window; - window = window->RootWindow; - if (popup_hierarchy) - window = window->RootWindowPopupTree; - } - return window; -} - -bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy) -{ - ImGuiWindow* window_root = GetCombinedRootWindow(window, popup_hierarchy); - if (window_root == potential_parent) - return true; - while (window != NULL) - { - if (window == potential_parent) - return true; - if (window == window_root) // end of chain - return false; - window = window->ParentWindow; - } - return false; -} - -bool ImGui::IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent) -{ - if (window->RootWindow == potential_parent) - return true; - while (window != NULL) - { - if (window == potential_parent) - return true; - window = window->ParentWindowInBeginStack; - } - return false; -} - -bool ImGui::IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below) -{ - ImGuiContext& g = *GImGui; - - // It would be saner to ensure that display layer is always reflected in the g.Windows[] order, which would likely requires altering all manipulations of that array - const int display_layer_delta = GetWindowDisplayLayer(potential_above) - GetWindowDisplayLayer(potential_below); - if (display_layer_delta != 0) - return display_layer_delta > 0; - - for (int i = g.Windows.Size - 1; i >= 0; i--) - { - ImGuiWindow* candidate_window = g.Windows[i]; - if (candidate_window == potential_above) - return true; - if (candidate_window == potential_below) - return false; - } - return false; -} - -bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) -{ - IM_ASSERT((flags & (ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled)) == 0); // Flags not supported by this function - ImGuiContext& g = *GImGui; - ImGuiWindow* ref_window = g.HoveredWindow; - ImGuiWindow* cur_window = g.CurrentWindow; - if (ref_window == NULL) - return false; - - if ((flags & ImGuiHoveredFlags_AnyWindow) == 0) - { - IM_ASSERT(cur_window); // Not inside a Begin()/End() - const bool popup_hierarchy = (flags & ImGuiHoveredFlags_NoPopupHierarchy) == 0; - if (flags & ImGuiHoveredFlags_RootWindow) - cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy); - - bool result; - if (flags & ImGuiHoveredFlags_ChildWindows) - result = IsWindowChildOf(ref_window, cur_window, popup_hierarchy); - else - result = (ref_window == cur_window); - if (!result) - return false; - } - - if (!IsWindowContentHoverable(ref_window, flags)) - return false; - if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) - if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != ref_window->MoveId) - return false; - return true; -} - -bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* ref_window = g.NavWindow; - ImGuiWindow* cur_window = g.CurrentWindow; - - if (ref_window == NULL) - return false; - if (flags & ImGuiFocusedFlags_AnyWindow) - return true; - - IM_ASSERT(cur_window); // Not inside a Begin()/End() - const bool popup_hierarchy = (flags & ImGuiFocusedFlags_NoPopupHierarchy) == 0; - if (flags & ImGuiHoveredFlags_RootWindow) - cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy); - - if (flags & ImGuiHoveredFlags_ChildWindows) - return IsWindowChildOf(ref_window, cur_window, popup_hierarchy); - else - return (ref_window == cur_window); -} - -// Can we focus this window with CTRL+TAB (or PadMenu + PadFocusPrev/PadFocusNext) -// Note that NoNavFocus makes the window not reachable with CTRL+TAB but it can still be focused with mouse or programmatically. -// If you want a window to never be focused, you may use the e.g. NoInputs flag. -bool ImGui::IsWindowNavFocusable(ImGuiWindow* window) -{ - return window->WasActive && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus); -} - -float ImGui::GetWindowWidth() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->Size.x; -} - -float ImGui::GetWindowHeight() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->Size.y; -} - -ImVec2 ImGui::GetWindowPos() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - return window->Pos; -} - -void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond) -{ - // Test condition (NB: bit 0 is always true) and clear flags for next time - if (cond && (window->SetWindowPosAllowFlags & cond) == 0) - return; - - IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. - window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); - window->SetWindowPosVal = ImVec2(FLT_MAX, FLT_MAX); - - // Set - const ImVec2 old_pos = window->Pos; - window->Pos = ImFloor(pos); - ImVec2 offset = window->Pos - old_pos; - if (offset.x == 0.0f && offset.y == 0.0f) - return; - MarkIniSettingsDirty(window); - window->DC.CursorPos += offset; // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor - window->DC.CursorMaxPos += offset; // And more importantly we need to offset CursorMaxPos/CursorStartPos this so ContentSize calculation doesn't get affected. - window->DC.IdealMaxPos += offset; - window->DC.CursorStartPos += offset; -} - -void ImGui::SetWindowPos(const ImVec2& pos, ImGuiCond cond) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - SetWindowPos(window, pos, cond); -} - -void ImGui::SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond) -{ - if (ImGuiWindow* window = FindWindowByName(name)) - SetWindowPos(window, pos, cond); -} - -ImVec2 ImGui::GetWindowSize() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->Size; -} - -void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond) -{ - // Test condition (NB: bit 0 is always true) and clear flags for next time - if (cond && (window->SetWindowSizeAllowFlags & cond) == 0) - return; - - IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. - window->SetWindowSizeAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); - - // Set - ImVec2 old_size = window->SizeFull; - window->AutoFitFramesX = (size.x <= 0.0f) ? 2 : 0; - window->AutoFitFramesY = (size.y <= 0.0f) ? 2 : 0; - if (size.x <= 0.0f) - window->AutoFitOnlyGrows = false; - else - window->SizeFull.x = IM_FLOOR(size.x); - if (size.y <= 0.0f) - window->AutoFitOnlyGrows = false; - else - window->SizeFull.y = IM_FLOOR(size.y); - if (old_size.x != window->SizeFull.x || old_size.y != window->SizeFull.y) - MarkIniSettingsDirty(window); -} - -void ImGui::SetWindowSize(const ImVec2& size, ImGuiCond cond) -{ - SetWindowSize(GImGui->CurrentWindow, size, cond); -} - -void ImGui::SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond) -{ - if (ImGuiWindow* window = FindWindowByName(name)) - SetWindowSize(window, size, cond); -} - -void ImGui::SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond) -{ - // Test condition (NB: bit 0 is always true) and clear flags for next time - if (cond && (window->SetWindowCollapsedAllowFlags & cond) == 0) - return; - window->SetWindowCollapsedAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); - - // Set - window->Collapsed = collapsed; -} - -void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size) -{ - IM_ASSERT(window->HitTestHoleSize.x == 0); // We don't support multiple holes/hit test filters - window->HitTestHoleSize = ImVec2ih(size); - window->HitTestHoleOffset = ImVec2ih(pos - window->Pos); -} - -void ImGui::SetWindowCollapsed(bool collapsed, ImGuiCond cond) -{ - SetWindowCollapsed(GImGui->CurrentWindow, collapsed, cond); -} - -bool ImGui::IsWindowCollapsed() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->Collapsed; -} - -bool ImGui::IsWindowAppearing() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->Appearing; -} - -void ImGui::SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond) -{ - if (ImGuiWindow* window = FindWindowByName(name)) - SetWindowCollapsed(window, collapsed, cond); -} - -void ImGui::SetWindowFocus() -{ - FocusWindow(GImGui->CurrentWindow); -} - -void ImGui::SetWindowFocus(const char* name) -{ - if (name) - { - if (ImGuiWindow* window = FindWindowByName(name)) - FocusWindow(window); - } - else - { - FocusWindow(NULL); - } -} - -void ImGui::SetNextWindowPos(const ImVec2& pos, ImGuiCond cond, const ImVec2& pivot) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. - g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasPos; - g.NextWindowData.PosVal = pos; - g.NextWindowData.PosPivotVal = pivot; - g.NextWindowData.PosCond = cond ? cond : ImGuiCond_Always; -} - -void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. - g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSize; - g.NextWindowData.SizeVal = size; - g.NextWindowData.SizeCond = cond ? cond : ImGuiCond_Always; -} - -void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback, void* custom_callback_user_data) -{ - ImGuiContext& g = *GImGui; - g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSizeConstraint; - g.NextWindowData.SizeConstraintRect = ImRect(size_min, size_max); - g.NextWindowData.SizeCallback = custom_callback; - g.NextWindowData.SizeCallbackUserData = custom_callback_user_data; -} - -// Content size = inner scrollable rectangle, padded with WindowPadding. -// SetNextWindowContentSize(ImVec2(100,100) + ImGuiWindowFlags_AlwaysAutoResize will always allow submitting a 100x100 item. -void ImGui::SetNextWindowContentSize(const ImVec2& size) -{ - ImGuiContext& g = *GImGui; - g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasContentSize; - g.NextWindowData.ContentSizeVal = ImFloor(size); -} - -void ImGui::SetNextWindowScroll(const ImVec2& scroll) -{ - ImGuiContext& g = *GImGui; - g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasScroll; - g.NextWindowData.ScrollVal = scroll; -} - -void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. - g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasCollapsed; - g.NextWindowData.CollapsedVal = collapsed; - g.NextWindowData.CollapsedCond = cond ? cond : ImGuiCond_Always; -} - -void ImGui::SetNextWindowFocus() -{ - ImGuiContext& g = *GImGui; - g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasFocus; -} - -void ImGui::SetNextWindowBgAlpha(float alpha) -{ - ImGuiContext& g = *GImGui; - g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasBgAlpha; - g.NextWindowData.BgAlphaVal = alpha; -} - -ImDrawList* ImGui::GetWindowDrawList() -{ - ImGuiWindow* window = GetCurrentWindow(); - return window->DrawList; -} - -ImFont* ImGui::GetFont() -{ - return GImGui->Font; -} - -float ImGui::GetFontSize() -{ - return GImGui->FontSize; -} - -ImVec2 ImGui::GetFontTexUvWhitePixel() -{ - return GImGui->DrawListSharedData.TexUvWhitePixel; -} - -void ImGui::SetWindowFontScale(float scale) -{ - IM_ASSERT(scale > 0.0f); - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - window->FontWindowScale = scale; - g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); -} - -void ImGui::ActivateItem(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - g.NavNextActivateId = id; - g.NavNextActivateFlags = ImGuiActivateFlags_None; -} - -void ImGui::PushFocusScope(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - g.FocusScopeStack.push_back(window->DC.NavFocusScopeIdCurrent); - window->DC.NavFocusScopeIdCurrent = id; -} - -void ImGui::PopFocusScope() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(g.FocusScopeStack.Size > 0); // Too many PopFocusScope() ? - window->DC.NavFocusScopeIdCurrent = g.FocusScopeStack.back(); - g.FocusScopeStack.pop_back(); -} - -// Note: this will likely be called ActivateItem() once we rework our Focus/Activation system! -void ImGui::SetKeyboardFocusHere(int offset) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(offset >= -1); // -1 is allowed but not below - IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere(%d) in window \"%s\"\n", offset, window->Name); - - // It makes sense in the vast majority of cases to never interrupt a drag and drop. - // When we refactor this function into ActivateItem() we may want to make this an option. - // MovingWindow is protected from most user inputs using SetActiveIdUsingNavAndKeys(), but - // is also automatically dropped in the event g.ActiveId is stolen. - if (g.DragDropActive || g.MovingWindow != NULL) - { - IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere() ignored while DragDropActive!\n"); - return; - } - - SetNavWindow(window); - - ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; - NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, ImGuiNavMoveFlags_Tabbing | ImGuiNavMoveFlags_FocusApi, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. - if (offset == -1) - { - NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal); - } - else - { - g.NavTabbingDir = 1; - g.NavTabbingCounter = offset + 1; - } -} - -void ImGui::SetItemDefaultFocus() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (!window->Appearing) - return; - if (g.NavWindow != window->RootWindowForNav || (!g.NavInitRequest && g.NavInitResultId == 0) || g.NavLayer != window->DC.NavLayerCurrent) - return; - - g.NavInitRequest = false; - g.NavInitResultId = g.LastItemData.ID; - g.NavInitResultRectRel = WindowRectAbsToRel(window, g.LastItemData.Rect); - NavUpdateAnyRequestFlag(); - - // Scroll could be done in NavInitRequestApplyResult() via a opt-in flag (we however don't want regular init requests to scroll) - if (!IsItemVisible()) - ScrollToRectEx(window, g.LastItemData.Rect, ImGuiScrollFlags_None); -} - -void ImGui::SetStateStorage(ImGuiStorage* tree) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - window->DC.StateStorage = tree ? tree : &window->StateStorage; -} - -ImGuiStorage* ImGui::GetStateStorage() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->DC.StateStorage; -} - -void ImGui::PushID(const char* str_id) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiID id = window->GetID(str_id); - window->IDStack.push_back(id); -} - -void ImGui::PushID(const char* str_id_begin, const char* str_id_end) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiID id = window->GetID(str_id_begin, str_id_end); - window->IDStack.push_back(id); -} - -void ImGui::PushID(const void* ptr_id) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiID id = window->GetID(ptr_id); - window->IDStack.push_back(id); -} - -void ImGui::PushID(int int_id) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiID id = window->GetID(int_id); - window->IDStack.push_back(id); -} - -// Push a given id value ignoring the ID stack as a seed. -void ImGui::PushOverrideID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.DebugHookIdInfo == id) - DebugHookIdInfo(id, ImGuiDataType_ID, NULL, NULL); - window->IDStack.push_back(id); -} - -// Helper to avoid a common series of PushOverrideID -> GetID() -> PopID() call -// (note that when using this pattern, TestEngine's "Stack Tool" will tend to not display the intermediate stack level. -// for that to work we would need to do PushOverrideID() -> ItemAdd() -> PopID() which would alter widget code a little more) -ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed) -{ - ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); - ImGuiContext& g = *GImGui; - if (g.DebugHookIdInfo == id) - DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); - return id; -} - -void ImGui::PopID() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - IM_ASSERT(window->IDStack.Size > 1); // Too many PopID(), or could be popping in a wrong/different window? - window->IDStack.pop_back(); -} - -ImGuiID ImGui::GetID(const char* str_id) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->GetID(str_id); -} - -ImGuiID ImGui::GetID(const char* str_id_begin, const char* str_id_end) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->GetID(str_id_begin, str_id_end); -} - -ImGuiID ImGui::GetID(const void* ptr_id) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->GetID(ptr_id); -} - -bool ImGui::IsRectVisible(const ImVec2& size) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); -} - -bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); -} - - -//----------------------------------------------------------------------------- -// [SECTION] INPUTS -//----------------------------------------------------------------------------- - -// Test if mouse cursor is hovering given rectangle -// NB- Rectangle is clipped by our current clip setting -// NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding) -bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip) -{ - ImGuiContext& g = *GImGui; - - // Clip - ImRect rect_clipped(r_min, r_max); - if (clip) - rect_clipped.ClipWith(g.CurrentWindow->ClipRect); - - // Expand for touch input - const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding); - if (!rect_for_touch.Contains(g.IO.MousePos)) - return false; - return true; -} - -ImGuiKeyData* ImGui::GetKeyData(ImGuiKey key) -{ - ImGuiContext& g = *GImGui; - int index; -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - IM_ASSERT(key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_NamedKey_END); - if (IsLegacyKey(key)) - index = (g.IO.KeyMap[key] != -1) ? g.IO.KeyMap[key] : key; // Remap native->imgui or imgui->native - else - index = key; -#else - IM_ASSERT(IsNamedKey(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend & user code."); - index = key - ImGuiKey_NamedKey_BEGIN; -#endif - return &g.IO.KeysData[index]; -} - -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO -int ImGui::GetKeyIndex(ImGuiKey key) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(IsNamedKey(key)); - const ImGuiKeyData* key_data = GetKeyData(key); - return (int)(key_data - g.IO.KeysData); -} -#endif - -// Those names a provided for debugging purpose and are not meant to be saved persistently not compared. -static const char* const GKeyNames[] = -{ - "Tab", "LeftArrow", "RightArrow", "UpArrow", "DownArrow", "PageUp", "PageDown", - "Home", "End", "Insert", "Delete", "Backspace", "Space", "Enter", "Escape", - "LeftCtrl", "LeftShift", "LeftAlt", "LeftSuper", "RightCtrl", "RightShift", "RightAlt", "RightSuper", "Menu", - "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", - "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", - "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", - "Apostrophe", "Comma", "Minus", "Period", "Slash", "Semicolon", "Equal", "LeftBracket", - "Backslash", "RightBracket", "GraveAccent", "CapsLock", "ScrollLock", "NumLock", "PrintScreen", - "Pause", "Keypad0", "Keypad1", "Keypad2", "Keypad3", "Keypad4", "Keypad5", "Keypad6", - "Keypad7", "Keypad8", "Keypad9", "KeypadDecimal", "KeypadDivide", "KeypadMultiply", - "KeypadSubtract", "KeypadAdd", "KeypadEnter", "KeypadEqual", - "GamepadStart", "GamepadBack", - "GamepadFaceLeft", "GamepadFaceRight", "GamepadFaceUp", "GamepadFaceDown", - "GamepadDpadLeft", "GamepadDpadRight", "GamepadDpadUp", "GamepadDpadDown", - "GamepadL1", "GamepadR1", "GamepadL2", "GamepadR2", "GamepadL3", "GamepadR3", - "GamepadLStickLeft", "GamepadLStickRight", "GamepadLStickUp", "GamepadLStickDown", - "GamepadRStickLeft", "GamepadRStickRight", "GamepadRStickUp", "GamepadRStickDown", - "ModCtrl", "ModShift", "ModAlt", "ModSuper", - "MouseLeft", "MouseRight", "MouseMiddle", "MouseX1", "MouseX2", "MouseWheelX", "MouseWheelY", -}; -IM_STATIC_ASSERT(ImGuiKey_NamedKey_COUNT == IM_ARRAYSIZE(GKeyNames)); - -const char* ImGui::GetKeyName(ImGuiKey key) -{ -#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO - IM_ASSERT((IsNamedKey(key) || key == ImGuiKey_None) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code."); -#else - if (IsLegacyKey(key)) - { - ImGuiIO& io = GetIO(); - if (io.KeyMap[key] == -1) - return "N/A"; - IM_ASSERT(IsNamedKey((ImGuiKey)io.KeyMap[key])); - key = (ImGuiKey)io.KeyMap[key]; - } -#endif - if (key == ImGuiKey_None) - return "None"; - if (!IsNamedKey(key)) - return "Unknown"; - - return GKeyNames[key - ImGuiKey_NamedKey_BEGIN]; -} - -void ImGui::GetKeyChordName(ImGuiModFlags mods, ImGuiKey key, char* out_buf, int out_buf_size) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT((mods & ~ImGuiModFlags_All) == 0 && "Passing invalid ImGuiModFlags value!"); // A frequent mistake is to pass ImGuiKey_ModXXX instead of ImGuiModFlags_XXX - ImFormatString(out_buf, (size_t)out_buf_size, "%s%s%s%s%s", - (mods & ImGuiModFlags_Ctrl) ? "Ctrl+" : "", - (mods & ImGuiModFlags_Shift) ? "Shift+" : "", - (mods & ImGuiModFlags_Alt) ? "Alt+" : "", - (mods & ImGuiModFlags_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "", - GetKeyName(key)); -} - -// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime) -// t1 = current time (e.g.: g.Time) -// An event is triggered at: -// t = 0.0f t = repeat_delay, t = repeat_delay + repeat_rate*N -int ImGui::CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate) -{ - if (t1 == 0.0f) - return 1; - if (t0 >= t1) - return 0; - if (repeat_rate <= 0.0f) - return (t0 < repeat_delay) && (t1 >= repeat_delay); - const int count_t0 = (t0 < repeat_delay) ? -1 : (int)((t0 - repeat_delay) / repeat_rate); - const int count_t1 = (t1 < repeat_delay) ? -1 : (int)((t1 - repeat_delay) / repeat_rate); - const int count = count_t1 - count_t0; - return count; -} - -void ImGui::GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate) -{ - ImGuiContext& g = *GImGui; - switch (flags & ImGuiInputFlags_RepeatRateMask_) - { - case ImGuiInputFlags_RepeatRateNavMove: *repeat_delay = g.IO.KeyRepeatDelay * 0.72f; *repeat_rate = g.IO.KeyRepeatRate * 0.80f; return; - case ImGuiInputFlags_RepeatRateNavTweak: *repeat_delay = g.IO.KeyRepeatDelay * 0.72f; *repeat_rate = g.IO.KeyRepeatRate * 0.30f; return; - case ImGuiInputFlags_RepeatRateDefault: default: *repeat_delay = g.IO.KeyRepeatDelay * 1.00f; *repeat_rate = g.IO.KeyRepeatRate * 1.00f; return; - } -} - -// Return value representing the number of presses in the last time period, for the given repeat rate -// (most often returns 0 or 1. The result is generally only >1 when RepeatRate is smaller than DeltaTime, aka large DeltaTime or fast RepeatRate) -int ImGui::GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float repeat_rate) -{ - ImGuiContext& g = *GImGui; - const ImGuiKeyData* key_data = GetKeyData(key); - const float t = key_data->DownDuration; - return CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, repeat_delay, repeat_rate); -} - -// Return 2D vector representing the combination of four cardinal direction, with analog value support (for e.g. ImGuiKey_GamepadLStick* values). -ImVec2 ImGui::GetKeyVector2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down) -{ - return ImVec2( - GetKeyData(key_right)->AnalogValue - GetKeyData(key_left)->AnalogValue, - GetKeyData(key_down)->AnalogValue - GetKeyData(key_up)->AnalogValue); -} - -// Note that Dear ImGui doesn't know the meaning/semantic of ImGuiKey from 0..511: they are legacy native keycodes. -// Consider transitioning from 'IsKeyDown(MY_ENGINE_KEY_A)' (<1.87) to IsKeyDown(ImGuiKey_A) (>= 1.87) -bool ImGui::IsKeyDown(ImGuiKey key) -{ - const ImGuiKeyData* key_data = GetKeyData(key); - if (!key_data->Down) - return false; - return true; -} - -bool ImGui::IsKeyPressed(ImGuiKey key, bool repeat) -{ - return IsKeyPressedEx(key, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); -} - -// Important: unlike legacy IsKeyPressed(ImGuiKey, bool repeat=true) which DEFAULT to repeat, this requires EXPLICIT repeat. -// [Internal] 2022/07: Do not call this directly! It is a temporary entry point which we will soon replace with an overload for IsKeyPressed() when we introduce key ownership. -bool ImGui::IsKeyPressedEx(ImGuiKey key, ImGuiInputFlags flags) -{ - const ImGuiKeyData* key_data = GetKeyData(key); - const float t = key_data->DownDuration; - if (t < 0.0f) - return false; - - bool pressed = (t == 0.0f); - if (!pressed && ((flags & ImGuiInputFlags_Repeat) != 0)) - { - float repeat_delay, repeat_rate; - GetTypematicRepeatRate(flags, &repeat_delay, &repeat_rate); - pressed = (t > repeat_delay) && GetKeyPressedAmount(key, repeat_delay, repeat_rate) > 0; - } - - if (!pressed) - return false; - return true; -} - -bool ImGui::IsKeyReleased(ImGuiKey key) -{ - const ImGuiKeyData* key_data = GetKeyData(key); - if (key_data->DownDurationPrev < 0.0f || key_data->Down) - return false; - return true; -} - -bool ImGui::IsMouseDown(ImGuiMouseButton button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - return g.IO.MouseDown[button]; -} - -bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - const float t = g.IO.MouseDownDuration[button]; - if (t == 0.0f) - return true; - if (repeat && t > g.IO.KeyRepeatDelay) - return CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0; - return false; -} - -bool ImGui::IsMouseReleased(ImGuiMouseButton button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - return g.IO.MouseReleased[button]; -} - -bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - return g.IO.MouseClickedCount[button] == 2; -} - -int ImGui::GetMouseClickedCount(ImGuiMouseButton button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - return g.IO.MouseClickedCount[button]; -} - -// Return if a mouse click/drag went past the given threshold. Valid to call during the MouseReleased frame. -// [Internal] This doesn't test if the button is pressed -bool ImGui::IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - if (lock_threshold < 0.0f) - lock_threshold = g.IO.MouseDragThreshold; - return g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold; -} - -bool ImGui::IsMouseDragging(ImGuiMouseButton button, float lock_threshold) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - if (!g.IO.MouseDown[button]) - return false; - return IsMouseDragPastThreshold(button, lock_threshold); -} - -ImVec2 ImGui::GetMousePos() -{ - ImGuiContext& g = *GImGui; - return g.IO.MousePos; -} - -// NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed! -ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup() -{ - ImGuiContext& g = *GImGui; - if (g.BeginPopupStack.Size > 0) - return g.OpenPopupStack[g.BeginPopupStack.Size - 1].OpenMousePos; - return g.IO.MousePos; -} - -// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position. -bool ImGui::IsMousePosValid(const ImVec2* mouse_pos) -{ - // The assert is only to silence a false-positive in XCode Static Analysis. - // Because GImGui is not dereferenced in every code path, the static analyzer assume that it may be NULL (which it doesn't for other functions). - IM_ASSERT(GImGui != NULL); - const float MOUSE_INVALID = -256000.0f; - ImVec2 p = mouse_pos ? *mouse_pos : GImGui->IO.MousePos; - return p.x >= MOUSE_INVALID && p.y >= MOUSE_INVALID; -} - -// [WILL OBSOLETE] This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid. -bool ImGui::IsAnyMouseDown() -{ - ImGuiContext& g = *GImGui; - for (int n = 0; n < IM_ARRAYSIZE(g.IO.MouseDown); n++) - if (g.IO.MouseDown[n]) - return true; - return false; -} - -// Return the delta from the initial clicking position while the mouse button is clicked or was just released. -// This is locked and return 0.0f until the mouse moves past a distance threshold at least once. -// NB: This is only valid if IsMousePosValid(). backends in theory should always keep mouse position valid when dragging even outside the client window. -ImVec2 ImGui::GetMouseDragDelta(ImGuiMouseButton button, float lock_threshold) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - if (lock_threshold < 0.0f) - lock_threshold = g.IO.MouseDragThreshold; - if (g.IO.MouseDown[button] || g.IO.MouseReleased[button]) - if (g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold) - if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MouseClickedPos[button])) - return g.IO.MousePos - g.IO.MouseClickedPos[button]; - return ImVec2(0.0f, 0.0f); -} - -void ImGui::ResetMouseDragDelta(ImGuiMouseButton button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - // NB: We don't need to reset g.IO.MouseDragMaxDistanceSqr - g.IO.MouseClickedPos[button] = g.IO.MousePos; -} - -ImGuiMouseCursor ImGui::GetMouseCursor() -{ - ImGuiContext& g = *GImGui; - return g.MouseCursor; -} - -void ImGui::SetMouseCursor(ImGuiMouseCursor cursor_type) -{ - ImGuiContext& g = *GImGui; - g.MouseCursor = cursor_type; -} - -void ImGui::SetNextFrameWantCaptureKeyboard(bool want_capture_keyboard) -{ - ImGuiContext& g = *GImGui; - g.WantCaptureKeyboardNextFrame = want_capture_keyboard ? 1 : 0; -} - -void ImGui::SetNextFrameWantCaptureMouse(bool want_capture_mouse) -{ - ImGuiContext& g = *GImGui; - g.WantCaptureMouseNextFrame = want_capture_mouse ? 1 : 0; -} - -#ifndef IMGUI_DISABLE_DEBUG_TOOLS -static const char* GetInputSourceName(ImGuiInputSource source) -{ - const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad", "Nav", "Clipboard" }; - IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT && source >= 0 && source < ImGuiInputSource_COUNT); - return input_source_names[source]; -} -#endif - -/*static void DebugPrintInputEvent(const char* prefix, const ImGuiInputEvent* e) -{ - if (e->Type == ImGuiInputEventType_MousePos) { IMGUI_DEBUG_LOG_IO("%s: MousePos (%.1f %.1f)\n", prefix, e->MousePos.PosX, e->MousePos.PosY); return; } - if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG_IO("%s: MouseButton %d %s\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up"); return; } - if (e->Type == ImGuiInputEventType_MouseWheel) { IMGUI_DEBUG_LOG_IO("%s: MouseWheel (%.1f %.1f)\n", prefix, e->MouseWheel.WheelX, e->MouseWheel.WheelY); return; } - if (e->Type == ImGuiInputEventType_Key) { IMGUI_DEBUG_LOG_IO("%s: Key \"%s\" %s\n", prefix, ImGui::GetKeyName(e->Key.Key), e->Key.Down ? "Down" : "Up"); return; } - if (e->Type == ImGuiInputEventType_Text) { IMGUI_DEBUG_LOG_IO("%s: Text: %c (U+%08X)\n", prefix, e->Text.Char, e->Text.Char); return; } - if (e->Type == ImGuiInputEventType_Focus) { IMGUI_DEBUG_LOG_IO("%s: AppFocused %d\n", prefix, e->AppFocused.Focused); return; } -}*/ - -// Process input queue -// We always call this with the value of 'bool g.IO.ConfigInputTrickleEventQueue'. -// - trickle_fast_inputs = false : process all events, turn into flattened input state (e.g. successive down/up/down/up will be lost) -// - trickle_fast_inputs = true : process as many events as possible (successive down/up/down/up will be trickled over several frames so nothing is lost) (new feature in 1.87) -void ImGui::UpdateInputEvents(bool trickle_fast_inputs) -{ - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - - // Only trickle chars<>key when working with InputText() - // FIXME: InputText() could parse event trail? - // FIXME: Could specialize chars<>keys trickling rules for control keys (those not typically associated to characters) - const bool trickle_interleaved_keys_and_text = (trickle_fast_inputs && g.WantTextInputNextFrame == 1); - - bool mouse_moved = false, mouse_wheeled = false, key_changed = false, text_inputted = false; - int mouse_button_changed = 0x00; - ImBitArray key_changed_mask; - - int event_n = 0; - for (; event_n < g.InputEventsQueue.Size; event_n++) - { - const ImGuiInputEvent* e = &g.InputEventsQueue[event_n]; - if (e->Type == ImGuiInputEventType_MousePos) - { - ImVec2 event_pos(e->MousePos.PosX, e->MousePos.PosY); - if (IsMousePosValid(&event_pos)) - event_pos = ImVec2(ImFloorSigned(event_pos.x), ImFloorSigned(event_pos.y)); // Apply same flooring as UpdateMouseInputs() - if (io.MousePos.x != event_pos.x || io.MousePos.y != event_pos.y) - { - // Trickling Rule: Stop processing queued events if we already handled a mouse button change - if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_wheeled || key_changed || text_inputted)) - break; - io.MousePos = event_pos; - mouse_moved = true; - } - } - else if (e->Type == ImGuiInputEventType_MouseButton) - { - const ImGuiMouseButton button = e->MouseButton.Button; - IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); - if (io.MouseDown[button] != e->MouseButton.Down) - { - // Trickling Rule: Stop processing queued events if we got multiple action on the same button - if (trickle_fast_inputs && ((mouse_button_changed & (1 << button)) || mouse_wheeled)) - break; - io.MouseDown[button] = e->MouseButton.Down; - mouse_button_changed |= (1 << button); - } - } - else if (e->Type == ImGuiInputEventType_MouseWheel) - { - if (e->MouseWheel.WheelX != 0.0f || e->MouseWheel.WheelY != 0.0f) - { - // Trickling Rule: Stop processing queued events if we got multiple action on the event - if (trickle_fast_inputs && (mouse_moved || mouse_button_changed != 0)) - break; - io.MouseWheelH += e->MouseWheel.WheelX; - io.MouseWheel += e->MouseWheel.WheelY; - mouse_wheeled = true; - } - } - else if (e->Type == ImGuiInputEventType_Key) - { - ImGuiKey key = e->Key.Key; - IM_ASSERT(key != ImGuiKey_None); - const int keydata_index = (key - ImGuiKey_KeysData_OFFSET); - ImGuiKeyData* keydata = &io.KeysData[keydata_index]; - if (keydata->Down != e->Key.Down || keydata->AnalogValue != e->Key.AnalogValue) - { - // Trickling Rule: Stop processing queued events if we got multiple action on the same button - if (trickle_fast_inputs && keydata->Down != e->Key.Down && (key_changed_mask.TestBit(keydata_index) || text_inputted || mouse_button_changed != 0)) - break; - keydata->Down = e->Key.Down; - keydata->AnalogValue = e->Key.AnalogValue; - key_changed = true; - key_changed_mask.SetBit(keydata_index); - - if (key == ImGuiKey_ModCtrl || key == ImGuiKey_ModShift || key == ImGuiKey_ModAlt || key == ImGuiKey_ModSuper) - { - if (key == ImGuiKey_ModCtrl) { io.KeyCtrl = keydata->Down; } - if (key == ImGuiKey_ModShift) { io.KeyShift = keydata->Down; } - if (key == ImGuiKey_ModAlt) { io.KeyAlt = keydata->Down; } - if (key == ImGuiKey_ModSuper) { io.KeySuper = keydata->Down; } - io.KeyMods = GetMergedModFlags(); - } - - // Allow legacy code using io.KeysDown[GetKeyIndex()] with new backends -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - io.KeysDown[key] = keydata->Down; - if (io.KeyMap[key] != -1) - io.KeysDown[io.KeyMap[key]] = keydata->Down; -#endif - } - } - else if (e->Type == ImGuiInputEventType_Text) - { - // Trickling Rule: Stop processing queued events if keys/mouse have been interacted with - if (trickle_fast_inputs && ((key_changed && trickle_interleaved_keys_and_text) || mouse_button_changed != 0 || mouse_moved || mouse_wheeled)) - break; - unsigned int c = e->Text.Char; - io.InputQueueCharacters.push_back(c <= IM_UNICODE_CODEPOINT_MAX ? (ImWchar)c : IM_UNICODE_CODEPOINT_INVALID); - if (trickle_interleaved_keys_and_text) - text_inputted = true; - } - else if (e->Type == ImGuiInputEventType_Focus) - { - // We intentionally overwrite this and process lower, in order to give a chance - // to multi-viewports backends to queue AddFocusEvent(false) + AddFocusEvent(true) in same frame. - io.AppFocusLost = !e->AppFocused.Focused; - } - else - { - IM_ASSERT(0 && "Unknown event!"); - } - } - - // Record trail (for domain-specific applications wanting to access a precise trail) - //if (event_n != 0) IMGUI_DEBUG_LOG_IO("Processed: %d / Remaining: %d\n", event_n, g.InputEventsQueue.Size - event_n); - for (int n = 0; n < event_n; n++) - g.InputEventsTrail.push_back(g.InputEventsQueue[n]); - - // [DEBUG] - /*if (event_n != 0) - for (int n = 0; n < g.InputEventsQueue.Size; n++) - DebugPrintInputEvent(n < event_n ? "Processed" : "Remaining", &g.InputEventsQueue[n]);*/ - - // Remaining events will be processed on the next frame - if (event_n == g.InputEventsQueue.Size) - g.InputEventsQueue.resize(0); - else - g.InputEventsQueue.erase(g.InputEventsQueue.Data, g.InputEventsQueue.Data + event_n); - - // Clear buttons state when focus is lost - // (this is useful so e.g. releasing Alt after focus loss on Alt-Tab doesn't trigger the Alt menu toggle) - if (g.IO.AppFocusLost) - { - g.IO.ClearInputKeys(); - g.IO.AppFocusLost = false; - } -} - - -//----------------------------------------------------------------------------- -// [SECTION] ERROR CHECKING -//----------------------------------------------------------------------------- - -// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui. -// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit -// If this triggers you have an issue: -// - Most commonly: mismatched headers and compiled code version. -// - Or: mismatched configuration #define, compilation settings, packing pragma etc. -// The configuration settings mentioned in imconfig.h must be set for all compilation units involved with Dear ImGui, -// which is way it is required you put them in your imconfig file (and not just before including imgui.h). -// Otherwise it is possible that different compilation units would see different structure layout -bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx) -{ - bool error = false; - if (strcmp(version, IMGUI_VERSION) != 0) { error = true; IM_ASSERT(strcmp(version, IMGUI_VERSION) == 0 && "Mismatched version string!"); } - if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } - if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); } - if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } - if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } - if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } - if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } - return !error; -} - -static void ImGui::ErrorCheckNewFrameSanityChecks() -{ - ImGuiContext& g = *GImGui; - - // Check user IM_ASSERT macro - // (IF YOU GET A WARNING OR COMPILE ERROR HERE: it means your assert macro is incorrectly defined! - // If your macro uses multiple statements, it NEEDS to be surrounded by a 'do { ... } while (0)' block. - // This is a common C/C++ idiom to allow multiple statements macros to be used in control flow blocks.) - // #define IM_ASSERT(EXPR) if (SomeCode(EXPR)) SomeMoreCode(); // Wrong! - // #define IM_ASSERT(EXPR) do { if (SomeCode(EXPR)) SomeMoreCode(); } while (0) // Correct! - if (true) IM_ASSERT(1); else IM_ASSERT(0); - - // Check user data - // (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument) - IM_ASSERT(g.Initialized); - IM_ASSERT((g.IO.DeltaTime > 0.0f || g.FrameCount == 0) && "Need a positive DeltaTime!"); - IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?"); - IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value!"); - IM_ASSERT(g.IO.Fonts->IsBuilt() && "Font Atlas not built! Make sure you called ImGui_ImplXXXX_NewFrame() function for renderer backend, which should call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8()"); - IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!"); - IM_ASSERT(g.Style.CircleTessellationMaxError > 0.0f && "Invalid style setting!"); - IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting!"); // Allows us to avoid a few clamps in color computations - IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting."); - IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right); - IM_ASSERT(g.Style.ColorButtonPosition == ImGuiDir_Left || g.Style.ColorButtonPosition == ImGuiDir_Right); -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_COUNT; n++) - IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < ImGuiKey_LegacyNativeKey_END && "io.KeyMap[] contains an out of bound value (need to be 0..511, or -1 for unmapped key)"); - - // Check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only added in 1.60 WIP) - if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && g.IO.BackendUsingLegacyKeyArrays == 1) - IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation."); -#endif - - // Check: the io.ConfigWindowsResizeFromEdges option requires backend to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly. - if (g.IO.ConfigWindowsResizeFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors)) - g.IO.ConfigWindowsResizeFromEdges = false; -} - -static void ImGui::ErrorCheckEndFrameSanityChecks() -{ - ImGuiContext& g = *GImGui; - - // Verify that io.KeyXXX fields haven't been tampered with. Key mods should not be modified between NewFrame() and EndFrame() - // One possible reason leading to this assert is that your backends update inputs _AFTER_ NewFrame(). - // It is known that when some modal native windows called mid-frame takes focus away, some backends such as GLFW will - // send key release events mid-frame. This would normally trigger this assertion and lead to sheared inputs. - // We silently accommodate for this case by ignoring/ the case where all io.KeyXXX modifiers were released (aka key_mod_flags == 0), - // while still correctly asserting on mid-frame key press events. - const ImGuiModFlags key_mods = GetMergedModFlags(); - IM_ASSERT((key_mods == 0 || g.IO.KeyMods == key_mods) && "Mismatching io.KeyCtrl/io.KeyShift/io.KeyAlt/io.KeySuper vs io.KeyMods"); - IM_UNUSED(key_mods); - - // [EXPERIMENTAL] Recover from errors: You may call this yourself before EndFrame(). - //ErrorCheckEndFrameRecover(); - - // Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you - // to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API). - if (g.CurrentWindowStack.Size != 1) - { - if (g.CurrentWindowStack.Size > 1) - { - IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?"); - while (g.CurrentWindowStack.Size > 1) - End(); - } - else - { - IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?"); - } - } - - IM_ASSERT_USER_ERROR(g.GroupStack.Size == 0, "Missing EndGroup call!"); -} - -// Experimental recovery from incorrect usage of BeginXXX/EndXXX/PushXXX/PopXXX calls. -// Must be called during or before EndFrame(). -// This is generally flawed as we are not necessarily End/Popping things in the right order. -// FIXME: Can't recover from inside BeginTabItem/EndTabItem yet. -// FIXME: Can't recover from interleaved BeginTabBar/Begin -void ImGui::ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data) -{ - // PVS-Studio V1044 is "Loop break conditions do not depend on the number of iterations" - ImGuiContext& g = *GImGui; - while (g.CurrentWindowStack.Size > 0) //-V1044 - { - ErrorCheckEndWindowRecover(log_callback, user_data); - ImGuiWindow* window = g.CurrentWindow; - if (g.CurrentWindowStack.Size == 1) - { - IM_ASSERT(window->IsFallbackWindow); - break; - } - if (window->Flags & ImGuiWindowFlags_ChildWindow) - { - if (log_callback) log_callback(user_data, "Recovered from missing EndChild() for '%s'", window->Name); - EndChild(); - } - else - { - if (log_callback) log_callback(user_data, "Recovered from missing End() for '%s'", window->Name); - End(); - } - } -} - -// Must be called before End()/EndChild() -void ImGui::ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data) -{ - ImGuiContext& g = *GImGui; - while (g.CurrentTable && (g.CurrentTable->OuterWindow == g.CurrentWindow || g.CurrentTable->InnerWindow == g.CurrentWindow)) - { - if (log_callback) log_callback(user_data, "Recovered from missing EndTable() in '%s'", g.CurrentTable->OuterWindow->Name); - EndTable(); - } - - ImGuiWindow* window = g.CurrentWindow; - ImGuiStackSizes* stack_sizes = &g.CurrentWindowStack.back().StackSizesOnBegin; - IM_ASSERT(window != NULL); - while (g.CurrentTabBar != NULL) //-V1044 - { - if (log_callback) log_callback(user_data, "Recovered from missing EndTabBar() in '%s'", window->Name); - EndTabBar(); - } - while (window->DC.TreeDepth > 0) - { - if (log_callback) log_callback(user_data, "Recovered from missing TreePop() in '%s'", window->Name); - TreePop(); - } - while (g.GroupStack.Size > stack_sizes->SizeOfGroupStack) //-V1044 - { - if (log_callback) log_callback(user_data, "Recovered from missing EndGroup() in '%s'", window->Name); - EndGroup(); - } - while (window->IDStack.Size > 1) - { - if (log_callback) log_callback(user_data, "Recovered from missing PopID() in '%s'", window->Name); - PopID(); - } - while (g.DisabledStackSize > stack_sizes->SizeOfDisabledStack) //-V1044 - { - if (log_callback) log_callback(user_data, "Recovered from missing EndDisabled() in '%s'", window->Name); - EndDisabled(); - } - while (g.ColorStack.Size > stack_sizes->SizeOfColorStack) - { - if (log_callback) log_callback(user_data, "Recovered from missing PopStyleColor() in '%s' for ImGuiCol_%s", window->Name, GetStyleColorName(g.ColorStack.back().Col)); - PopStyleColor(); - } - while (g.ItemFlagsStack.Size > stack_sizes->SizeOfItemFlagsStack) //-V1044 - { - if (log_callback) log_callback(user_data, "Recovered from missing PopItemFlag() in '%s'", window->Name); - PopItemFlag(); - } - while (g.StyleVarStack.Size > stack_sizes->SizeOfStyleVarStack) //-V1044 - { - if (log_callback) log_callback(user_data, "Recovered from missing PopStyleVar() in '%s'", window->Name); - PopStyleVar(); - } - while (g.FocusScopeStack.Size > stack_sizes->SizeOfFocusScopeStack) //-V1044 - { - if (log_callback) log_callback(user_data, "Recovered from missing PopFocusScope() in '%s'", window->Name); - PopFocusScope(); - } -} - -// Save current stack sizes for later compare -void ImGuiStackSizes::SetToCurrentState() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - SizeOfIDStack = (short)window->IDStack.Size; - SizeOfColorStack = (short)g.ColorStack.Size; - SizeOfStyleVarStack = (short)g.StyleVarStack.Size; - SizeOfFontStack = (short)g.FontStack.Size; - SizeOfFocusScopeStack = (short)g.FocusScopeStack.Size; - SizeOfGroupStack = (short)g.GroupStack.Size; - SizeOfItemFlagsStack = (short)g.ItemFlagsStack.Size; - SizeOfBeginPopupStack = (short)g.BeginPopupStack.Size; - SizeOfDisabledStack = (short)g.DisabledStackSize; -} - -// Compare to detect usage errors -void ImGuiStackSizes::CompareWithCurrentState() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_UNUSED(window); - - // Window stacks - // NOT checking: DC.ItemWidth, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin) - IM_ASSERT(SizeOfIDStack == window->IDStack.Size && "PushID/PopID or TreeNode/TreePop Mismatch!"); - - // Global stacks - // For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them. - IM_ASSERT(SizeOfGroupStack == g.GroupStack.Size && "BeginGroup/EndGroup Mismatch!"); - IM_ASSERT(SizeOfBeginPopupStack == g.BeginPopupStack.Size && "BeginPopup/EndPopup or BeginMenu/EndMenu Mismatch!"); - IM_ASSERT(SizeOfDisabledStack == g.DisabledStackSize && "BeginDisabled/EndDisabled Mismatch!"); - IM_ASSERT(SizeOfItemFlagsStack >= g.ItemFlagsStack.Size && "PushItemFlag/PopItemFlag Mismatch!"); - IM_ASSERT(SizeOfColorStack >= g.ColorStack.Size && "PushStyleColor/PopStyleColor Mismatch!"); - IM_ASSERT(SizeOfStyleVarStack >= g.StyleVarStack.Size && "PushStyleVar/PopStyleVar Mismatch!"); - IM_ASSERT(SizeOfFontStack >= g.FontStack.Size && "PushFont/PopFont Mismatch!"); - IM_ASSERT(SizeOfFocusScopeStack == g.FocusScopeStack.Size && "PushFocusScope/PopFocusScope Mismatch!"); -} - - -//----------------------------------------------------------------------------- -// [SECTION] LAYOUT -//----------------------------------------------------------------------------- -// - ItemSize() -// - ItemAdd() -// - SameLine() -// - GetCursorScreenPos() -// - SetCursorScreenPos() -// - GetCursorPos(), GetCursorPosX(), GetCursorPosY() -// - SetCursorPos(), SetCursorPosX(), SetCursorPosY() -// - GetCursorStartPos() -// - Indent() -// - Unindent() -// - SetNextItemWidth() -// - PushItemWidth() -// - PushMultiItemsWidths() -// - PopItemWidth() -// - CalcItemWidth() -// - CalcItemSize() -// - GetTextLineHeight() -// - GetTextLineHeightWithSpacing() -// - GetFrameHeight() -// - GetFrameHeightWithSpacing() -// - GetContentRegionMax() -// - GetContentRegionMaxAbs() [Internal] -// - GetContentRegionAvail(), -// - GetWindowContentRegionMin(), GetWindowContentRegionMax() -// - BeginGroup() -// - EndGroup() -// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns. -//----------------------------------------------------------------------------- - -// Advance cursor given item size for layout. -// Register minimum needed size so it can extend the bounding box used for auto-fit calculation. -// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different. -void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - // We increase the height in this function to accommodate for baseline offset. - // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor, - // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect. - const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f; - - const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y; - const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y); - - // Always align ourselves on pixel boundaries - //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] - window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x; - window->DC.CursorPosPrevLine.y = line_y1; - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line - window->DC.CursorPos.y = IM_FLOOR(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line - window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); - window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); - //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] - - window->DC.PrevLineSize.y = line_height; - window->DC.CurrLineSize.y = 0.0f; - window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y); - window->DC.CurrLineTextBaseOffset = 0.0f; - window->DC.IsSameLine = false; - - // Horizontal layout mode - if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) - SameLine(); -} - -// Declare item bounding box for clipping and interaction. -// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface -// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction. -bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGuiItemFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Set item data - // (DisplayRect is left untouched, made valid when ImGuiItemStatusFlags_HasDisplayRect is set) - g.LastItemData.ID = id; - g.LastItemData.Rect = bb; - g.LastItemData.NavRect = nav_bb_arg ? *nav_bb_arg : bb; - g.LastItemData.InFlags = g.CurrentItemFlags | extra_flags; - g.LastItemData.StatusFlags = ImGuiItemStatusFlags_None; - - // Directional navigation processing - if (id != 0) - { - KeepAliveID(id); - - // Runs prior to clipping early-out - // (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget - // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests - // unfortunately, but it is still limited to one window. It may not scale very well for windows with ten of - // thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame. - // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able - // to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick). - // We intentionally don't check if g.NavWindow != NULL because g.NavAnyRequest should only be set when it is non null. - // If we crash on a NULL g.NavWindow we need to fix the bug elsewhere. - window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent); - if (g.NavId == id || g.NavAnyRequest) - if (g.NavWindow->RootWindowForNav == window->RootWindowForNav) - if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened)) - NavProcessItem(); - - // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something". - // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something". - // READ THE FAQ: https://dearimgui.org/faq - IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!"); - - // [DEBUG] Item Picker tool, when enabling the "extended" version we perform the check in ItemAdd() -#ifdef IMGUI_DEBUG_TOOL_ITEM_PICKER_EX - if (id == g.DebugItemPickerBreakId) - { - IM_DEBUG_BREAK(); - g.DebugItemPickerBreakId = 0; - } -#endif - } - g.NextItemData.Flags = ImGuiNextItemDataFlags_None; - -#ifdef IMGUI_ENABLE_TEST_ENGINE - if (id != 0) - IMGUI_TEST_ENGINE_ITEM_ADD(nav_bb_arg ? *nav_bb_arg : bb, id); -#endif - - // Clipping test - const bool is_clipped = IsClippedEx(bb, id); - if (is_clipped) - return false; - //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] - - // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) - if (IsMouseHoveringRect(bb.Min, bb.Max)) - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; - return true; -} - -// Gets back to previous line and continue with horizontal layout -// offset_from_start_x == 0 : follow right after previous item -// offset_from_start_x != 0 : align to specified x position (relative to window/group left) -// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0 -// spacing_w >= 0 : enforce spacing amount -void ImGui::SameLine(float offset_from_start_x, float spacing_w) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - if (offset_from_start_x != 0.0f) - { - if (spacing_w < 0.0f) - spacing_w = 0.0f; - window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + offset_from_start_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x; - window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; - } - else - { - if (spacing_w < 0.0f) - spacing_w = g.Style.ItemSpacing.x; - window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w; - window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; - } - window->DC.CurrLineSize = window->DC.PrevLineSize; - window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; - window->DC.IsSameLine = true; -} - -ImVec2 ImGui::GetCursorScreenPos() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos; -} - -void ImGui::SetCursorScreenPos(const ImVec2& pos) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos = pos; - window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); -} - -// User generally sees positions in window coordinates. Internally we store CursorPos in absolute screen coordinates because it is more convenient. -// Conversion happens as we pass the value to user, but it makes our naming convention confusing because GetCursorPos() == (DC.CursorPos - window.Pos). May want to rename 'DC.CursorPos'. -ImVec2 ImGui::GetCursorPos() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos - window->Pos + window->Scroll; -} - -float ImGui::GetCursorPosX() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos.x - window->Pos.x + window->Scroll.x; -} - -float ImGui::GetCursorPosY() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorPos.y - window->Pos.y + window->Scroll.y; -} - -void ImGui::SetCursorPos(const ImVec2& local_pos) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos = window->Pos - window->Scroll + local_pos; - window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); -} - -void ImGui::SetCursorPosX(float x) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + x; - window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPos.x); -} - -void ImGui::SetCursorPosY(float y) -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.CursorPos.y = window->Pos.y - window->Scroll.y + y; - window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y); -} - -ImVec2 ImGui::GetCursorStartPos() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CursorStartPos - window->Pos; -} - -void ImGui::Indent(float indent_w) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - window->DC.Indent.x += (indent_w != 0.0f) ? indent_w : g.Style.IndentSpacing; - window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x; -} - -void ImGui::Unindent(float indent_w) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - window->DC.Indent.x -= (indent_w != 0.0f) ? indent_w : g.Style.IndentSpacing; - window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x; -} - -// Affect large frame+labels widgets only. -void ImGui::SetNextItemWidth(float item_width) -{ - ImGuiContext& g = *GImGui; - g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasWidth; - g.NextItemData.Width = item_width; -} - -// FIXME: Remove the == 0.0f behavior? -void ImGui::PushItemWidth(float item_width) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width - window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width); - g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; -} - -void ImGui::PushMultiItemsWidths(int components, float w_full) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const ImGuiStyle& style = g.Style; - const float w_item_one = ImMax(1.0f, IM_FLOOR((w_full - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); - const float w_item_last = ImMax(1.0f, IM_FLOOR(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); - window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width - window->DC.ItemWidthStack.push_back(w_item_last); - for (int i = 0; i < components - 2; i++) - window->DC.ItemWidthStack.push_back(w_item_one); - window->DC.ItemWidth = (components == 1) ? w_item_last : w_item_one; - g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; -} - -void ImGui::PopItemWidth() -{ - ImGuiWindow* window = GetCurrentWindow(); - window->DC.ItemWidth = window->DC.ItemWidthStack.back(); - window->DC.ItemWidthStack.pop_back(); -} - -// Calculate default item width given value passed to PushItemWidth() or SetNextItemWidth(). -// The SetNextItemWidth() data is generally cleared/consumed by ItemAdd() or NextItemData.ClearFlags() -float ImGui::CalcItemWidth() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - float w; - if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth) - w = g.NextItemData.Width; - else - w = window->DC.ItemWidth; - if (w < 0.0f) - { - float region_max_x = GetContentRegionMaxAbs().x; - w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w); - } - w = IM_FLOOR(w); - return w; -} - -// [Internal] Calculate full item size given user provided 'size' parameter and default width/height. Default width is often == CalcItemWidth(). -// Those two functions CalcItemWidth vs CalcItemSize are awkwardly named because they are not fully symmetrical. -// Note that only CalcItemWidth() is publicly exposed. -// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable) -ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - ImVec2 region_max; - if (size.x < 0.0f || size.y < 0.0f) - region_max = GetContentRegionMaxAbs(); - - if (size.x == 0.0f) - size.x = default_w; - else if (size.x < 0.0f) - size.x = ImMax(4.0f, region_max.x - window->DC.CursorPos.x + size.x); - - if (size.y == 0.0f) - size.y = default_h; - else if (size.y < 0.0f) - size.y = ImMax(4.0f, region_max.y - window->DC.CursorPos.y + size.y); - - return size; -} - -float ImGui::GetTextLineHeight() -{ - ImGuiContext& g = *GImGui; - return g.FontSize; -} - -float ImGui::GetTextLineHeightWithSpacing() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.ItemSpacing.y; -} - -float ImGui::GetFrameHeight() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.FramePadding.y * 2.0f; -} - -float ImGui::GetFrameHeightWithSpacing() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + g.Style.FramePadding.y * 2.0f + g.Style.ItemSpacing.y; -} - -// FIXME: All the Contents Region function are messy or misleading. WE WILL AIM TO OBSOLETE ALL OF THEM WITH A NEW "WORK RECT" API. Thanks for your patience! - -// FIXME: This is in window space (not screen space!). -ImVec2 ImGui::GetContentRegionMax() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImVec2 mx = window->ContentRegionRect.Max - window->Pos; - if (window->DC.CurrentColumns || g.CurrentTable) - mx.x = window->WorkRect.Max.x - window->Pos.x; - return mx; -} - -// [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features. -ImVec2 ImGui::GetContentRegionMaxAbs() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImVec2 mx = window->ContentRegionRect.Max; - if (window->DC.CurrentColumns || g.CurrentTable) - mx.x = window->WorkRect.Max.x; - return mx; -} - -ImVec2 ImGui::GetContentRegionAvail() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return GetContentRegionMaxAbs() - window->DC.CursorPos; -} - -// In window space (not screen space!) -ImVec2 ImGui::GetWindowContentRegionMin() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ContentRegionRect.Min - window->Pos; -} - -ImVec2 ImGui::GetWindowContentRegionMax() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ContentRegionRect.Max - window->Pos; -} - -// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) -// Groups are currently a mishmash of functionalities which should perhaps be clarified and separated. -// FIXME-OPT: Could we safely early out on ->SkipItems? -void ImGui::BeginGroup() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - g.GroupStack.resize(g.GroupStack.Size + 1); - ImGuiGroupData& group_data = g.GroupStack.back(); - group_data.WindowID = window->ID; - group_data.BackupCursorPos = window->DC.CursorPos; - group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; - group_data.BackupIndent = window->DC.Indent; - group_data.BackupGroupOffset = window->DC.GroupOffset; - group_data.BackupCurrLineSize = window->DC.CurrLineSize; - group_data.BackupCurrLineTextBaseOffset = window->DC.CurrLineTextBaseOffset; - group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive; - group_data.BackupHoveredIdIsAlive = g.HoveredId != 0; - group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive; - group_data.EmitItem = true; - - window->DC.GroupOffset.x = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffset.x; - window->DC.Indent = window->DC.GroupOffset; - window->DC.CursorMaxPos = window->DC.CursorPos; - window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); - if (g.LogEnabled) - g.LogLinePosY = -FLT_MAX; // To enforce a carriage return -} - -void ImGui::EndGroup() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(g.GroupStack.Size > 0); // Mismatched BeginGroup()/EndGroup() calls - - ImGuiGroupData& group_data = g.GroupStack.back(); - IM_ASSERT(group_data.WindowID == window->ID); // EndGroup() in wrong window? - - ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos)); - - window->DC.CursorPos = group_data.BackupCursorPos; - window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos); - window->DC.Indent = group_data.BackupIndent; - window->DC.GroupOffset = group_data.BackupGroupOffset; - window->DC.CurrLineSize = group_data.BackupCurrLineSize; - window->DC.CurrLineTextBaseOffset = group_data.BackupCurrLineTextBaseOffset; - if (g.LogEnabled) - g.LogLinePosY = -FLT_MAX; // To enforce a carriage return - - if (!group_data.EmitItem) - { - g.GroupStack.pop_back(); - return; - } - - window->DC.CurrLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now. - ItemSize(group_bb.GetSize()); - ItemAdd(group_bb, 0, NULL, ImGuiItemFlags_NoTabStop); - - // If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive(), IsItemDeactivated() etc. will be functional on the entire group. - // It would be be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but would put a little more burden on individual widgets. - // Also if you grep for LastItemId you'll notice it is only used in that context. - // (The two tests not the same because ActiveIdIsAlive is an ID itself, in order to be able to handle ActiveId being overwritten during the frame.) - const bool group_contains_curr_active_id = (group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId; - const bool group_contains_prev_active_id = (group_data.BackupActiveIdPreviousFrameIsAlive == false) && (g.ActiveIdPreviousFrameIsAlive == true); - if (group_contains_curr_active_id) - g.LastItemData.ID = g.ActiveId; - else if (group_contains_prev_active_id) - g.LastItemData.ID = g.ActiveIdPreviousFrame; - g.LastItemData.Rect = group_bb; - - // Forward Hovered flag - const bool group_contains_curr_hovered_id = (group_data.BackupHoveredIdIsAlive == false) && g.HoveredId != 0; - if (group_contains_curr_hovered_id) - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; - - // Forward Edited flag - if (group_contains_curr_active_id && g.ActiveIdHasBeenEditedThisFrame) - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Edited; - - // Forward Deactivated flag - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDeactivated; - if (group_contains_prev_active_id && g.ActiveId != g.ActiveIdPreviousFrame) - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Deactivated; - - g.GroupStack.pop_back(); - //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] -} - - -//----------------------------------------------------------------------------- -// [SECTION] SCROLLING -//----------------------------------------------------------------------------- - -// Helper to snap on edges when aiming at an item very close to the edge, -// So the difference between WindowPadding and ItemSpacing will be in the visible area after scrolling. -// When we refactor the scrolling API this may be configurable with a flag? -// Note that the effect for this won't be visible on X axis with default Style settings as WindowPadding.x == ItemSpacing.x by default. -static float CalcScrollEdgeSnap(float target, float snap_min, float snap_max, float snap_threshold, float center_ratio) -{ - if (target <= snap_min + snap_threshold) - return ImLerp(snap_min, target, center_ratio); - if (target >= snap_max - snap_threshold) - return ImLerp(target, snap_max, center_ratio); - return target; -} - -static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window) -{ - ImVec2 scroll = window->Scroll; - if (window->ScrollTarget.x < FLT_MAX) - { - float decoration_total_width = window->ScrollbarSizes.x; - float center_x_ratio = window->ScrollTargetCenterRatio.x; - float scroll_target_x = window->ScrollTarget.x; - if (window->ScrollTargetEdgeSnapDist.x > 0.0f) - { - float snap_x_min = 0.0f; - float snap_x_max = window->ScrollMax.x + window->SizeFull.x - decoration_total_width; - scroll_target_x = CalcScrollEdgeSnap(scroll_target_x, snap_x_min, snap_x_max, window->ScrollTargetEdgeSnapDist.x, center_x_ratio); - } - scroll.x = scroll_target_x - center_x_ratio * (window->SizeFull.x - decoration_total_width); - } - if (window->ScrollTarget.y < FLT_MAX) - { - float decoration_total_height = window->TitleBarHeight() + window->MenuBarHeight() + window->ScrollbarSizes.y; - float center_y_ratio = window->ScrollTargetCenterRatio.y; - float scroll_target_y = window->ScrollTarget.y; - if (window->ScrollTargetEdgeSnapDist.y > 0.0f) - { - float snap_y_min = 0.0f; - float snap_y_max = window->ScrollMax.y + window->SizeFull.y - decoration_total_height; - scroll_target_y = CalcScrollEdgeSnap(scroll_target_y, snap_y_min, snap_y_max, window->ScrollTargetEdgeSnapDist.y, center_y_ratio); - } - scroll.y = scroll_target_y - center_y_ratio * (window->SizeFull.y - decoration_total_height); - } - scroll.x = IM_FLOOR(ImMax(scroll.x, 0.0f)); - scroll.y = IM_FLOOR(ImMax(scroll.y, 0.0f)); - if (!window->Collapsed && !window->SkipItems) - { - scroll.x = ImMin(scroll.x, window->ScrollMax.x); - scroll.y = ImMin(scroll.y, window->ScrollMax.y); - } - return scroll; -} - -void ImGui::ScrollToItem(ImGuiScrollFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ScrollToRectEx(window, g.LastItemData.NavRect, flags); -} - -void ImGui::ScrollToRect(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags) -{ - ScrollToRectEx(window, item_rect, flags); -} - -// Scroll to keep newly navigated item fully into view -ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags) -{ - ImGuiContext& g = *GImGui; - ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)); - //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG] - - // Check that only one behavior is selected per axis - IM_ASSERT((flags & ImGuiScrollFlags_MaskX_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskX_)); - IM_ASSERT((flags & ImGuiScrollFlags_MaskY_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskY_)); - - // Defaults - ImGuiScrollFlags in_flags = flags; - if ((flags & ImGuiScrollFlags_MaskX_) == 0 && window->ScrollbarX) - flags |= ImGuiScrollFlags_KeepVisibleEdgeX; - if ((flags & ImGuiScrollFlags_MaskY_) == 0) - flags |= window->Appearing ? ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeY; - - const bool fully_visible_x = item_rect.Min.x >= window_rect.Min.x && item_rect.Max.x <= window_rect.Max.x; - const bool fully_visible_y = item_rect.Min.y >= window_rect.Min.y && item_rect.Max.y <= window_rect.Max.y; - const bool can_be_fully_visible_x = (item_rect.GetWidth() + g.Style.ItemSpacing.x * 2.0f) <= window_rect.GetWidth(); - const bool can_be_fully_visible_y = (item_rect.GetHeight() + g.Style.ItemSpacing.y * 2.0f) <= window_rect.GetHeight(); - - if ((flags & ImGuiScrollFlags_KeepVisibleEdgeX) && !fully_visible_x) - { - if (item_rect.Min.x < window_rect.Min.x || !can_be_fully_visible_x) - SetScrollFromPosX(window, item_rect.Min.x - g.Style.ItemSpacing.x - window->Pos.x, 0.0f); - else if (item_rect.Max.x >= window_rect.Max.x) - SetScrollFromPosX(window, item_rect.Max.x + g.Style.ItemSpacing.x - window->Pos.x, 1.0f); - } - else if (((flags & ImGuiScrollFlags_KeepVisibleCenterX) && !fully_visible_x) || (flags & ImGuiScrollFlags_AlwaysCenterX)) - { - float target_x = can_be_fully_visible_x ? ImFloor((item_rect.Min.x + item_rect.Max.x - window->InnerRect.GetWidth()) * 0.5f) : item_rect.Min.x; - SetScrollFromPosX(window, target_x - window->Pos.x, 0.0f); - } - - if ((flags & ImGuiScrollFlags_KeepVisibleEdgeY) && !fully_visible_y) - { - if (item_rect.Min.y < window_rect.Min.y || !can_be_fully_visible_y) - SetScrollFromPosY(window, item_rect.Min.y - g.Style.ItemSpacing.y - window->Pos.y, 0.0f); - else if (item_rect.Max.y >= window_rect.Max.y) - SetScrollFromPosY(window, item_rect.Max.y + g.Style.ItemSpacing.y - window->Pos.y, 1.0f); - } - else if (((flags & ImGuiScrollFlags_KeepVisibleCenterY) && !fully_visible_y) || (flags & ImGuiScrollFlags_AlwaysCenterY)) - { - float target_y = can_be_fully_visible_y ? ImFloor((item_rect.Min.y + item_rect.Max.y - window->InnerRect.GetHeight()) * 0.5f) : item_rect.Min.y; - SetScrollFromPosY(window, target_y - window->Pos.y, 0.0f); - } - - ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); - ImVec2 delta_scroll = next_scroll - window->Scroll; - - // Also scroll parent window to keep us into view if necessary - if (!(flags & ImGuiScrollFlags_NoScrollParent) && (window->Flags & ImGuiWindowFlags_ChildWindow)) - { - // FIXME-SCROLL: May be an option? - if ((in_flags & (ImGuiScrollFlags_AlwaysCenterX | ImGuiScrollFlags_KeepVisibleCenterX)) != 0) - in_flags = (in_flags & ~ImGuiScrollFlags_MaskX_) | ImGuiScrollFlags_KeepVisibleEdgeX; - if ((in_flags & (ImGuiScrollFlags_AlwaysCenterY | ImGuiScrollFlags_KeepVisibleCenterY)) != 0) - in_flags = (in_flags & ~ImGuiScrollFlags_MaskY_) | ImGuiScrollFlags_KeepVisibleEdgeY; - delta_scroll += ScrollToRectEx(window->ParentWindow, ImRect(item_rect.Min - delta_scroll, item_rect.Max - delta_scroll), in_flags); - } - - return delta_scroll; -} - -float ImGui::GetScrollX() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->Scroll.x; -} - -float ImGui::GetScrollY() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->Scroll.y; -} - -float ImGui::GetScrollMaxX() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ScrollMax.x; -} - -float ImGui::GetScrollMaxY() -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ScrollMax.y; -} - -void ImGui::SetScrollX(ImGuiWindow* window, float scroll_x) -{ - window->ScrollTarget.x = scroll_x; - window->ScrollTargetCenterRatio.x = 0.0f; - window->ScrollTargetEdgeSnapDist.x = 0.0f; -} - -void ImGui::SetScrollY(ImGuiWindow* window, float scroll_y) -{ - window->ScrollTarget.y = scroll_y; - window->ScrollTargetCenterRatio.y = 0.0f; - window->ScrollTargetEdgeSnapDist.y = 0.0f; -} - -void ImGui::SetScrollX(float scroll_x) -{ - ImGuiContext& g = *GImGui; - SetScrollX(g.CurrentWindow, scroll_x); -} - -void ImGui::SetScrollY(float scroll_y) -{ - ImGuiContext& g = *GImGui; - SetScrollY(g.CurrentWindow, scroll_y); -} - -// Note that a local position will vary depending on initial scroll value, -// This is a little bit confusing so bear with us: -// - local_pos = (absolution_pos - window->Pos) -// - So local_x/local_y are 0.0f for a position at the upper-left corner of a window, -// and generally local_x/local_y are >(padding+decoration) && <(size-padding-decoration) when in the visible area. -// - They mostly exists because of legacy API. -// Following the rules above, when trying to work with scrolling code, consider that: -// - SetScrollFromPosY(0.0f) == SetScrollY(0.0f + scroll.y) == has no effect! -// - SetScrollFromPosY(-scroll.y) == SetScrollY(-scroll.y + scroll.y) == SetScrollY(0.0f) == reset scroll. Of course writing SetScrollY(0.0f) directly then makes more sense -// We store a target position so centering and clamping can occur on the next frame when we are guaranteed to have a known window size -void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio) -{ - IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f); - window->ScrollTarget.x = IM_FLOOR(local_x + window->Scroll.x); // Convert local position to scroll offset - window->ScrollTargetCenterRatio.x = center_x_ratio; - window->ScrollTargetEdgeSnapDist.x = 0.0f; -} - -void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio) -{ - IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f); - const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect; - local_y -= decoration_up_height; - window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y); // Convert local position to scroll offset - window->ScrollTargetCenterRatio.y = center_y_ratio; - window->ScrollTargetEdgeSnapDist.y = 0.0f; -} - -void ImGui::SetScrollFromPosX(float local_x, float center_x_ratio) -{ - ImGuiContext& g = *GImGui; - SetScrollFromPosX(g.CurrentWindow, local_x, center_x_ratio); -} - -void ImGui::SetScrollFromPosY(float local_y, float center_y_ratio) -{ - ImGuiContext& g = *GImGui; - SetScrollFromPosY(g.CurrentWindow, local_y, center_y_ratio); -} - -// center_x_ratio: 0.0f left of last item, 0.5f horizontal center of last item, 1.0f right of last item. -void ImGui::SetScrollHereX(float center_x_ratio) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - float spacing_x = ImMax(window->WindowPadding.x, g.Style.ItemSpacing.x); - float target_pos_x = ImLerp(g.LastItemData.Rect.Min.x - spacing_x, g.LastItemData.Rect.Max.x + spacing_x, center_x_ratio); - SetScrollFromPosX(window, target_pos_x - window->Pos.x, center_x_ratio); // Convert from absolute to local pos - - // Tweak: snap on edges when aiming at an item very close to the edge - window->ScrollTargetEdgeSnapDist.x = ImMax(0.0f, window->WindowPadding.x - spacing_x); -} - -// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item. -void ImGui::SetScrollHereY(float center_y_ratio) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - float spacing_y = ImMax(window->WindowPadding.y, g.Style.ItemSpacing.y); - float target_pos_y = ImLerp(window->DC.CursorPosPrevLine.y - spacing_y, window->DC.CursorPosPrevLine.y + window->DC.PrevLineSize.y + spacing_y, center_y_ratio); - SetScrollFromPosY(window, target_pos_y - window->Pos.y, center_y_ratio); // Convert from absolute to local pos - - // Tweak: snap on edges when aiming at an item very close to the edge - window->ScrollTargetEdgeSnapDist.y = ImMax(0.0f, window->WindowPadding.y - spacing_y); -} - -//----------------------------------------------------------------------------- -// [SECTION] TOOLTIPS -//----------------------------------------------------------------------------- - -void ImGui::BeginTooltip() -{ - BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); -} - -void ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags) -{ - ImGuiContext& g = *GImGui; - - if (g.DragDropWithinSource || g.DragDropWithinTarget) - { - // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor) - // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor. - // Whatever we do we want to call SetNextWindowPos() to enforce a tooltip position and disable clipping the tooltip without our display area, like regular tooltip do. - //ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding; - ImVec2 tooltip_pos = g.IO.MousePos + ImVec2(16 * g.Style.MouseCursorScale, 8 * g.Style.MouseCursorScale); - SetNextWindowPos(tooltip_pos); - SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f); - //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :( - tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip; - } - - char window_name[16]; - ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); - if (tooltip_flags & ImGuiTooltipFlags_OverridePreviousTooltip) - if (ImGuiWindow* window = FindWindowByName(window_name)) - if (window->Active) - { - // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one. - window->Hidden = true; - window->HiddenFramesCanSkipItems = 1; // FIXME: This may not be necessary? - ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount); - } - ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize; - Begin(window_name, NULL, flags | extra_window_flags); -} - -void ImGui::EndTooltip() -{ - IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip); // Mismatched BeginTooltip()/EndTooltip() calls - End(); -} - -void ImGui::SetTooltipV(const char* fmt, va_list args) -{ - BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None); - TextV(fmt, args); - EndTooltip(); -} - -void ImGui::SetTooltip(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - SetTooltipV(fmt, args); - va_end(args); -} - -//----------------------------------------------------------------------------- -// [SECTION] POPUPS -//----------------------------------------------------------------------------- - -// Supported flags: ImGuiPopupFlags_AnyPopupId, ImGuiPopupFlags_AnyPopupLevel -bool ImGui::IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags) -{ - ImGuiContext& g = *GImGui; - if (popup_flags & ImGuiPopupFlags_AnyPopupId) - { - // Return true if any popup is open at the current BeginPopup() level of the popup stack - // This may be used to e.g. test for another popups already opened to handle popups priorities at the same level. - IM_ASSERT(id == 0); - if (popup_flags & ImGuiPopupFlags_AnyPopupLevel) - return g.OpenPopupStack.Size > 0; - else - return g.OpenPopupStack.Size > g.BeginPopupStack.Size; - } - else - { - if (popup_flags & ImGuiPopupFlags_AnyPopupLevel) - { - // Return true if the popup is open anywhere in the popup stack - for (int n = 0; n < g.OpenPopupStack.Size; n++) - if (g.OpenPopupStack[n].PopupId == id) - return true; - return false; - } - else - { - // Return true if the popup is open at the current BeginPopup() level of the popup stack (this is the most-common query) - return g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].PopupId == id; - } - } -} - -bool ImGui::IsPopupOpen(const char* str_id, ImGuiPopupFlags popup_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiID id = (popup_flags & ImGuiPopupFlags_AnyPopupId) ? 0 : g.CurrentWindow->GetID(str_id); - if ((popup_flags & ImGuiPopupFlags_AnyPopupLevel) && id != 0) - IM_ASSERT(0 && "Cannot use IsPopupOpen() with a string id and ImGuiPopupFlags_AnyPopupLevel."); // But non-string version is legal and used internally - return IsPopupOpen(id, popup_flags); -} - -ImGuiWindow* ImGui::GetTopMostPopupModal() -{ - ImGuiContext& g = *GImGui; - for (int n = g.OpenPopupStack.Size - 1; n >= 0; n--) - if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window) - if (popup->Flags & ImGuiWindowFlags_Modal) - return popup; - return NULL; -} - -ImGuiWindow* ImGui::GetTopMostAndVisiblePopupModal() -{ - ImGuiContext& g = *GImGui; - for (int n = g.OpenPopupStack.Size - 1; n >= 0; n--) - if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window) - if ((popup->Flags & ImGuiWindowFlags_Modal) && IsWindowActiveAndVisible(popup)) - return popup; - return NULL; -} - -void ImGui::OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiID id = g.CurrentWindow->GetID(str_id); - IMGUI_DEBUG_LOG_POPUP("[popup] OpenPopup(\"%s\" -> 0x%08X\n", str_id, id); - OpenPopupEx(id, popup_flags); -} - -void ImGui::OpenPopup(ImGuiID id, ImGuiPopupFlags popup_flags) -{ - OpenPopupEx(id, popup_flags); -} - -// Mark popup as open (toggle toward open state). -// Popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. -// Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). -// One open popup per level of the popup hierarchy (NB: when assigning we reset the Window member of ImGuiPopupRef to NULL) -void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* parent_window = g.CurrentWindow; - const int current_stack_size = g.BeginPopupStack.Size; - - if (popup_flags & ImGuiPopupFlags_NoOpenOverExistingPopup) - if (IsPopupOpen(0u, ImGuiPopupFlags_AnyPopupId)) - return; - - ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack. - popup_ref.PopupId = id; - popup_ref.Window = NULL; - popup_ref.SourceWindow = g.NavWindow; - popup_ref.OpenFrameCount = g.FrameCount; - popup_ref.OpenParentId = parent_window->IDStack.back(); - popup_ref.OpenPopupPos = NavCalcPreferredRefPos(); - popup_ref.OpenMousePos = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : popup_ref.OpenPopupPos; - - IMGUI_DEBUG_LOG_POPUP("[popup] OpenPopupEx(0x%08X)\n", id); - if (g.OpenPopupStack.Size < current_stack_size + 1) - { - g.OpenPopupStack.push_back(popup_ref); - } - else - { - // Gently handle the user mistakenly calling OpenPopup() every frame. It is a programming mistake! However, if we were to run the regular code path, the ui - // would become completely unusable because the popup will always be in hidden-while-calculating-size state _while_ claiming focus. Which would be a very confusing - // situation for the programmer. Instead, we silently allow the popup to proceed, it will keep reappearing and the programming error will be more obvious to understand. - if (g.OpenPopupStack[current_stack_size].PopupId == id && g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) - { - g.OpenPopupStack[current_stack_size].OpenFrameCount = popup_ref.OpenFrameCount; - } - else - { - // Close child popups if any, then flag popup for open/reopen - ClosePopupToLevel(current_stack_size, false); - g.OpenPopupStack.push_back(popup_ref); - } - - // When reopening a popup we first refocus its parent, otherwise if its parent is itself a popup it would get closed by ClosePopupsOverWindow(). - // This is equivalent to what ClosePopupToLevel() does. - //if (g.OpenPopupStack[current_stack_size].PopupId == id) - // FocusWindow(parent_window); - } -} - -// When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it. -// This function closes any popups that are over 'ref_window'. -void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup) -{ - ImGuiContext& g = *GImGui; - if (g.OpenPopupStack.Size == 0) - return; - - // Don't close our own child popup windows. - int popup_count_to_keep = 0; - if (ref_window) - { - // Find the highest popup which is a descendant of the reference window (generally reference window = NavWindow) - for (; popup_count_to_keep < g.OpenPopupStack.Size; popup_count_to_keep++) - { - ImGuiPopupData& popup = g.OpenPopupStack[popup_count_to_keep]; - if (!popup.Window) - continue; - IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0); - if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow) - continue; - - // Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow) - // - With this stack of window, clicking/focusing Popup1 will close Popup2 and Popup3: - // Window -> Popup1 -> Popup2 -> Popup3 - // - Each popups may contain child windows, which is why we compare ->RootWindow! - // Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child - bool ref_window_is_descendent_of_popup = false; - for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++) - if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window) - if (IsWindowWithinBeginStackOf(ref_window, popup_window)) - { - ref_window_is_descendent_of_popup = true; - break; - } - if (!ref_window_is_descendent_of_popup) - break; - } - } - if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below - { - IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupsOverWindow(\"%s\")\n", ref_window ? ref_window->Name : ""); - ClosePopupToLevel(popup_count_to_keep, restore_focus_to_window_under_popup); - } -} - -void ImGui::ClosePopupsExceptModals() -{ - ImGuiContext& g = *GImGui; - - int popup_count_to_keep; - for (popup_count_to_keep = g.OpenPopupStack.Size; popup_count_to_keep > 0; popup_count_to_keep--) - { - ImGuiWindow* window = g.OpenPopupStack[popup_count_to_keep - 1].Window; - if (!window || window->Flags & ImGuiWindowFlags_Modal) - break; - } - if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below - ClosePopupToLevel(popup_count_to_keep, true); -} - -void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup) -{ - ImGuiContext& g = *GImGui; - IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_focus_to_window_under_popup=%d\n", remaining, restore_focus_to_window_under_popup); - IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size); - - // Trim open popup stack - ImGuiWindow* focus_window = g.OpenPopupStack[remaining].SourceWindow; - ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window; - g.OpenPopupStack.resize(remaining); - - if (restore_focus_to_window_under_popup) - { - if (focus_window && !focus_window->WasActive && popup_window) - { - // Fallback - FocusTopMostWindowUnderOne(popup_window, NULL); - } - else - { - if (g.NavLayer == ImGuiNavLayer_Main && focus_window) - focus_window = NavRestoreLastChildNavWindow(focus_window); - FocusWindow(focus_window); - } - } -} - -// Close the popup we have begin-ed into. -void ImGui::CloseCurrentPopup() -{ - ImGuiContext& g = *GImGui; - int popup_idx = g.BeginPopupStack.Size - 1; - if (popup_idx < 0 || popup_idx >= g.OpenPopupStack.Size || g.BeginPopupStack[popup_idx].PopupId != g.OpenPopupStack[popup_idx].PopupId) - return; - - // Closing a menu closes its top-most parent popup (unless a modal) - while (popup_idx > 0) - { - ImGuiWindow* popup_window = g.OpenPopupStack[popup_idx].Window; - ImGuiWindow* parent_popup_window = g.OpenPopupStack[popup_idx - 1].Window; - bool close_parent = false; - if (popup_window && (popup_window->Flags & ImGuiWindowFlags_ChildMenu)) - if (parent_popup_window && !(parent_popup_window->Flags & ImGuiWindowFlags_MenuBar)) - close_parent = true; - if (!close_parent) - break; - popup_idx--; - } - IMGUI_DEBUG_LOG_POPUP("[popup] CloseCurrentPopup %d -> %d\n", g.BeginPopupStack.Size - 1, popup_idx); - ClosePopupToLevel(popup_idx, true); - - // A common pattern is to close a popup when selecting a menu item/selectable that will open another window. - // To improve this usage pattern, we avoid nav highlight for a single frame in the parent window. - // Similarly, we could avoid mouse hover highlight in this window but it is less visually problematic. - if (ImGuiWindow* window = g.NavWindow) - window->DC.NavHideHighlightOneFrame = true; -} - -// Attention! BeginPopup() adds default flags which BeginPopupEx()! -bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - if (!IsPopupOpen(id, ImGuiPopupFlags_None)) - { - g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values - return false; - } - - char name[20]; - if (flags & ImGuiWindowFlags_ChildMenu) - ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuCount); // Recycle windows based on depth - else - ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame - - flags |= ImGuiWindowFlags_Popup; - bool is_open = Begin(name, NULL, flags); - if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display) - EndPopup(); - - return is_open; -} - -bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - if (g.OpenPopupStack.Size <= g.BeginPopupStack.Size) // Early out for performance - { - g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values - return false; - } - flags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings; - ImGuiID id = g.CurrentWindow->GetID(str_id); - return BeginPopupEx(id, flags); -} - -// If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup. -// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here. -bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const ImGuiID id = window->GetID(name); - if (!IsPopupOpen(id, ImGuiPopupFlags_None)) - { - g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values - return false; - } - - // Center modal windows by default for increased visibility - // (this won't really last as settings will kick in, and is mostly for backward compatibility. user may do the same themselves) - // FIXME: Should test for (PosCond & window->SetWindowPosAllowFlags) with the upcoming window. - if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) == 0) - { - const ImGuiViewport* viewport = GetMainViewport(); - SetNextWindowPos(viewport->GetCenter(), ImGuiCond_FirstUseEver, ImVec2(0.5f, 0.5f)); - } - - flags |= ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse; - const bool is_open = Begin(name, p_open, flags); - if (!is_open || (p_open && !*p_open)) // NB: is_open can be 'false' when the popup is completely clipped (e.g. zero size display) - { - EndPopup(); - if (is_open) - ClosePopupToLevel(g.BeginPopupStack.Size, true); - return false; - } - return is_open; -} - -void ImGui::EndPopup() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls - IM_ASSERT(g.BeginPopupStack.Size > 0); - - // Make all menus and popups wrap around for now, may need to expose that policy (e.g. focus scope could include wrap/loop policy flags used by new move requests) - if (g.NavWindow == window) - NavMoveRequestTryWrapping(window, ImGuiNavMoveFlags_LoopY); - - // Child-popups don't need to be laid out - IM_ASSERT(g.WithinEndChild == false); - if (window->Flags & ImGuiWindowFlags_ChildWindow) - g.WithinEndChild = true; - End(); - g.WithinEndChild = false; -} - -// Helper to open a popup if mouse button is released over the item -// - This is essentially the same as BeginPopupContextItem() but without the trailing BeginPopup() -void ImGui::OpenPopupOnItemClick(const char* str_id, ImGuiPopupFlags popup_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); - if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - { - ImGuiID id = str_id ? window->GetID(str_id) : g.LastItemData.ID; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! - IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) - OpenPopupEx(id, popup_flags); - } -} - -// This is a helper to handle the simplest case of associating one named popup to one given widget. -// - To create a popup associated to the last item, you generally want to pass a NULL value to str_id. -// - To create a popup with a specific identifier, pass it in str_id. -// - This is useful when using using BeginPopupContextItem() on an item which doesn't have an identifier, e.g. a Text() call. -// - This is useful when multiple code locations may want to manipulate/open the same popup, given an explicit id. -// - You may want to handle the whole on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters). -// This is essentially the same as: -// id = str_id ? GetID(str_id) : GetItemID(); -// OpenPopupOnItemClick(str_id, ImGuiPopupFlags_MouseButtonRight); -// return BeginPopup(id); -// Which is essentially the same as: -// id = str_id ? GetID(str_id) : GetItemID(); -// if (IsItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) -// OpenPopup(id); -// return BeginPopup(id); -// The main difference being that this is tweaked to avoid computing the ID twice. -bool ImGui::BeginPopupContextItem(const char* str_id, ImGuiPopupFlags popup_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - ImGuiID id = str_id ? window->GetID(str_id) : g.LastItemData.ID; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! - IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) - int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); - if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - OpenPopupEx(id, popup_flags); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); -} - -bool ImGui::BeginPopupContextWindow(const char* str_id, ImGuiPopupFlags popup_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (!str_id) - str_id = "window_context"; - ImGuiID id = window->GetID(str_id); - int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); - if (IsMouseReleased(mouse_button) && IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) - if (!(popup_flags & ImGuiPopupFlags_NoOpenOverItems) || !IsAnyItemHovered()) - OpenPopupEx(id, popup_flags); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); -} - -bool ImGui::BeginPopupContextVoid(const char* str_id, ImGuiPopupFlags popup_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (!str_id) - str_id = "void_context"; - ImGuiID id = window->GetID(str_id); - int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); - if (IsMouseReleased(mouse_button) && !IsWindowHovered(ImGuiHoveredFlags_AnyWindow)) - if (GetTopMostPopupModal() == NULL) - OpenPopupEx(id, popup_flags); - return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); -} - -// r_avoid = the rectangle to avoid (e.g. for tooltip it is a rectangle around the mouse cursor which we want to avoid. for popups it's a small point around the cursor.) -// r_outer = the visible area rectangle, minus safe area padding. If our popup size won't fit because of safe area padding we ignore it. -// (r_outer is usually equivalent to the viewport rectangle minus padding, but when multi-viewports are enabled and monitor -// information are available, it may represent the entire platform monitor from the frame of reference of the current viewport. -// this allows us to have tooltips/popups displayed out of the parent viewport.) -ImVec2 ImGui::FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy) -{ - ImVec2 base_pos_clamped = ImClamp(ref_pos, r_outer.Min, r_outer.Max - size); - //GetForegroundDrawList()->AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255,0,0,255)); - //GetForegroundDrawList()->AddRect(r_outer.Min, r_outer.Max, IM_COL32(0,255,0,255)); - - // Combo Box policy (we want a connecting edge) - if (policy == ImGuiPopupPositionPolicy_ComboBox) - { - const ImGuiDir dir_prefered_order[ImGuiDir_COUNT] = { ImGuiDir_Down, ImGuiDir_Right, ImGuiDir_Left, ImGuiDir_Up }; - for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_COUNT; n++) - { - const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; - if (n != -1 && dir == *last_dir) // Already tried this direction? - continue; - ImVec2 pos; - if (dir == ImGuiDir_Down) pos = ImVec2(r_avoid.Min.x, r_avoid.Max.y); // Below, Toward Right (default) - if (dir == ImGuiDir_Right) pos = ImVec2(r_avoid.Min.x, r_avoid.Min.y - size.y); // Above, Toward Right - if (dir == ImGuiDir_Left) pos = ImVec2(r_avoid.Max.x - size.x, r_avoid.Max.y); // Below, Toward Left - if (dir == ImGuiDir_Up) pos = ImVec2(r_avoid.Max.x - size.x, r_avoid.Min.y - size.y); // Above, Toward Left - if (!r_outer.Contains(ImRect(pos, pos + size))) - continue; - *last_dir = dir; - return pos; - } - } - - // Tooltip and Default popup policy - // (Always first try the direction we used on the last frame, if any) - if (policy == ImGuiPopupPositionPolicy_Tooltip || policy == ImGuiPopupPositionPolicy_Default) - { - const ImGuiDir dir_prefered_order[ImGuiDir_COUNT] = { ImGuiDir_Right, ImGuiDir_Down, ImGuiDir_Up, ImGuiDir_Left }; - for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_COUNT; n++) - { - const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; - if (n != -1 && dir == *last_dir) // Already tried this direction? - continue; - - const float avail_w = (dir == ImGuiDir_Left ? r_avoid.Min.x : r_outer.Max.x) - (dir == ImGuiDir_Right ? r_avoid.Max.x : r_outer.Min.x); - const float avail_h = (dir == ImGuiDir_Up ? r_avoid.Min.y : r_outer.Max.y) - (dir == ImGuiDir_Down ? r_avoid.Max.y : r_outer.Min.y); - - // If there not enough room on one axis, there's no point in positioning on a side on this axis (e.g. when not enough width, use a top/bottom position to maximize available width) - if (avail_w < size.x && (dir == ImGuiDir_Left || dir == ImGuiDir_Right)) - continue; - if (avail_h < size.y && (dir == ImGuiDir_Up || dir == ImGuiDir_Down)) - continue; - - ImVec2 pos; - pos.x = (dir == ImGuiDir_Left) ? r_avoid.Min.x - size.x : (dir == ImGuiDir_Right) ? r_avoid.Max.x : base_pos_clamped.x; - pos.y = (dir == ImGuiDir_Up) ? r_avoid.Min.y - size.y : (dir == ImGuiDir_Down) ? r_avoid.Max.y : base_pos_clamped.y; - - // Clamp top-left corner of popup - pos.x = ImMax(pos.x, r_outer.Min.x); - pos.y = ImMax(pos.y, r_outer.Min.y); - - *last_dir = dir; - return pos; - } - } - - // Fallback when not enough room: - *last_dir = ImGuiDir_None; - - // For tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible. - if (policy == ImGuiPopupPositionPolicy_Tooltip) - return ref_pos + ImVec2(2, 2); - - // Otherwise try to keep within display - ImVec2 pos = ref_pos; - pos.x = ImMax(ImMin(pos.x + size.x, r_outer.Max.x) - size.x, r_outer.Min.x); - pos.y = ImMax(ImMin(pos.y + size.y, r_outer.Max.y) - size.y, r_outer.Min.y); - return pos; -} - -// Note that this is used for popups, which can overlap the non work-area of individual viewports. -ImRect ImGui::GetPopupAllowedExtentRect(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - IM_UNUSED(window); - ImRect r_screen = ((ImGuiViewportP*)(void*)GetMainViewport())->GetMainRect(); - ImVec2 padding = g.Style.DisplaySafeAreaPadding; - r_screen.Expand(ImVec2((r_screen.GetWidth() > padding.x * 2) ? -padding.x : 0.0f, (r_screen.GetHeight() > padding.y * 2) ? -padding.y : 0.0f)); - return r_screen; -} - -ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - - ImRect r_outer = GetPopupAllowedExtentRect(window); - if (window->Flags & ImGuiWindowFlags_ChildMenu) - { - // Child menus typically request _any_ position within the parent menu item, and then we move the new menu outside the parent bounds. - // This is how we end up with child menus appearing (most-commonly) on the right of the parent menu. - IM_ASSERT(g.CurrentWindow == window); - ImGuiWindow* parent_window = g.CurrentWindowStack[g.CurrentWindowStack.Size - 2].Window; - float horizontal_overlap = g.Style.ItemInnerSpacing.x; // We want some overlap to convey the relative depth of each menu (currently the amount of overlap is hard-coded to style.ItemSpacing.x). - ImRect r_avoid; - if (parent_window->DC.MenuBarAppending) - r_avoid = ImRect(-FLT_MAX, parent_window->ClipRect.Min.y, FLT_MAX, parent_window->ClipRect.Max.y); // Avoid parent menu-bar. If we wanted multi-line menu-bar, we may instead want to have the calling window setup e.g. a NextWindowData.PosConstraintAvoidRect field - else - r_avoid = ImRect(parent_window->Pos.x + horizontal_overlap, -FLT_MAX, parent_window->Pos.x + parent_window->Size.x - horizontal_overlap - parent_window->ScrollbarSizes.x, FLT_MAX); - return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Default); - } - if (window->Flags & ImGuiWindowFlags_Popup) - { - return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, ImRect(window->Pos, window->Pos), ImGuiPopupPositionPolicy_Default); // Ideally we'd disable r_avoid here - } - if (window->Flags & ImGuiWindowFlags_Tooltip) - { - // Position tooltip (always follows mouse) - float sc = g.Style.MouseCursorScale; - ImVec2 ref_pos = NavCalcPreferredRefPos(); - ImRect r_avoid; - if (!g.NavDisableHighlight && g.NavDisableMouseHover && !(g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos)) - r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 16, ref_pos.y + 8); - else - r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * sc, ref_pos.y + 24 * sc); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important. - return FindBestWindowPosForPopupEx(ref_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip); - } - IM_ASSERT(0); - return window->Pos; -} - -//----------------------------------------------------------------------------- -// [SECTION] KEYBOARD/GAMEPAD NAVIGATION -//----------------------------------------------------------------------------- - -// FIXME-NAV: The existence of SetNavID vs SetFocusID vs FocusWindow() needs to be clarified/reworked. -// In our terminology those should be interchangeable, yet right now this is super confusing. -// Those two functions are merely a legacy artifact, so at minimum naming should be clarified. - -void ImGui::SetNavWindow(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - if (g.NavWindow != window) - { - IMGUI_DEBUG_LOG_FOCUS("[focus] SetNavWindow(\"%s\")\n", window ? window->Name : ""); - g.NavWindow = window; - } - g.NavInitRequest = g.NavMoveSubmitted = g.NavMoveScoringItems = false; - NavUpdateAnyRequestFlag(); -} - -void ImGui::SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.NavWindow != NULL); - IM_ASSERT(nav_layer == ImGuiNavLayer_Main || nav_layer == ImGuiNavLayer_Menu); - g.NavId = id; - g.NavLayer = nav_layer; - g.NavFocusScopeId = focus_scope_id; - g.NavWindow->NavLastIds[nav_layer] = id; - g.NavWindow->NavRectRel[nav_layer] = rect_rel; -} - -void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(id != 0); - - if (g.NavWindow != window) - SetNavWindow(window); - - // Assume that SetFocusID() is called in the context where its window->DC.NavLayerCurrent and window->DC.NavFocusScopeIdCurrent are valid. - // Note that window may be != g.CurrentWindow (e.g. SetFocusID call in InputTextEx for multi-line text) - const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent; - g.NavId = id; - g.NavLayer = nav_layer; - g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent; - window->NavLastIds[nav_layer] = id; - if (g.LastItemData.ID == id) - window->NavRectRel[nav_layer] = WindowRectAbsToRel(window, g.LastItemData.NavRect); - - if (g.ActiveIdSource == ImGuiInputSource_Nav) - g.NavDisableMouseHover = true; - else - g.NavDisableHighlight = true; -} - -ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy) -{ - if (ImFabs(dx) > ImFabs(dy)) - return (dx > 0.0f) ? ImGuiDir_Right : ImGuiDir_Left; - return (dy > 0.0f) ? ImGuiDir_Down : ImGuiDir_Up; -} - -static float inline NavScoreItemDistInterval(float a0, float a1, float b0, float b1) -{ - if (a1 < b0) - return a1 - b0; - if (b1 < a0) - return a0 - b1; - return 0.0f; -} - -static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect& r, const ImRect& clip_rect) -{ - if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) - { - r.Min.y = ImClamp(r.Min.y, clip_rect.Min.y, clip_rect.Max.y); - r.Max.y = ImClamp(r.Max.y, clip_rect.Min.y, clip_rect.Max.y); - } - else // FIXME: PageUp/PageDown are leaving move_dir == None - { - r.Min.x = ImClamp(r.Min.x, clip_rect.Min.x, clip_rect.Max.x); - r.Max.x = ImClamp(r.Max.x, clip_rect.Min.x, clip_rect.Max.x); - } -} - -// Scoring function for gamepad/keyboard directional navigation. Based on https://gist.github.com/rygorous/6981057 -static bool ImGui::NavScoreItem(ImGuiNavItemData* result) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.NavLayer != window->DC.NavLayerCurrent) - return false; - - // FIXME: Those are not good variables names - ImRect cand = g.LastItemData.NavRect; // Current item nav rectangle - const ImRect curr = g.NavScoringRect; // Current modified source rect (NB: we've applied Max.x = Min.x in NavUpdate() to inhibit the effect of having varied item width) - g.NavScoringDebugCount++; - - // When entering through a NavFlattened border, we consider child window items as fully clipped for scoring - if (window->ParentWindow == g.NavWindow) - { - IM_ASSERT((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened); - if (!window->ClipRect.Overlaps(cand)) - return false; - cand.ClipWithFull(window->ClipRect); // This allows the scored item to not overlap other candidates in the parent window - } - - // We perform scoring on items bounding box clipped by the current clipping rectangle on the other axis (clipping on our movement axis would give us equal scores for all clipped items) - // For example, this ensure that items in one column are not reached when moving vertically from items in another column. - NavClampRectToVisibleAreaForMoveDir(g.NavMoveClipDir, cand, window->ClipRect); - - // Compute distance between boxes - // FIXME-NAV: Introducing biases for vertical navigation, needs to be removed. - float dbx = NavScoreItemDistInterval(cand.Min.x, cand.Max.x, curr.Min.x, curr.Max.x); - float dby = NavScoreItemDistInterval(ImLerp(cand.Min.y, cand.Max.y, 0.2f), ImLerp(cand.Min.y, cand.Max.y, 0.8f), ImLerp(curr.Min.y, curr.Max.y, 0.2f), ImLerp(curr.Min.y, curr.Max.y, 0.8f)); // Scale down on Y to keep using box-distance for vertically touching items - if (dby != 0.0f && dbx != 0.0f) - dbx = (dbx / 1000.0f) + ((dbx > 0.0f) ? +1.0f : -1.0f); - float dist_box = ImFabs(dbx) + ImFabs(dby); - - // Compute distance between centers (this is off by a factor of 2, but we only compare center distances with each other so it doesn't matter) - float dcx = (cand.Min.x + cand.Max.x) - (curr.Min.x + curr.Max.x); - float dcy = (cand.Min.y + cand.Max.y) - (curr.Min.y + curr.Max.y); - float dist_center = ImFabs(dcx) + ImFabs(dcy); // L1 metric (need this for our connectedness guarantee) - - // Determine which quadrant of 'curr' our candidate item 'cand' lies in based on distance - ImGuiDir quadrant; - float dax = 0.0f, day = 0.0f, dist_axial = 0.0f; - if (dbx != 0.0f || dby != 0.0f) - { - // For non-overlapping boxes, use distance between boxes - dax = dbx; - day = dby; - dist_axial = dist_box; - quadrant = ImGetDirQuadrantFromDelta(dbx, dby); - } - else if (dcx != 0.0f || dcy != 0.0f) - { - // For overlapping boxes with different centers, use distance between centers - dax = dcx; - day = dcy; - dist_axial = dist_center; - quadrant = ImGetDirQuadrantFromDelta(dcx, dcy); - } - else - { - // Degenerate case: two overlapping buttons with same center, break ties arbitrarily (note that LastItemId here is really the _previous_ item order, but it doesn't matter) - quadrant = (g.LastItemData.ID < g.NavId) ? ImGuiDir_Left : ImGuiDir_Right; - } - -#if IMGUI_DEBUG_NAV_SCORING - char buf[128]; - if (IsMouseHoveringRect(cand.Min, cand.Max)) - { - ImFormatString(buf, IM_ARRAYSIZE(buf), "dbox (%.2f,%.2f->%.4f)\ndcen (%.2f,%.2f->%.4f)\nd (%.2f,%.2f->%.4f)\nnav %c, quadrant %c", dbx, dby, dist_box, dcx, dcy, dist_center, dax, day, dist_axial, "WENS"[g.NavMoveDir], "WENS"[quadrant]); - ImDrawList* draw_list = GetForegroundDrawList(window); - draw_list->AddRect(curr.Min, curr.Max, IM_COL32(255,200,0,100)); - draw_list->AddRect(cand.Min, cand.Max, IM_COL32(255,255,0,200)); - draw_list->AddRectFilled(cand.Max - ImVec2(4, 4), cand.Max + CalcTextSize(buf) + ImVec2(4, 4), IM_COL32(40,0,0,150)); - draw_list->AddText(cand.Max, ~0U, buf); - } - else if (g.IO.KeyCtrl) // Hold to preview score in matching quadrant. Press C to rotate. - { - if (quadrant == g.NavMoveDir) - { - ImFormatString(buf, IM_ARRAYSIZE(buf), "%.0f/%.0f", dist_box, dist_center); - ImDrawList* draw_list = GetForegroundDrawList(window); - draw_list->AddRectFilled(cand.Min, cand.Max, IM_COL32(255, 0, 0, 200)); - draw_list->AddText(cand.Min, IM_COL32(255, 255, 255, 255), buf); - } - } -#endif - - // Is it in the quadrant we're interesting in moving to? - bool new_best = false; - const ImGuiDir move_dir = g.NavMoveDir; - if (quadrant == move_dir) - { - // Does it beat the current best candidate? - if (dist_box < result->DistBox) - { - result->DistBox = dist_box; - result->DistCenter = dist_center; - return true; - } - if (dist_box == result->DistBox) - { - // Try using distance between center points to break ties - if (dist_center < result->DistCenter) - { - result->DistCenter = dist_center; - new_best = true; - } - else if (dist_center == result->DistCenter) - { - // Still tied! we need to be extra-careful to make sure everything gets linked properly. We consistently break ties by symbolically moving "later" items - // (with higher index) to the right/downwards by an infinitesimal amount since we the current "best" button already (so it must have a lower index), - // this is fairly easy. This rule ensures that all buttons with dx==dy==0 will end up being linked in order of appearance along the x axis. - if (((move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) ? dby : dbx) < 0.0f) // moving bj to the right/down decreases distance - new_best = true; - } - } - } - - // Axial check: if 'curr' has no link at all in some direction and 'cand' lies roughly in that direction, add a tentative link. This will only be kept if no "real" matches - // are found, so it only augments the graph produced by the above method using extra links. (important, since it doesn't guarantee strong connectedness) - // This is just to avoid buttons having no links in a particular direction when there's a suitable neighbor. you get good graphs without this too. - // 2017/09/29: FIXME: This now currently only enabled inside menu bars, ideally we'd disable it everywhere. Menus in particular need to catch failure. For general navigation it feels awkward. - // Disabling it may lead to disconnected graphs when nodes are very spaced out on different axis. Perhaps consider offering this as an option? - if (result->DistBox == FLT_MAX && dist_axial < result->DistAxial) // Check axial match - if (g.NavLayer == ImGuiNavLayer_Menu && !(g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) - if ((move_dir == ImGuiDir_Left && dax < 0.0f) || (move_dir == ImGuiDir_Right && dax > 0.0f) || (move_dir == ImGuiDir_Up && day < 0.0f) || (move_dir == ImGuiDir_Down && day > 0.0f)) - { - result->DistAxial = dist_axial; - new_best = true; - } - - return new_best; -} - -static void ImGui::NavApplyItemToResult(ImGuiNavItemData* result) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - result->Window = window; - result->ID = g.LastItemData.ID; - result->FocusScopeId = window->DC.NavFocusScopeIdCurrent; - result->InFlags = g.LastItemData.InFlags; - result->RectRel = WindowRectAbsToRel(window, g.LastItemData.NavRect); -} - -// We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above) -// This is called after LastItemData is set. -static void ImGui::NavProcessItem() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const ImGuiID id = g.LastItemData.ID; - const ImRect nav_bb = g.LastItemData.NavRect; - const ImGuiItemFlags item_flags = g.LastItemData.InFlags; - - // Process Init Request - if (g.NavInitRequest && g.NavLayer == window->DC.NavLayerCurrent && (item_flags & ImGuiItemFlags_Disabled) == 0) - { - // Even if 'ImGuiItemFlags_NoNavDefaultFocus' is on (typically collapse/close button) we record the first ResultId so they can be used as a fallback - const bool candidate_for_nav_default_focus = (item_flags & ImGuiItemFlags_NoNavDefaultFocus) == 0; - if (candidate_for_nav_default_focus || g.NavInitResultId == 0) - { - g.NavInitResultId = id; - g.NavInitResultRectRel = WindowRectAbsToRel(window, nav_bb); - } - if (candidate_for_nav_default_focus) - { - g.NavInitRequest = false; // Found a match, clear request - NavUpdateAnyRequestFlag(); - } - } - - // Process Move Request (scoring for navigation) - // FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRect + scoring from a rect wrapped according to current wrapping policy) - if (g.NavMoveScoringItems) - { - const bool is_tab_stop = (item_flags & ImGuiItemFlags_Inputable) && (item_flags & (ImGuiItemFlags_NoTabStop | ImGuiItemFlags_Disabled)) == 0; - const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) != 0; - if (is_tabbing) - { - if (is_tab_stop || (g.NavMoveFlags & ImGuiNavMoveFlags_FocusApi)) - NavProcessItemForTabbingRequest(id); - } - else if ((g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) && !(item_flags & (ImGuiItemFlags_Disabled | ImGuiItemFlags_NoNav))) - { - ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther; - if (!is_tabbing) - { - if (NavScoreItem(result)) - NavApplyItemToResult(result); - - // Features like PageUp/PageDown need to maintain a separate score for the visible set of items. - const float VISIBLE_RATIO = 0.70f; - if ((g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) - if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) - if (NavScoreItem(&g.NavMoveResultLocalVisible)) - NavApplyItemToResult(&g.NavMoveResultLocalVisible); - } - } - } - - // Update window-relative bounding box of navigated item - if (g.NavId == id) - { - if (g.NavWindow != window) - SetNavWindow(window); // Always refresh g.NavWindow, because some operations such as FocusItem() may not have a window. - g.NavLayer = window->DC.NavLayerCurrent; - g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent; - g.NavIdIsAlive = true; - window->NavRectRel[window->DC.NavLayerCurrent] = WindowRectAbsToRel(window, nav_bb); // Store item bounding box (relative to window position) - } -} - -// Handle "scoring" of an item for a tabbing/focusing request initiated by NavUpdateCreateTabbingRequest(). -// Note that SetKeyboardFocusHere() API calls are considered tabbing requests! -// - Case 1: no nav/active id: set result to first eligible item, stop storing. -// - Case 2: tab forward: on ref id set counter, on counter elapse store result -// - Case 3: tab forward wrap: set result to first eligible item (preemptively), on ref id set counter, on next frame if counter hasn't elapsed store result. // FIXME-TABBING: Could be done as a next-frame forwarded request -// - Case 4: tab backward: store all results, on ref id pick prev, stop storing -// - Case 5: tab backward wrap: store all results, on ref id if no result keep storing until last // FIXME-TABBING: Could be done as next-frame forwarded requested -void ImGui::NavProcessItemForTabbingRequest(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - - // Always store in NavMoveResultLocal (unlike directional request which uses NavMoveResultOther on sibling/flattened windows) - ImGuiNavItemData* result = &g.NavMoveResultLocal; - if (g.NavTabbingDir == +1) - { - // Tab Forward or SetKeyboardFocusHere() with >= 0 - if (g.NavTabbingResultFirst.ID == 0) - NavApplyItemToResult(&g.NavTabbingResultFirst); - if (--g.NavTabbingCounter == 0) - NavMoveRequestResolveWithLastItem(result); - else if (g.NavId == id) - g.NavTabbingCounter = 1; - } - else if (g.NavTabbingDir == -1) - { - // Tab Backward - if (g.NavId == id) - { - if (result->ID) - { - g.NavMoveScoringItems = false; - NavUpdateAnyRequestFlag(); - } - } - else - { - NavApplyItemToResult(result); - } - } - else if (g.NavTabbingDir == 0) - { - // Tab Init - if (g.NavTabbingResultFirst.ID == 0) - NavMoveRequestResolveWithLastItem(&g.NavTabbingResultFirst); - } -} - -bool ImGui::NavMoveRequestButNoResultYet() -{ - ImGuiContext& g = *GImGui; - return g.NavMoveScoringItems && g.NavMoveResultLocal.ID == 0 && g.NavMoveResultOther.ID == 0; -} - -// FIXME: ScoringRect is not set -void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.NavWindow != NULL); - - if (move_flags & ImGuiNavMoveFlags_Tabbing) - move_flags |= ImGuiNavMoveFlags_AllowCurrentNavId; - - g.NavMoveSubmitted = g.NavMoveScoringItems = true; - g.NavMoveDir = move_dir; - g.NavMoveDirForDebug = move_dir; - g.NavMoveClipDir = clip_dir; - g.NavMoveFlags = move_flags; - g.NavMoveScrollFlags = scroll_flags; - g.NavMoveForwardToNextFrame = false; - g.NavMoveKeyMods = g.IO.KeyMods; - g.NavMoveResultLocal.Clear(); - g.NavMoveResultLocalVisible.Clear(); - g.NavMoveResultOther.Clear(); - g.NavTabbingCounter = 0; - g.NavTabbingResultFirst.Clear(); - NavUpdateAnyRequestFlag(); -} - -void ImGui::NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result) -{ - ImGuiContext& g = *GImGui; - g.NavMoveScoringItems = false; // Ensure request doesn't need more processing - NavApplyItemToResult(result); - NavUpdateAnyRequestFlag(); -} - -void ImGui::NavMoveRequestCancel() -{ - ImGuiContext& g = *GImGui; - g.NavMoveSubmitted = g.NavMoveScoringItems = false; - NavUpdateAnyRequestFlag(); -} - -// Forward will reuse the move request again on the next frame (generally with modifications done to it) -void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.NavMoveForwardToNextFrame == false); - NavMoveRequestCancel(); - g.NavMoveForwardToNextFrame = true; - g.NavMoveDir = move_dir; - g.NavMoveClipDir = clip_dir; - g.NavMoveFlags = move_flags | ImGuiNavMoveFlags_Forwarded; - g.NavMoveScrollFlags = scroll_flags; -} - -// Navigation wrap-around logic is delayed to the end of the frame because this operation is only valid after entire -// popup is assembled and in case of appended popups it is not clear which EndPopup() call is final. -void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags wrap_flags) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(wrap_flags != 0); // Call with _WrapX, _WrapY, _LoopX, _LoopY - // In theory we should test for NavMoveRequestButNoResultYet() but there's no point doing it, NavEndFrame() will do the same test - if (g.NavWindow == window && g.NavMoveScoringItems && g.NavLayer == ImGuiNavLayer_Main) - g.NavMoveFlags |= wrap_flags; -} - -// FIXME: This could be replaced by updating a frame number in each window when (window == NavWindow) and (NavLayer == 0). -// This way we could find the last focused window among our children. It would be much less confusing this way? -static void ImGui::NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window) -{ - ImGuiWindow* parent = nav_window; - while (parent && parent->RootWindow != parent && (parent->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0) - parent = parent->ParentWindow; - if (parent && parent != nav_window) - parent->NavLastChildNavWindow = nav_window; -} - -// Restore the last focused child. -// Call when we are expected to land on the Main Layer (0) after FocusWindow() -static ImGuiWindow* ImGui::NavRestoreLastChildNavWindow(ImGuiWindow* window) -{ - if (window->NavLastChildNavWindow && window->NavLastChildNavWindow->WasActive) - return window->NavLastChildNavWindow; - return window; -} - -void ImGui::NavRestoreLayer(ImGuiNavLayer layer) -{ - ImGuiContext& g = *GImGui; - if (layer == ImGuiNavLayer_Main) - { - ImGuiWindow* prev_nav_window = g.NavWindow; - g.NavWindow = NavRestoreLastChildNavWindow(g.NavWindow); // FIXME-NAV: Should clear ongoing nav requests? - if (prev_nav_window) - IMGUI_DEBUG_LOG_FOCUS("[focus] NavRestoreLayer: from \"%s\" to SetNavWindow(\"%s\")\n", prev_nav_window->Name, g.NavWindow->Name); - } - ImGuiWindow* window = g.NavWindow; - if (window->NavLastIds[layer] != 0) - { - SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); - } - else - { - g.NavLayer = layer; - NavInitWindow(window, true); - } -} - -void ImGui::NavRestoreHighlightAfterMove() -{ - ImGuiContext& g = *GImGui; - g.NavDisableHighlight = false; - g.NavDisableMouseHover = g.NavMousePosDirty = true; -} - -static inline void ImGui::NavUpdateAnyRequestFlag() -{ - ImGuiContext& g = *GImGui; - g.NavAnyRequest = g.NavMoveScoringItems || g.NavInitRequest || (IMGUI_DEBUG_NAV_SCORING && g.NavWindow != NULL); - if (g.NavAnyRequest) - IM_ASSERT(g.NavWindow != NULL); -} - -// This needs to be called before we submit any widget (aka in or before Begin) -void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(window == g.NavWindow); - - if (window->Flags & ImGuiWindowFlags_NoNavInputs) - { - g.NavId = g.NavFocusScopeId = 0; - return; - } - - bool init_for_nav = false; - if (window == window->RootWindow || (window->Flags & ImGuiWindowFlags_Popup) || (window->NavLastIds[0] == 0) || force_reinit) - init_for_nav = true; - IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from NavInitWindow(), init_for_nav=%d, window=\"%s\", layer=%d\n", init_for_nav, window->Name, g.NavLayer); - if (init_for_nav) - { - SetNavID(0, g.NavLayer, 0, ImRect()); - g.NavInitRequest = true; - g.NavInitRequestFromMove = false; - g.NavInitResultId = 0; - g.NavInitResultRectRel = ImRect(); - NavUpdateAnyRequestFlag(); - } - else - { - g.NavId = window->NavLastIds[0]; - g.NavFocusScopeId = 0; - } -} - -static ImVec2 ImGui::NavCalcPreferredRefPos() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.NavWindow; - if (g.NavDisableHighlight || !g.NavDisableMouseHover || !window) - { - // Mouse (we need a fallback in case the mouse becomes invalid after being used) - // The +1.0f offset when stored by OpenPopupEx() allows reopening this or another popup (same or another mouse button) while not moving the mouse, it is pretty standard. - // In theory we could move that +1.0f offset in OpenPopupEx() - ImVec2 p = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : g.MouseLastValidPos; - return ImVec2(p.x + 1.0f, p.y); - } - else - { - // When navigation is active and mouse is disabled, pick a position around the bottom left of the currently navigated item - // Take account of upcoming scrolling (maybe set mouse pos should be done in EndFrame?) - ImRect rect_rel = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]); - if (window->LastFrameActive != g.FrameCount && (window->ScrollTarget.x != FLT_MAX || window->ScrollTarget.y != FLT_MAX)) - { - ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); - rect_rel.Translate(window->Scroll - next_scroll); - } - ImVec2 pos = ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x * 4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight())); - ImGuiViewport* viewport = GetMainViewport(); - return ImFloor(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImFloor() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. - } -} - -float ImGui::GetNavTweakPressedAmount(ImGuiAxis axis) -{ - ImGuiContext& g = *GImGui; - float repeat_delay, repeat_rate; - GetTypematicRepeatRate(ImGuiInputFlags_RepeatRateNavTweak, &repeat_delay, &repeat_rate); - - ImGuiKey key_less, key_more; - if (g.NavInputSource == ImGuiInputSource_Gamepad) - { - key_less = (axis == ImGuiAxis_X) ? ImGuiKey_GamepadDpadLeft : ImGuiKey_GamepadDpadUp; - key_more = (axis == ImGuiAxis_X) ? ImGuiKey_GamepadDpadRight : ImGuiKey_GamepadDpadDown; - } - else - { - key_less = (axis == ImGuiAxis_X) ? ImGuiKey_LeftArrow : ImGuiKey_UpArrow; - key_more = (axis == ImGuiAxis_X) ? ImGuiKey_RightArrow : ImGuiKey_DownArrow; - } - float amount = (float)GetKeyPressedAmount(key_more, repeat_delay, repeat_rate) - (float)GetKeyPressedAmount(key_less, repeat_delay, repeat_rate); - if (amount != 0.0f && IsKeyDown(key_less) && IsKeyDown(key_more)) // Cancel when opposite directions are held, regardless of repeat phase - amount = 0.0f; - return amount; -} - -static void ImGui::NavUpdate() -{ - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - - io.WantSetMousePos = false; - //if (g.NavScoringDebugCount > 0) IMGUI_DEBUG_LOG_NAV("[nav] NavScoringDebugCount %d for '%s' layer %d (Init:%d, Move:%d)\n", g.NavScoringDebugCount, g.NavWindow ? g.NavWindow->Name : "NULL", g.NavLayer, g.NavInitRequest || g.NavInitResultId != 0, g.NavMoveRequest); - - // Set input source based on which keys are last pressed (as some features differs when used with Gamepad vs Keyboard) - // FIXME-NAV: Now that keys are separated maybe we can get rid of NavInputSource? - const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; - const ImGuiKey nav_gamepad_keys_to_change_source[] = { ImGuiKey_GamepadFaceRight, ImGuiKey_GamepadFaceLeft, ImGuiKey_GamepadFaceUp, ImGuiKey_GamepadFaceDown, ImGuiKey_GamepadDpadRight, ImGuiKey_GamepadDpadLeft, ImGuiKey_GamepadDpadUp, ImGuiKey_GamepadDpadDown }; - if (nav_gamepad_active) - for (ImGuiKey key : nav_gamepad_keys_to_change_source) - if (IsKeyDown(key)) - g.NavInputSource = ImGuiInputSource_Gamepad; - const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - const ImGuiKey nav_keyboard_keys_to_change_source[] = { ImGuiKey_Space, ImGuiKey_Enter, ImGuiKey_Escape, ImGuiKey_RightArrow, ImGuiKey_LeftArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow }; - if (nav_keyboard_active) - for (ImGuiKey key : nav_keyboard_keys_to_change_source) - if (IsKeyDown(key)) - g.NavInputSource = ImGuiInputSource_Keyboard; - if (!nav_gamepad_active && g.NavInputSource == ImGuiInputSource_Gamepad) - g.NavInputSource = ImGuiInputSource_None; - if (!nav_keyboard_active && g.NavInputSource == ImGuiInputSource_Keyboard) - g.NavInputSource = ImGuiInputSource_None; - - // Process navigation init request (select first/default focus) - if (g.NavInitResultId != 0) - NavInitRequestApplyResult(); - g.NavInitRequest = false; - g.NavInitRequestFromMove = false; - g.NavInitResultId = 0; - g.NavJustMovedToId = 0; - - // Process navigation move request - if (g.NavMoveSubmitted) - NavMoveRequestApplyResult(); - g.NavTabbingCounter = 0; - g.NavMoveSubmitted = g.NavMoveScoringItems = false; - - // Schedule mouse position update (will be done at the bottom of this function, after 1) processing all move requests and 2) updating scrolling) - bool set_mouse_pos = false; - if (g.NavMousePosDirty && g.NavIdIsAlive) - if (!g.NavDisableHighlight && g.NavDisableMouseHover && g.NavWindow) - set_mouse_pos = true; - g.NavMousePosDirty = false; - IM_ASSERT(g.NavLayer == ImGuiNavLayer_Main || g.NavLayer == ImGuiNavLayer_Menu); - - // Store our return window (for returning from Menu Layer to Main Layer) and clear it as soon as we step back in our own Layer 0 - if (g.NavWindow) - NavSaveLastChildNavWindowIntoParent(g.NavWindow); - if (g.NavWindow && g.NavWindow->NavLastChildNavWindow != NULL && g.NavLayer == ImGuiNavLayer_Main) - g.NavWindow->NavLastChildNavWindow = NULL; - - // Update CTRL+TAB and Windowing features (hold Square to move/resize/etc.) - NavUpdateWindowing(); - - // Set output flags for user application - io.NavActive = (nav_keyboard_active || nav_gamepad_active) && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs); - io.NavVisible = (io.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL); - - // Process NavCancel input (to close a popup, get back to parent, clear focus) - NavUpdateCancelRequest(); - - // Process manual activation request - g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavActivateInputId = 0; - g.NavActivateFlags = ImGuiActivateFlags_None; - if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) - { - const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate)); - const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, false))); - const bool input_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Enter)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput)); - const bool input_pressed = input_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Enter, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, false))); - if (g.ActiveId == 0 && activate_pressed) - { - g.NavActivateId = g.NavId; - g.NavActivateFlags = ImGuiActivateFlags_PreferTweak; - } - if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && input_pressed) - { - g.NavActivateInputId = g.NavId; - g.NavActivateFlags = ImGuiActivateFlags_PreferInput; - } - if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_down) - g.NavActivateDownId = g.NavId; - if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_pressed) - g.NavActivatePressedId = g.NavId; - } - if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) - g.NavDisableHighlight = true; - if (g.NavActivateId != 0) - IM_ASSERT(g.NavActivateDownId == g.NavActivateId); - - // Process programmatic activation request - // FIXME-NAV: Those should eventually be queued (unlike focus they don't cancel each others) - if (g.NavNextActivateId != 0) - { - if (g.NavNextActivateFlags & ImGuiActivateFlags_PreferInput) - g.NavActivateInputId = g.NavNextActivateId; - else - g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavNextActivateId; - g.NavActivateFlags = g.NavNextActivateFlags; - } - g.NavNextActivateId = 0; - - // Process move requests - NavUpdateCreateMoveRequest(); - if (g.NavMoveDir == ImGuiDir_None) - NavUpdateCreateTabbingRequest(); - NavUpdateAnyRequestFlag(); - g.NavIdIsAlive = false; - - // Scrolling - if (g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.NavWindowingTarget) - { - // *Fallback* manual-scroll with Nav directional keys when window has no navigable item - ImGuiWindow* window = g.NavWindow; - const float scroll_speed = IM_ROUND(window->CalcFontSize() * 100 * io.DeltaTime); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported. - const ImGuiDir move_dir = g.NavMoveDir; - if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavHasScroll && move_dir != ImGuiDir_None) - { - if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) - SetScrollX(window, ImFloor(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); - if (move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) - SetScrollY(window, ImFloor(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); - } - - // *Normal* Manual scroll with LStick - // Next movement request will clamp the NavId reference rectangle to the visible area, so navigation will resume within those bounds. - if (nav_gamepad_active) - { - const ImVec2 scroll_dir = GetKeyVector2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown); - const float tweak_factor = IsKeyDown(ImGuiKey_NavGamepadTweakSlow) ? 1.0f / 10.0f : IsKeyDown(ImGuiKey_NavGamepadTweakFast) ? 10.0f : 1.0f; - if (scroll_dir.x != 0.0f && window->ScrollbarX) - SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed * tweak_factor)); - if (scroll_dir.y != 0.0f) - SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed * tweak_factor)); - } - } - - // Always prioritize mouse highlight if navigation is disabled - if (!nav_keyboard_active && !nav_gamepad_active) - { - g.NavDisableHighlight = true; - g.NavDisableMouseHover = set_mouse_pos = false; - } - - // Update mouse position if requested - // (This will take into account the possibility that a Scroll was queued in the window to offset our absolute mouse position before scroll has been applied) - if (set_mouse_pos && (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) && (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos)) - { - io.MousePos = io.MousePosPrev = NavCalcPreferredRefPos(); - io.WantSetMousePos = true; - //IMGUI_DEBUG_LOG_IO("SetMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y); - } - - // [DEBUG] - g.NavScoringDebugCount = 0; -#if IMGUI_DEBUG_NAV_RECTS - if (g.NavWindow) - { - ImDrawList* draw_list = GetForegroundDrawList(g.NavWindow); - if (1) { for (int layer = 0; layer < 2; layer++) { ImRect r = WindowRectRelToAbs(g.NavWindow, g.NavWindow->NavRectRel[layer]); draw_list->AddRect(r.Min, r.Max, IM_COL32(255,200,0,255)); } } // [DEBUG] - if (1) { ImU32 col = (!g.NavWindow->Hidden) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredRefPos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); draw_list->AddCircleFilled(p, 3.0f, col); draw_list->AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); } - } -#endif -} - -void ImGui::NavInitRequestApplyResult() -{ - // In very rare cases g.NavWindow may be null (e.g. clearing focus after requesting an init request, which does happen when releasing Alt while clicking on void) - ImGuiContext& g = *GImGui; - if (!g.NavWindow) - return; - - // Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called) - // FIXME-NAV: On _NavFlattened windows, g.NavWindow will only be updated during subsequent frame. Not a problem currently. - IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: ApplyResult: NavID 0x%08X in Layer %d Window \"%s\"\n", g.NavInitResultId, g.NavLayer, g.NavWindow->Name); - SetNavID(g.NavInitResultId, g.NavLayer, 0, g.NavInitResultRectRel); - g.NavIdIsAlive = true; // Mark as alive from previous frame as we got a result - if (g.NavInitRequestFromMove) - NavRestoreHighlightAfterMove(); -} - -void ImGui::NavUpdateCreateMoveRequest() -{ - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - ImGuiWindow* window = g.NavWindow; - const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; - const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - - if (g.NavMoveForwardToNextFrame && window != NULL) - { - // Forwarding previous request (which has been modified, e.g. wrap around menus rewrite the requests with a starting rectangle at the other side of the window) - // (preserve most state, which were already set by the NavMoveRequestForward() function) - IM_ASSERT(g.NavMoveDir != ImGuiDir_None && g.NavMoveClipDir != ImGuiDir_None); - IM_ASSERT(g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded); - IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequestForward %d\n", g.NavMoveDir); - } - else - { - // Initiate directional inputs request - g.NavMoveDir = ImGuiDir_None; - g.NavMoveFlags = ImGuiNavMoveFlags_None; - g.NavMoveScrollFlags = ImGuiScrollFlags_None; - if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) - { - const ImGuiInputFlags repeat_mode = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateNavMove; - if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && ((nav_gamepad_active && IsKeyPressedEx(ImGuiKey_GamepadDpadLeft, repeat_mode)) || (nav_keyboard_active && IsKeyPressedEx(ImGuiKey_LeftArrow, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Left; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressedEx(ImGuiKey_GamepadDpadRight, repeat_mode)) || (nav_keyboard_active && IsKeyPressedEx(ImGuiKey_RightArrow, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Right; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && ((nav_gamepad_active && IsKeyPressedEx(ImGuiKey_GamepadDpadUp, repeat_mode)) || (nav_keyboard_active && IsKeyPressedEx(ImGuiKey_UpArrow, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Up; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && ((nav_gamepad_active && IsKeyPressedEx(ImGuiKey_GamepadDpadDown, repeat_mode)) || (nav_keyboard_active && IsKeyPressedEx(ImGuiKey_DownArrow, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Down; } - } - g.NavMoveClipDir = g.NavMoveDir; - g.NavScoringNoClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); - } - - // Update PageUp/PageDown/Home/End scroll - // FIXME-NAV: Consider enabling those keys even without the master ImGuiConfigFlags_NavEnableKeyboard flag? - float scoring_rect_offset_y = 0.0f; - if (window && g.NavMoveDir == ImGuiDir_None && nav_keyboard_active) - scoring_rect_offset_y = NavUpdatePageUpPageDown(); - if (scoring_rect_offset_y != 0.0f) - { - g.NavScoringNoClipRect = window->InnerRect; - g.NavScoringNoClipRect.TranslateY(scoring_rect_offset_y); - } - - // [DEBUG] Always send a request -#if IMGUI_DEBUG_NAV_SCORING - if (io.KeyCtrl && IsKeyPressed(ImGuiKey_C)) - g.NavMoveDirForDebug = (ImGuiDir)((g.NavMoveDirForDebug + 1) & 3); - if (io.KeyCtrl && g.NavMoveDir == ImGuiDir_None) - { - g.NavMoveDir = g.NavMoveDirForDebug; - g.NavMoveFlags |= ImGuiNavMoveFlags_DebugNoResult; - } -#endif - - // Submit - g.NavMoveForwardToNextFrame = false; - if (g.NavMoveDir != ImGuiDir_None) - NavMoveRequestSubmit(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); - - // Moving with no reference triggers a init request (will be used as a fallback if the direction fails to find a match) - if (g.NavMoveSubmitted && g.NavId == 0) - { - IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from move, window \"%s\", layer=%d\n", window ? window->Name : "", g.NavLayer); - g.NavInitRequest = g.NavInitRequestFromMove = true; - g.NavInitResultId = 0; - g.NavDisableHighlight = false; - } - - // When using gamepad, we project the reference nav bounding box into window visible area. - // This is to allow resuming navigation inside the visible area after doing a large amount of scrolling, since with gamepad every movements are relative - // (can't focus a visible object like we can with the mouse). - if (g.NavMoveSubmitted && g.NavInputSource == ImGuiInputSource_Gamepad && g.NavLayer == ImGuiNavLayer_Main && window != NULL)// && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded)) - { - bool clamp_x = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapX)) == 0; - bool clamp_y = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapY)) == 0; - ImRect inner_rect_rel = WindowRectAbsToRel(window, ImRect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1))); - if ((clamp_x || clamp_y) && !inner_rect_rel.Contains(window->NavRectRel[g.NavLayer])) - { - //IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: clamp NavRectRel for gamepad move\n"); - float pad_x = ImMin(inner_rect_rel.GetWidth(), window->CalcFontSize() * 0.5f); - float pad_y = ImMin(inner_rect_rel.GetHeight(), window->CalcFontSize() * 0.5f); // Terrible approximation for the intent of starting navigation from first fully visible item - inner_rect_rel.Min.x = clamp_x ? (inner_rect_rel.Min.x + pad_x) : -FLT_MAX; - inner_rect_rel.Max.x = clamp_x ? (inner_rect_rel.Max.x - pad_x) : +FLT_MAX; - inner_rect_rel.Min.y = clamp_y ? (inner_rect_rel.Min.y + pad_y) : -FLT_MAX; - inner_rect_rel.Max.y = clamp_y ? (inner_rect_rel.Max.y - pad_y) : +FLT_MAX; - window->NavRectRel[g.NavLayer].ClipWithFull(inner_rect_rel); - g.NavId = g.NavFocusScopeId = 0; - } - } - - // For scoring we use a single segment on the left side our current item bounding box (not touching the edge to avoid box overlap with zero-spaced items) - ImRect scoring_rect; - if (window != NULL) - { - ImRect nav_rect_rel = !window->NavRectRel[g.NavLayer].IsInverted() ? window->NavRectRel[g.NavLayer] : ImRect(0, 0, 0, 0); - scoring_rect = WindowRectRelToAbs(window, nav_rect_rel); - scoring_rect.TranslateY(scoring_rect_offset_y); - scoring_rect.Min.x = ImMin(scoring_rect.Min.x + 1.0f, scoring_rect.Max.x); - scoring_rect.Max.x = scoring_rect.Min.x; - IM_ASSERT(!scoring_rect.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allows us to remove extraneous ImFabs() calls in NavScoreItem(). - //GetForegroundDrawList()->AddRect(scoring_rect.Min, scoring_rect.Max, IM_COL32(255,200,0,255)); // [DEBUG] - //if (!g.NavScoringNoClipRect.IsInverted()) { GetForegroundDrawList()->AddRect(g.NavScoringNoClipRect.Min, g.NavScoringNoClipRect.Max, IM_COL32(255, 200, 0, 255)); } // [DEBUG] - } - g.NavScoringRect = scoring_rect; - g.NavScoringNoClipRect.Add(scoring_rect); -} - -void ImGui::NavUpdateCreateTabbingRequest() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.NavWindow; - IM_ASSERT(g.NavMoveDir == ImGuiDir_None); - if (window == NULL || g.NavWindowingTarget != NULL || (window->Flags & ImGuiWindowFlags_NoNavInputs)) - return; - - const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, true) && !IsActiveIdUsingKey(ImGuiKey_Tab) && !g.IO.KeyCtrl && !g.IO.KeyAlt; - if (!tab_pressed) - return; - - // Initiate tabbing request - // (this is ALWAYS ENABLED, regardless of ImGuiConfigFlags_NavEnableKeyboard flag!) - // Initially this was designed to use counters and modulo arithmetic, but that could not work with unsubmitted items (list clipper). Instead we use a strategy close to other move requests. - // See NavProcessItemForTabbingRequest() for a description of the various forward/backward tabbing cases with and without wrapping. - //// FIXME: We use (g.ActiveId == 0) but (g.NavDisableHighlight == false) might be righter once we can tab through anything - g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.ActiveId == 0) ? 0 : +1; - ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; - ImGuiDir clip_dir = (g.NavTabbingDir < 0) ? ImGuiDir_Up : ImGuiDir_Down; - NavMoveRequestSubmit(ImGuiDir_None, clip_dir, ImGuiNavMoveFlags_Tabbing, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. - g.NavTabbingCounter = -1; -} - -// Apply result from previous frame navigation directional move request. Always called from NavUpdate() -void ImGui::NavMoveRequestApplyResult() -{ - ImGuiContext& g = *GImGui; -#if IMGUI_DEBUG_NAV_SCORING - if (g.NavMoveFlags & ImGuiNavMoveFlags_DebugNoResult) // [DEBUG] Scoring all items in NavWindow at all times - return; -#endif - - // Select which result to use - ImGuiNavItemData* result = (g.NavMoveResultLocal.ID != 0) ? &g.NavMoveResultLocal : (g.NavMoveResultOther.ID != 0) ? &g.NavMoveResultOther : NULL; - - // Tabbing forward wrap - if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) - if ((g.NavTabbingCounter == 1 || g.NavTabbingDir == 0) && g.NavTabbingResultFirst.ID) - result = &g.NavTabbingResultFirst; - - // In a situation when there is no results but NavId != 0, re-enable the Navigation highlight (because g.NavId is not considered as a possible result) - if (result == NULL) - { - if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) - g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; - if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) - NavRestoreHighlightAfterMove(); - return; - } - - // PageUp/PageDown behavior first jumps to the bottom/top mostly visible item, _otherwise_ use the result from the previous/next page. - if (g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) - if (g.NavMoveResultLocalVisible.ID != 0 && g.NavMoveResultLocalVisible.ID != g.NavId) - result = &g.NavMoveResultLocalVisible; - - // Maybe entering a flattened child from the outside? In this case solve the tie using the regular scoring rules. - if (result != &g.NavMoveResultOther && g.NavMoveResultOther.ID != 0 && g.NavMoveResultOther.Window->ParentWindow == g.NavWindow) - if ((g.NavMoveResultOther.DistBox < result->DistBox) || (g.NavMoveResultOther.DistBox == result->DistBox && g.NavMoveResultOther.DistCenter < result->DistCenter)) - result = &g.NavMoveResultOther; - IM_ASSERT(g.NavWindow && result->Window); - - // Scroll to keep newly navigated item fully into view. - if (g.NavLayer == ImGuiNavLayer_Main) - { - if (g.NavMoveFlags & ImGuiNavMoveFlags_ScrollToEdgeY) - { - // FIXME: Should remove this - float scroll_target = (g.NavMoveDir == ImGuiDir_Up) ? result->Window->ScrollMax.y : 0.0f; - SetScrollY(result->Window, scroll_target); - } - else - { - ImRect rect_abs = WindowRectRelToAbs(result->Window, result->RectRel); - ScrollToRectEx(result->Window, rect_abs, g.NavMoveScrollFlags); - } - } - - if (g.NavWindow != result->Window) - { - IMGUI_DEBUG_LOG_FOCUS("[focus] NavMoveRequest: SetNavWindow(\"%s\")\n", result->Window->Name); - g.NavWindow = result->Window; - } - if (g.ActiveId != result->ID) - ClearActiveID(); - if (g.NavId != result->ID) - { - // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) - g.NavJustMovedToId = result->ID; - g.NavJustMovedToFocusScopeId = result->FocusScopeId; - g.NavJustMovedToKeyMods = g.NavMoveKeyMods; - } - - // Focus - IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); - SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); - - // Tabbing: Activates Inputable or Focus non-Inputable - if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && (result->InFlags & ImGuiItemFlags_Inputable)) - { - g.NavNextActivateId = result->ID; - g.NavNextActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState; - g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; - } - - // Activate - if (g.NavMoveFlags & ImGuiNavMoveFlags_Activate) - { - g.NavNextActivateId = result->ID; - g.NavNextActivateFlags = ImGuiActivateFlags_None; - } - - // Enable nav highlight - if ((g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) - NavRestoreHighlightAfterMove(); -} - -// Process NavCancel input (to close a popup, get back to parent, clear focus) -// FIXME: In order to support e.g. Escape to clear a selection we'll need: -// - either to store the equivalent of ActiveIdUsingKeyInputMask for a FocusScope and test for it. -// - either to move most/all of those tests to the epilogue/end functions of the scope they are dealing with (e.g. exit child window in EndChild()) or in EndFrame(), to allow an earlier intercept -static void ImGui::NavUpdateCancelRequest() -{ - ImGuiContext& g = *GImGui; - const bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; - const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, false)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, false))) - return; - - IMGUI_DEBUG_LOG_NAV("[nav] NavUpdateCancelRequest()\n"); - if (g.ActiveId != 0) - { - if (!IsActiveIdUsingKey(ImGuiKey_Escape) && !IsActiveIdUsingKey(ImGuiKey_NavGamepadCancel)) - ClearActiveID(); - } - else if (g.NavLayer != ImGuiNavLayer_Main) - { - // Leave the "menu" layer - NavRestoreLayer(ImGuiNavLayer_Main); - NavRestoreHighlightAfterMove(); - } - else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow) - { - // Exit child window - ImGuiWindow* child_window = g.NavWindow; - ImGuiWindow* parent_window = g.NavWindow->ParentWindow; - IM_ASSERT(child_window->ChildId != 0); - ImRect child_rect = child_window->Rect(); - FocusWindow(parent_window); - SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_rect)); - NavRestoreHighlightAfterMove(); - } - else if (g.OpenPopupStack.Size > 0 && !(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal)) - { - // Close open popup/menu - ClosePopupToLevel(g.OpenPopupStack.Size - 1, true); - } - else - { - // Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were - if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow))) - g.NavWindow->NavLastIds[0] = 0; - g.NavId = g.NavFocusScopeId = 0; - } -} - -// Handle PageUp/PageDown/Home/End keys -// Called from NavUpdateCreateMoveRequest() which will use our output to create a move request -// FIXME-NAV: This doesn't work properly with NavFlattened siblings as we use NavWindow rectangle for reference -// FIXME-NAV: how to get Home/End to aim at the beginning/end of a 2D grid? -static float ImGui::NavUpdatePageUpPageDown() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.NavWindow; - if ((window->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL) - return 0.0f; - - const bool page_up_held = IsKeyDown(ImGuiKey_PageUp) && !IsActiveIdUsingKey(ImGuiKey_PageUp); - const bool page_down_held = IsKeyDown(ImGuiKey_PageDown) && !IsActiveIdUsingKey(ImGuiKey_PageDown); - const bool home_pressed = IsKeyPressed(ImGuiKey_Home) && !IsActiveIdUsingKey(ImGuiKey_Home); - const bool end_pressed = IsKeyPressed(ImGuiKey_End) && !IsActiveIdUsingKey(ImGuiKey_End); - if (page_up_held == page_down_held && home_pressed == end_pressed) // Proceed if either (not both) are pressed, otherwise early out - return 0.0f; - - if (g.NavLayer != ImGuiNavLayer_Main) - NavRestoreLayer(ImGuiNavLayer_Main); - - if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavHasScroll) - { - // Fallback manual-scroll when window has no navigable item - if (IsKeyPressed(ImGuiKey_PageUp, true)) - SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight()); - else if (IsKeyPressed(ImGuiKey_PageDown, true)) - SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight()); - else if (home_pressed) - SetScrollY(window, 0.0f); - else if (end_pressed) - SetScrollY(window, window->ScrollMax.y); - } - else - { - ImRect& nav_rect_rel = window->NavRectRel[g.NavLayer]; - const float page_offset_y = ImMax(0.0f, window->InnerRect.GetHeight() - window->CalcFontSize() * 1.0f + nav_rect_rel.GetHeight()); - float nav_scoring_rect_offset_y = 0.0f; - if (IsKeyPressed(ImGuiKey_PageUp, true)) - { - nav_scoring_rect_offset_y = -page_offset_y; - g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset up, we request the down direction (so we can always land on the last item) - g.NavMoveClipDir = ImGuiDir_Up; - g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; - } - else if (IsKeyPressed(ImGuiKey_PageDown, true)) - { - nav_scoring_rect_offset_y = +page_offset_y; - g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset down, we request the up direction (so we can always land on the last item) - g.NavMoveClipDir = ImGuiDir_Down; - g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; - } - else if (home_pressed) - { - // FIXME-NAV: handling of Home/End is assuming that the top/bottom most item will be visible with Scroll.y == 0/ScrollMax.y - // Scrolling will be handled via the ImGuiNavMoveFlags_ScrollToEdgeY flag, we don't scroll immediately to avoid scrolling happening before nav result. - // Preserve current horizontal position if we have any. - nav_rect_rel.Min.y = nav_rect_rel.Max.y = 0.0f; - if (nav_rect_rel.IsInverted()) - nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; - g.NavMoveDir = ImGuiDir_Down; - g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdgeY; - // FIXME-NAV: MoveClipDir left to _None, intentional? - } - else if (end_pressed) - { - nav_rect_rel.Min.y = nav_rect_rel.Max.y = window->ContentSize.y; - if (nav_rect_rel.IsInverted()) - nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; - g.NavMoveDir = ImGuiDir_Up; - g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdgeY; - // FIXME-NAV: MoveClipDir left to _None, intentional? - } - return nav_scoring_rect_offset_y; - } - return 0.0f; -} - -static void ImGui::NavEndFrame() -{ - ImGuiContext& g = *GImGui; - - // Show CTRL+TAB list window - if (g.NavWindowingTarget != NULL) - NavUpdateWindowingOverlay(); - - // Perform wrap-around in menus - // FIXME-NAV: Wrap may need to apply a weight bias on the other axis. e.g. 4x4 grid with 2 last items missing on last item won't handle LoopY/WrapY correctly. - // FIXME-NAV: Wrap (not Loop) support could be handled by the scoring function and then WrapX would function without an extra frame. - const ImGuiNavMoveFlags wanted_flags = ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY; - if (g.NavWindow && NavMoveRequestButNoResultYet() && (g.NavMoveFlags & wanted_flags) && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded) == 0) - NavUpdateCreateWrappingRequest(); -} - -static void ImGui::NavUpdateCreateWrappingRequest() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.NavWindow; - - bool do_forward = false; - ImRect bb_rel = window->NavRectRel[g.NavLayer]; - ImGuiDir clip_dir = g.NavMoveDir; - const ImGuiNavMoveFlags move_flags = g.NavMoveFlags; - if (g.NavMoveDir == ImGuiDir_Left && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) - { - bb_rel.Min.x = bb_rel.Max.x = window->ContentSize.x + window->WindowPadding.x; - if (move_flags & ImGuiNavMoveFlags_WrapX) - { - bb_rel.TranslateY(-bb_rel.GetHeight()); // Previous row - clip_dir = ImGuiDir_Up; - } - do_forward = true; - } - if (g.NavMoveDir == ImGuiDir_Right && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) - { - bb_rel.Min.x = bb_rel.Max.x = -window->WindowPadding.x; - if (move_flags & ImGuiNavMoveFlags_WrapX) - { - bb_rel.TranslateY(+bb_rel.GetHeight()); // Next row - clip_dir = ImGuiDir_Down; - } - do_forward = true; - } - if (g.NavMoveDir == ImGuiDir_Up && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) - { - bb_rel.Min.y = bb_rel.Max.y = window->ContentSize.y + window->WindowPadding.y; - if (move_flags & ImGuiNavMoveFlags_WrapY) - { - bb_rel.TranslateX(-bb_rel.GetWidth()); // Previous column - clip_dir = ImGuiDir_Left; - } - do_forward = true; - } - if (g.NavMoveDir == ImGuiDir_Down && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) - { - bb_rel.Min.y = bb_rel.Max.y = -window->WindowPadding.y; - if (move_flags & ImGuiNavMoveFlags_WrapY) - { - bb_rel.TranslateX(+bb_rel.GetWidth()); // Next column - clip_dir = ImGuiDir_Right; - } - do_forward = true; - } - if (!do_forward) - return; - window->NavRectRel[g.NavLayer] = bb_rel; - NavMoveRequestForward(g.NavMoveDir, clip_dir, move_flags, g.NavMoveScrollFlags); -} - -static int ImGui::FindWindowFocusIndex(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - IM_UNUSED(g); - int order = window->FocusOrder; - IM_ASSERT(window->RootWindow == window); // No child window (not testing _ChildWindow because of docking) - IM_ASSERT(g.WindowsFocusOrder[order] == window); - return order; -} - -static ImGuiWindow* FindWindowNavFocusable(int i_start, int i_stop, int dir) // FIXME-OPT O(N) -{ - ImGuiContext& g = *GImGui; - for (int i = i_start; i >= 0 && i < g.WindowsFocusOrder.Size && i != i_stop; i += dir) - if (ImGui::IsWindowNavFocusable(g.WindowsFocusOrder[i])) - return g.WindowsFocusOrder[i]; - return NULL; -} - -static void NavUpdateWindowingHighlightWindow(int focus_change_dir) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.NavWindowingTarget); - if (g.NavWindowingTarget->Flags & ImGuiWindowFlags_Modal) - return; - - const int i_current = ImGui::FindWindowFocusIndex(g.NavWindowingTarget); - ImGuiWindow* window_target = FindWindowNavFocusable(i_current + focus_change_dir, -INT_MAX, focus_change_dir); - if (!window_target) - window_target = FindWindowNavFocusable((focus_change_dir < 0) ? (g.WindowsFocusOrder.Size - 1) : 0, i_current, focus_change_dir); - if (window_target) // Don't reset windowing target if there's a single window in the list - { - g.NavWindowingTarget = g.NavWindowingTargetAnim = window_target; - g.NavWindowingAccumDeltaPos = g.NavWindowingAccumDeltaSize = ImVec2(0.0f, 0.0f); - } - g.NavWindowingToggleLayer = false; -} - -// Windowing management mode -// Keyboard: CTRL+Tab (change focus/move/resize), Alt (toggle menu layer) -// Gamepad: Hold Menu/Square (change focus/move/resize), Tap Menu/Square (toggle menu layer) -static void ImGui::NavUpdateWindowing() -{ - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - - ImGuiWindow* apply_focus_window = NULL; - bool apply_toggle_layer = false; - - ImGuiWindow* modal_window = GetTopMostPopupModal(); - bool allow_windowing = (modal_window == NULL); - if (!allow_windowing) - g.NavWindowingTarget = NULL; - - // Fade out - if (g.NavWindowingTargetAnim && g.NavWindowingTarget == NULL) - { - g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha - io.DeltaTime * 10.0f, 0.0f); - if (g.DimBgRatio <= 0.0f && g.NavWindowingHighlightAlpha <= 0.0f) - g.NavWindowingTargetAnim = NULL; - } - - // Start CTRL+Tab or Square+L/R window selection - const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; - const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, false); - const bool start_windowing_with_keyboard = allow_windowing && nav_keyboard_active && !g.NavWindowingTarget && io.KeyCtrl && IsKeyPressed(ImGuiKey_Tab, false); - if (start_windowing_with_gamepad || start_windowing_with_keyboard) - if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) - { - g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow; - g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f; - g.NavWindowingAccumDeltaPos = g.NavWindowingAccumDeltaSize = ImVec2(0.0f, 0.0f); - g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer - g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad; - } - - // Gamepad update - g.NavWindowingTimer += io.DeltaTime; - if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Gamepad) - { - // Highlight only appears after a brief time holding the button, so that a fast tap on PadMenu (to toggle NavLayer) doesn't add visual noise - g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); - - // Select window to focus - const int focus_change_dir = (int)IsKeyPressed(ImGuiKey_GamepadL1) - (int)IsKeyPressed(ImGuiKey_GamepadR1); - if (focus_change_dir != 0) - { - NavUpdateWindowingHighlightWindow(focus_change_dir); - g.NavWindowingHighlightAlpha = 1.0f; - } - - // Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered top-most) - if (!IsKeyDown(ImGuiKey_NavGamepadMenu)) - { - g.NavWindowingToggleLayer &= (g.NavWindowingHighlightAlpha < 1.0f); // Once button was held long enough we don't consider it a tap-to-toggle-layer press anymore. - if (g.NavWindowingToggleLayer && g.NavWindow) - apply_toggle_layer = true; - else if (!g.NavWindowingToggleLayer) - apply_focus_window = g.NavWindowingTarget; - g.NavWindowingTarget = NULL; - } - } - - // Keyboard: Focus - if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Keyboard) - { - // Visuals only appears after a brief time after pressing TAB the first time, so that a fast CTRL+TAB doesn't add visual noise - g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); // 1.0f - if (IsKeyPressed(ImGuiKey_Tab, true)) - NavUpdateWindowingHighlightWindow(io.KeyShift ? +1 : -1); - if (!io.KeyCtrl) - apply_focus_window = g.NavWindowingTarget; - } - - // Keyboard: Press and Release ALT to toggle menu layer - // - Testing that only Alt is tested prevents Alt+Shift or AltGR from toggling menu layer. - // - AltGR is normally Alt+Ctrl but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). But even on keyboards without AltGR we don't want Alt+Ctrl to open menu anyway. - if (nav_keyboard_active && IsKeyPressed(ImGuiKey_ModAlt)) - { - g.NavWindowingToggleLayer = true; - g.NavInputSource = ImGuiInputSource_Keyboard; - } - if (g.NavWindowingToggleLayer && g.NavInputSource == ImGuiInputSource_Keyboard) - { - // We cancel toggling nav layer when any text has been typed (generally while holding Alt). (See #370) - // We cancel toggling nav layer when other modifiers are pressed. (See #4439) - if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper) - g.NavWindowingToggleLayer = false; - - // Apply layer toggle on release - // Important: as before version <18314 we lacked an explicit IO event for focus gain/loss, we also compare mouse validity to detect old backends clearing mouse pos on focus loss. - if (IsKeyReleased(ImGuiKey_ModAlt) && g.NavWindowingToggleLayer) - if (g.ActiveId == 0 || g.ActiveIdAllowOverlap) - if (IsMousePosValid(&io.MousePos) == IsMousePosValid(&io.MousePosPrev)) - apply_toggle_layer = true; - if (!IsKeyDown(ImGuiKey_ModAlt)) - g.NavWindowingToggleLayer = false; - } - - // Move window - if (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoMove)) - { - ImVec2 nav_move_dir; - if (g.NavInputSource == ImGuiInputSource_Keyboard && !io.KeyShift) - nav_move_dir = GetKeyVector2d(ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow); - if (g.NavInputSource == ImGuiInputSource_Gamepad) - nav_move_dir = GetKeyVector2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown); - if (nav_move_dir.x != 0.0f || nav_move_dir.y != 0.0f) - { - const float NAV_MOVE_SPEED = 800.0f; - const float move_step = NAV_MOVE_SPEED * io.DeltaTime * ImMin(io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); - g.NavWindowingAccumDeltaPos += nav_move_dir * move_step; - g.NavDisableMouseHover = true; - ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaPos); - if (accum_floored.x != 0.0f || accum_floored.y != 0.0f) - { - ImGuiWindow* moving_window = g.NavWindowingTarget->RootWindow; - SetWindowPos(moving_window, moving_window->Pos + accum_floored, ImGuiCond_Always); - g.NavWindowingAccumDeltaPos -= accum_floored; - } - } - } - - // Apply final focus - if (apply_focus_window && (g.NavWindow == NULL || apply_focus_window != g.NavWindow->RootWindow)) - { - ClearActiveID(); - NavRestoreHighlightAfterMove(); - apply_focus_window = NavRestoreLastChildNavWindow(apply_focus_window); - ClosePopupsOverWindow(apply_focus_window, false); - FocusWindow(apply_focus_window); - if (apply_focus_window->NavLastIds[0] == 0) - NavInitWindow(apply_focus_window, false); - - // If the window has ONLY a menu layer (no main layer), select it directly - // Use NavLayersActiveMaskNext since windows didn't have a chance to be Begin()-ed on this frame, - // so CTRL+Tab where the keys are only held for 1 frame will be able to use correct layers mask since - // the target window as already been previewed once. - // FIXME-NAV: This should be done in NavInit.. or in FocusWindow... However in both of those cases, - // we won't have a guarantee that windows has been visible before and therefore NavLayersActiveMask* - // won't be valid. - if (apply_focus_window->DC.NavLayersActiveMaskNext == (1 << ImGuiNavLayer_Menu)) - g.NavLayer = ImGuiNavLayer_Menu; - } - if (apply_focus_window) - g.NavWindowingTarget = NULL; - - // Apply menu/layer toggle - if (apply_toggle_layer && g.NavWindow) - { - ClearActiveID(); - - // Move to parent menu if necessary - ImGuiWindow* new_nav_window = g.NavWindow; - while (new_nav_window->ParentWindow - && (new_nav_window->DC.NavLayersActiveMask & (1 << ImGuiNavLayer_Menu)) == 0 - && (new_nav_window->Flags & ImGuiWindowFlags_ChildWindow) != 0 - && (new_nav_window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0) - new_nav_window = new_nav_window->ParentWindow; - if (new_nav_window != g.NavWindow) - { - ImGuiWindow* old_nav_window = g.NavWindow; - FocusWindow(new_nav_window); - new_nav_window->NavLastChildNavWindow = old_nav_window; - } - - // Toggle layer - const ImGuiNavLayer new_nav_layer = (g.NavWindow->DC.NavLayersActiveMask & (1 << ImGuiNavLayer_Menu)) ? (ImGuiNavLayer)((int)g.NavLayer ^ 1) : ImGuiNavLayer_Main; - if (new_nav_layer != g.NavLayer) - { - // Reinitialize navigation when entering menu bar with the Alt key (FIXME: could be a properly of the layer?) - if (new_nav_layer == ImGuiNavLayer_Menu) - g.NavWindow->NavLastIds[new_nav_layer] = 0; - NavRestoreLayer(new_nav_layer); - NavRestoreHighlightAfterMove(); - } - } -} - -// Window has already passed the IsWindowNavFocusable() -static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window) -{ - if (window->Flags & ImGuiWindowFlags_Popup) - return "(Popup)"; - if ((window->Flags & ImGuiWindowFlags_MenuBar) && strcmp(window->Name, "##MainMenuBar") == 0) - return "(Main menu bar)"; - return "(Untitled)"; -} - -// Overlay displayed when using CTRL+TAB. Called by EndFrame(). -void ImGui::NavUpdateWindowingOverlay() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.NavWindowingTarget != NULL); - - if (g.NavWindowingTimer < NAV_WINDOWING_LIST_APPEAR_DELAY) - return; - - if (g.NavWindowingListWindow == NULL) - g.NavWindowingListWindow = FindWindowByName("###NavWindowingList"); - const ImGuiViewport* viewport = GetMainViewport(); - SetNextWindowSizeConstraints(ImVec2(viewport->Size.x * 0.20f, viewport->Size.y * 0.20f), ImVec2(FLT_MAX, FLT_MAX)); - SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); - PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f); - Begin("###NavWindowingList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings); - for (int n = g.WindowsFocusOrder.Size - 1; n >= 0; n--) - { - ImGuiWindow* window = g.WindowsFocusOrder[n]; - IM_ASSERT(window != NULL); // Fix static analyzers - if (!IsWindowNavFocusable(window)) - continue; - const char* label = window->Name; - if (label == FindRenderedTextEnd(label)) - label = GetFallbackWindowNameForWindowingList(window); - Selectable(label, g.NavWindowingTarget == window); - } - End(); - PopStyleVar(); -} - - -//----------------------------------------------------------------------------- -// [SECTION] DRAG AND DROP -//----------------------------------------------------------------------------- - -bool ImGui::IsDragDropActive() -{ - ImGuiContext& g = *GImGui; - return g.DragDropActive; -} - -void ImGui::ClearDragDrop() -{ - ImGuiContext& g = *GImGui; - g.DragDropActive = false; - g.DragDropPayload.Clear(); - g.DragDropAcceptFlags = ImGuiDragDropFlags_None; - g.DragDropAcceptIdCurr = g.DragDropAcceptIdPrev = 0; - g.DragDropAcceptIdCurrRectSurface = FLT_MAX; - g.DragDropAcceptFrameCount = -1; - - g.DragDropPayloadBufHeap.clear(); - memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); -} - -// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() -// If the item has an identifier: -// - This assume/require the item to be activated (typically via ButtonBehavior). -// - Therefore if you want to use this with a mouse button other than left mouse button, it is up to the item itself to activate with another button. -// - We then pull and use the mouse button that was used to activate the item and use it to carry on the drag. -// If the item has no identifier: -// - Currently always assume left mouse button. -bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // FIXME-DRAGDROP: While in the common-most "drag from non-zero active id" case we can tell the mouse button, - // in both SourceExtern and id==0 cases we may requires something else (explicit flags or some heuristic). - ImGuiMouseButton mouse_button = ImGuiMouseButton_Left; - - bool source_drag_active = false; - ImGuiID source_id = 0; - ImGuiID source_parent_id = 0; - if (!(flags & ImGuiDragDropFlags_SourceExtern)) - { - source_id = g.LastItemData.ID; - if (source_id != 0) - { - // Common path: items with ID - if (g.ActiveId != source_id) - return false; - if (g.ActiveIdMouseButton != -1) - mouse_button = g.ActiveIdMouseButton; - if (g.IO.MouseDown[mouse_button] == false || window->SkipItems) - return false; - g.ActiveIdAllowOverlap = false; - } - else - { - // Uncommon path: items without ID - if (g.IO.MouseDown[mouse_button] == false || window->SkipItems) - return false; - if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) == 0 && (g.ActiveId == 0 || g.ActiveIdWindow != window)) - return false; - - // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to: - // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag. - if (!(flags & ImGuiDragDropFlags_SourceAllowNullID)) - { - IM_ASSERT(0); - return false; - } - - // Magic fallback to handle items with no assigned ID, e.g. Text(), Image() - // We build a throwaway ID based on current ID stack + relative AABB of items in window. - // THE IDENTIFIER WON'T SURVIVE ANY REPOSITIONING/RESIZINGG OF THE WIDGET, so if your widget moves your dragging operation will be canceled. - // We don't need to maintain/call ClearActiveID() as releasing the button will early out this function and trigger !ActiveIdIsAlive. - // Rely on keeping other window->LastItemXXX fields intact. - source_id = g.LastItemData.ID = window->GetIDFromRectangle(g.LastItemData.Rect); - KeepAliveID(source_id); - bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id); - if (is_hovered && g.IO.MouseClicked[mouse_button]) - { - SetActiveID(source_id, window); - FocusWindow(window); - } - if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker. - g.ActiveIdAllowOverlap = is_hovered; - } - if (g.ActiveId != source_id) - return false; - source_parent_id = window->IDStack.back(); - source_drag_active = IsMouseDragging(mouse_button); - - // Disable navigation and key inputs while dragging + cancel existing request if any - SetActiveIdUsingNavAndKeys(); - } - else - { - window = NULL; - source_id = ImHashStr("#SourceExtern"); - source_drag_active = true; - } - - if (source_drag_active) - { - if (!g.DragDropActive) - { - IM_ASSERT(source_id != 0); - ClearDragDrop(); - ImGuiPayload& payload = g.DragDropPayload; - payload.SourceId = source_id; - payload.SourceParentId = source_parent_id; - g.DragDropActive = true; - g.DragDropSourceFlags = flags; - g.DragDropMouseButton = mouse_button; - if (payload.SourceId == g.ActiveId) - g.ActiveIdNoClearOnFocusLoss = true; - } - g.DragDropSourceFrameCount = g.FrameCount; - g.DragDropWithinSource = true; - - if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) - { - // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit) - // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents. - BeginTooltip(); - if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip)) - { - ImGuiWindow* tooltip_window = g.CurrentWindow; - tooltip_window->Hidden = tooltip_window->SkipItems = true; - tooltip_window->HiddenFramesCanSkipItems = 1; - } - } - - if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern)) - g.LastItemData.StatusFlags &= ~ImGuiItemStatusFlags_HoveredRect; - - return true; - } - return false; -} - -void ImGui::EndDragDropSource() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.DragDropActive); - IM_ASSERT(g.DragDropWithinSource && "Not after a BeginDragDropSource()?"); - - if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) - EndTooltip(); - - // Discard the drag if have not called SetDragDropPayload() - if (g.DragDropPayload.DataFrameCount == -1) - ClearDragDrop(); - g.DragDropWithinSource = false; -} - -// Use 'cond' to choose to submit payload on drag start or every frame -bool ImGui::SetDragDropPayload(const char* type, const void* data, size_t data_size, ImGuiCond cond) -{ - ImGuiContext& g = *GImGui; - ImGuiPayload& payload = g.DragDropPayload; - if (cond == 0) - cond = ImGuiCond_Always; - - IM_ASSERT(type != NULL); - IM_ASSERT(strlen(type) < IM_ARRAYSIZE(payload.DataType) && "Payload type can be at most 32 characters long"); - IM_ASSERT((data != NULL && data_size > 0) || (data == NULL && data_size == 0)); - IM_ASSERT(cond == ImGuiCond_Always || cond == ImGuiCond_Once); - IM_ASSERT(payload.SourceId != 0); // Not called between BeginDragDropSource() and EndDragDropSource() - - if (cond == ImGuiCond_Always || payload.DataFrameCount == -1) - { - // Copy payload - ImStrncpy(payload.DataType, type, IM_ARRAYSIZE(payload.DataType)); - g.DragDropPayloadBufHeap.resize(0); - if (data_size > sizeof(g.DragDropPayloadBufLocal)) - { - // Store in heap - g.DragDropPayloadBufHeap.resize((int)data_size); - payload.Data = g.DragDropPayloadBufHeap.Data; - memcpy(payload.Data, data, data_size); - } - else if (data_size > 0) - { - // Store locally - memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); - payload.Data = g.DragDropPayloadBufLocal; - memcpy(payload.Data, data, data_size); - } - else - { - payload.Data = NULL; - } - payload.DataSize = (int)data_size; - } - payload.DataFrameCount = g.FrameCount; - - // Return whether the payload has been accepted - return (g.DragDropAcceptFrameCount == g.FrameCount) || (g.DragDropAcceptFrameCount == g.FrameCount - 1); -} - -bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id) -{ - ImGuiContext& g = *GImGui; - if (!g.DragDropActive) - return false; - - ImGuiWindow* window = g.CurrentWindow; - ImGuiWindow* hovered_window = g.HoveredWindowUnderMovingWindow; - if (hovered_window == NULL || window->RootWindow != hovered_window->RootWindow) - return false; - IM_ASSERT(id != 0); - if (!IsMouseHoveringRect(bb.Min, bb.Max) || (id == g.DragDropPayload.SourceId)) - return false; - if (window->SkipItems) - return false; - - IM_ASSERT(g.DragDropWithinTarget == false); - g.DragDropTargetRect = bb; - g.DragDropTargetId = id; - g.DragDropWithinTarget = true; - return true; -} - -// We don't use BeginDragDropTargetCustom() and duplicate its code because: -// 1) we use LastItemRectHoveredRect which handles items that pushes a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them. -// 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can. -// Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case) -bool ImGui::BeginDragDropTarget() -{ - ImGuiContext& g = *GImGui; - if (!g.DragDropActive) - return false; - - ImGuiWindow* window = g.CurrentWindow; - if (!(g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect)) - return false; - ImGuiWindow* hovered_window = g.HoveredWindowUnderMovingWindow; - if (hovered_window == NULL || window->RootWindow != hovered_window->RootWindow || window->SkipItems) - return false; - - const ImRect& display_rect = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) ? g.LastItemData.DisplayRect : g.LastItemData.Rect; - ImGuiID id = g.LastItemData.ID; - if (id == 0) - { - id = window->GetIDFromRectangle(display_rect); - KeepAliveID(id); - } - if (g.DragDropPayload.SourceId == id) - return false; - - IM_ASSERT(g.DragDropWithinTarget == false); - g.DragDropTargetRect = display_rect; - g.DragDropTargetId = id; - g.DragDropWithinTarget = true; - return true; -} - -bool ImGui::IsDragDropPayloadBeingAccepted() -{ - ImGuiContext& g = *GImGui; - return g.DragDropActive && g.DragDropAcceptIdPrev != 0; -} - -const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiPayload& payload = g.DragDropPayload; - IM_ASSERT(g.DragDropActive); // Not called between BeginDragDropTarget() and EndDragDropTarget() ? - IM_ASSERT(payload.DataFrameCount != -1); // Forgot to call EndDragDropTarget() ? - if (type != NULL && !payload.IsDataType(type)) - return NULL; - - // Accept smallest drag target bounding box, this allows us to nest drag targets conveniently without ordering constraints. - // NB: We currently accept NULL id as target. However, overlapping targets requires a unique ID to function! - const bool was_accepted_previously = (g.DragDropAcceptIdPrev == g.DragDropTargetId); - ImRect r = g.DragDropTargetRect; - float r_surface = r.GetWidth() * r.GetHeight(); - if (r_surface <= g.DragDropAcceptIdCurrRectSurface) - { - g.DragDropAcceptFlags = flags; - g.DragDropAcceptIdCurr = g.DragDropTargetId; - g.DragDropAcceptIdCurrRectSurface = r_surface; - } - - // Render default drop visuals - // FIXME-DRAGDROP: Settle on a proper default visuals for drop target. - payload.Preview = was_accepted_previously; - flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that lives for 1 frame) - if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) - window->DrawList->AddRect(r.Min - ImVec2(3.5f,3.5f), r.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); - - g.DragDropAcceptFrameCount = g.FrameCount; - payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting os window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased() - if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery)) - return NULL; - - return &payload; -} - -const ImGuiPayload* ImGui::GetDragDropPayload() -{ - ImGuiContext& g = *GImGui; - return g.DragDropActive ? &g.DragDropPayload : NULL; -} - -// We don't really use/need this now, but added it for the sake of consistency and because we might need it later. -void ImGui::EndDragDropTarget() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.DragDropActive); - IM_ASSERT(g.DragDropWithinTarget); - g.DragDropWithinTarget = false; -} - -//----------------------------------------------------------------------------- -// [SECTION] LOGGING/CAPTURING -//----------------------------------------------------------------------------- -// All text output from the interface can be captured into tty/file/clipboard. -// By default, tree nodes are automatically opened during logging. -//----------------------------------------------------------------------------- - -// Pass text data straight to log (without being displayed) -static inline void LogTextV(ImGuiContext& g, const char* fmt, va_list args) -{ - if (g.LogFile) - { - g.LogBuffer.Buf.resize(0); - g.LogBuffer.appendfv(fmt, args); - ImFileWrite(g.LogBuffer.c_str(), sizeof(char), (ImU64)g.LogBuffer.size(), g.LogFile); - } - else - { - g.LogBuffer.appendfv(fmt, args); - } -} - -void ImGui::LogText(const char* fmt, ...) -{ - ImGuiContext& g = *GImGui; - if (!g.LogEnabled) - return; - - va_list args; - va_start(args, fmt); - LogTextV(g, fmt, args); - va_end(args); -} - -void ImGui::LogTextV(const char* fmt, va_list args) -{ - ImGuiContext& g = *GImGui; - if (!g.LogEnabled) - return; - - LogTextV(g, fmt, args); -} - -// Internal version that takes a position to decide on newline placement and pad items according to their depth. -// We split text into individual lines to add current tree level padding -// FIXME: This code is a little complicated perhaps, considering simplifying the whole system. -void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - const char* prefix = g.LogNextPrefix; - const char* suffix = g.LogNextSuffix; - g.LogNextPrefix = g.LogNextSuffix = NULL; - - if (!text_end) - text_end = FindRenderedTextEnd(text, text_end); - - const bool log_new_line = ref_pos && (ref_pos->y > g.LogLinePosY + g.Style.FramePadding.y + 1); - if (ref_pos) - g.LogLinePosY = ref_pos->y; - if (log_new_line) - { - LogText(IM_NEWLINE); - g.LogLineFirstItem = true; - } - - if (prefix) - LogRenderedText(ref_pos, prefix, prefix + strlen(prefix)); // Calculate end ourself to ensure "##" are included here. - - // Re-adjust padding if we have popped out of our starting depth - if (g.LogDepthRef > window->DC.TreeDepth) - g.LogDepthRef = window->DC.TreeDepth; - const int tree_depth = (window->DC.TreeDepth - g.LogDepthRef); - - const char* text_remaining = text; - for (;;) - { - // Split the string. Each new line (after a '\n') is followed by indentation corresponding to the current depth of our log entry. - // We don't add a trailing \n yet to allow a subsequent item on the same line to be captured. - const char* line_start = text_remaining; - const char* line_end = ImStreolRange(line_start, text_end); - const bool is_last_line = (line_end == text_end); - if (line_start != line_end || !is_last_line) - { - const int line_length = (int)(line_end - line_start); - const int indentation = g.LogLineFirstItem ? tree_depth * 4 : 1; - LogText("%*s%.*s", indentation, "", line_length, line_start); - g.LogLineFirstItem = false; - if (*line_end == '\n') - { - LogText(IM_NEWLINE); - g.LogLineFirstItem = true; - } - } - if (is_last_line) - break; - text_remaining = line_end + 1; - } - - if (suffix) - LogRenderedText(ref_pos, suffix, suffix + strlen(suffix)); -} - -// Start logging/capturing text output -void ImGui::LogBegin(ImGuiLogType type, int auto_open_depth) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(g.LogEnabled == false); - IM_ASSERT(g.LogFile == NULL); - IM_ASSERT(g.LogBuffer.empty()); - g.LogEnabled = true; - g.LogType = type; - g.LogNextPrefix = g.LogNextSuffix = NULL; - g.LogDepthRef = window->DC.TreeDepth; - g.LogDepthToExpand = ((auto_open_depth >= 0) ? auto_open_depth : g.LogDepthToExpandDefault); - g.LogLinePosY = FLT_MAX; - g.LogLineFirstItem = true; -} - -// Important: doesn't copy underlying data, use carefully (prefix/suffix must be in scope at the time of the next LogRenderedText) -void ImGui::LogSetNextTextDecoration(const char* prefix, const char* suffix) -{ - ImGuiContext& g = *GImGui; - g.LogNextPrefix = prefix; - g.LogNextSuffix = suffix; -} - -void ImGui::LogToTTY(int auto_open_depth) -{ - ImGuiContext& g = *GImGui; - if (g.LogEnabled) - return; - IM_UNUSED(auto_open_depth); -#ifndef IMGUI_DISABLE_TTY_FUNCTIONS - LogBegin(ImGuiLogType_TTY, auto_open_depth); - g.LogFile = stdout; -#endif -} - -// Start logging/capturing text output to given file -void ImGui::LogToFile(int auto_open_depth, const char* filename) -{ - ImGuiContext& g = *GImGui; - if (g.LogEnabled) - return; - - // FIXME: We could probably open the file in text mode "at", however note that clipboard/buffer logging will still - // be subject to outputting OS-incompatible carriage return if within strings the user doesn't use IM_NEWLINE. - // By opening the file in binary mode "ab" we have consistent output everywhere. - if (!filename) - filename = g.IO.LogFilename; - if (!filename || !filename[0]) - return; - ImFileHandle f = ImFileOpen(filename, "ab"); - if (!f) - { - IM_ASSERT(0); - return; - } - - LogBegin(ImGuiLogType_File, auto_open_depth); - g.LogFile = f; -} - -// Start logging/capturing text output to clipboard -void ImGui::LogToClipboard(int auto_open_depth) -{ - ImGuiContext& g = *GImGui; - if (g.LogEnabled) - return; - LogBegin(ImGuiLogType_Clipboard, auto_open_depth); -} - -void ImGui::LogToBuffer(int auto_open_depth) -{ - ImGuiContext& g = *GImGui; - if (g.LogEnabled) - return; - LogBegin(ImGuiLogType_Buffer, auto_open_depth); -} - -void ImGui::LogFinish() -{ - ImGuiContext& g = *GImGui; - if (!g.LogEnabled) - return; - - LogText(IM_NEWLINE); - switch (g.LogType) - { - case ImGuiLogType_TTY: -#ifndef IMGUI_DISABLE_TTY_FUNCTIONS - fflush(g.LogFile); -#endif - break; - case ImGuiLogType_File: - ImFileClose(g.LogFile); - break; - case ImGuiLogType_Buffer: - break; - case ImGuiLogType_Clipboard: - if (!g.LogBuffer.empty()) - SetClipboardText(g.LogBuffer.begin()); - break; - case ImGuiLogType_None: - IM_ASSERT(0); - break; - } - - g.LogEnabled = false; - g.LogType = ImGuiLogType_None; - g.LogFile = NULL; - g.LogBuffer.clear(); -} - -// Helper to display logging buttons -// FIXME-OBSOLETE: We should probably obsolete this and let the user have their own helper (this is one of the oldest function alive!) -void ImGui::LogButtons() -{ - ImGuiContext& g = *GImGui; - - PushID("LogButtons"); -#ifndef IMGUI_DISABLE_TTY_FUNCTIONS - const bool log_to_tty = Button("Log To TTY"); SameLine(); -#else - const bool log_to_tty = false; -#endif - const bool log_to_file = Button("Log To File"); SameLine(); - const bool log_to_clipboard = Button("Log To Clipboard"); SameLine(); - PushAllowKeyboardFocus(false); - SetNextItemWidth(80.0f); - SliderInt("Default Depth", &g.LogDepthToExpandDefault, 0, 9, NULL); - PopAllowKeyboardFocus(); - PopID(); - - // Start logging at the end of the function so that the buttons don't appear in the log - if (log_to_tty) - LogToTTY(); - if (log_to_file) - LogToFile(); - if (log_to_clipboard) - LogToClipboard(); -} - - -//----------------------------------------------------------------------------- -// [SECTION] SETTINGS -//----------------------------------------------------------------------------- -// - UpdateSettings() [Internal] -// - MarkIniSettingsDirty() [Internal] -// - CreateNewWindowSettings() [Internal] -// - FindWindowSettings() [Internal] -// - FindOrCreateWindowSettings() [Internal] -// - FindSettingsHandler() [Internal] -// - ClearIniSettings() [Internal] -// - LoadIniSettingsFromDisk() -// - LoadIniSettingsFromMemory() -// - SaveIniSettingsToDisk() -// - SaveIniSettingsToMemory() -// - WindowSettingsHandler_***() [Internal] -//----------------------------------------------------------------------------- - -// Called by NewFrame() -void ImGui::UpdateSettings() -{ - // Load settings on first frame (if not explicitly loaded manually before) - ImGuiContext& g = *GImGui; - if (!g.SettingsLoaded) - { - IM_ASSERT(g.SettingsWindows.empty()); - if (g.IO.IniFilename) - LoadIniSettingsFromDisk(g.IO.IniFilename); - g.SettingsLoaded = true; - } - - // Save settings (with a delay after the last modification, so we don't spam disk too much) - if (g.SettingsDirtyTimer > 0.0f) - { - g.SettingsDirtyTimer -= g.IO.DeltaTime; - if (g.SettingsDirtyTimer <= 0.0f) - { - if (g.IO.IniFilename != NULL) - SaveIniSettingsToDisk(g.IO.IniFilename); - else - g.IO.WantSaveIniSettings = true; // Let user know they can call SaveIniSettingsToMemory(). user will need to clear io.WantSaveIniSettings themselves. - g.SettingsDirtyTimer = 0.0f; - } - } -} - -void ImGui::MarkIniSettingsDirty() -{ - ImGuiContext& g = *GImGui; - if (g.SettingsDirtyTimer <= 0.0f) - g.SettingsDirtyTimer = g.IO.IniSavingRate; -} - -void ImGui::MarkIniSettingsDirty(ImGuiWindow* window) -{ - ImGuiContext& g = *GImGui; - if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) - if (g.SettingsDirtyTimer <= 0.0f) - g.SettingsDirtyTimer = g.IO.IniSavingRate; -} - -ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name) -{ - ImGuiContext& g = *GImGui; - -#if !IMGUI_DEBUG_INI_SETTINGS - // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() - // Preserve the full string when IMGUI_DEBUG_INI_SETTINGS is set to make .ini inspection easier. - if (const char* p = strstr(name, "###")) - name = p; -#endif - const size_t name_len = strlen(name); - - // Allocate chunk - const size_t chunk_size = sizeof(ImGuiWindowSettings) + name_len + 1; - ImGuiWindowSettings* settings = g.SettingsWindows.alloc_chunk(chunk_size); - IM_PLACEMENT_NEW(settings) ImGuiWindowSettings(); - settings->ID = ImHashStr(name, name_len); - memcpy(settings->GetName(), name, name_len + 1); // Store with zero terminator - - return settings; -} - -ImGuiWindowSettings* ImGui::FindWindowSettings(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) - if (settings->ID == id) - return settings; - return NULL; -} - -ImGuiWindowSettings* ImGui::FindOrCreateWindowSettings(const char* name) -{ - if (ImGuiWindowSettings* settings = FindWindowSettings(ImHashStr(name))) - return settings; - return CreateNewWindowSettings(name); -} - -void ImGui::AddSettingsHandler(const ImGuiSettingsHandler* handler) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(FindSettingsHandler(handler->TypeName) == NULL); - g.SettingsHandlers.push_back(*handler); -} - -void ImGui::RemoveSettingsHandler(const char* type_name) -{ - ImGuiContext& g = *GImGui; - if (ImGuiSettingsHandler* handler = FindSettingsHandler(type_name)) - g.SettingsHandlers.erase(handler); -} - -ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name) -{ - ImGuiContext& g = *GImGui; - const ImGuiID type_hash = ImHashStr(type_name); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].TypeHash == type_hash) - return &g.SettingsHandlers[handler_n]; - return NULL; -} - -void ImGui::ClearIniSettings() -{ - ImGuiContext& g = *GImGui; - g.SettingsIniData.clear(); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ClearAllFn) - g.SettingsHandlers[handler_n].ClearAllFn(&g, &g.SettingsHandlers[handler_n]); -} - -void ImGui::LoadIniSettingsFromDisk(const char* ini_filename) -{ - size_t file_data_size = 0; - char* file_data = (char*)ImFileLoadToMemory(ini_filename, "rb", &file_data_size); - if (!file_data) - return; - if (file_data_size > 0) - LoadIniSettingsFromMemory(file_data, (size_t)file_data_size); - IM_FREE(file_data); -} - -// Zero-tolerance, no error reporting, cheap .ini parsing -void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.Initialized); - //IM_ASSERT(!g.WithinFrameScope && "Cannot be called between NewFrame() and EndFrame()"); - //IM_ASSERT(g.SettingsLoaded == false && g.FrameCount == 0); - - // For user convenience, we allow passing a non zero-terminated string (hence the ini_size parameter). - // For our convenience and to make the code simpler, we'll also write zero-terminators within the buffer. So let's create a writable copy.. - if (ini_size == 0) - ini_size = strlen(ini_data); - g.SettingsIniData.Buf.resize((int)ini_size + 1); - char* const buf = g.SettingsIniData.Buf.Data; - char* const buf_end = buf + ini_size; - memcpy(buf, ini_data, ini_size); - buf_end[0] = 0; - - // Call pre-read handlers - // Some types will clear their data (e.g. dock information) some types will allow merge/override (window) - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ReadInitFn) - g.SettingsHandlers[handler_n].ReadInitFn(&g, &g.SettingsHandlers[handler_n]); - - void* entry_data = NULL; - ImGuiSettingsHandler* entry_handler = NULL; - - char* line_end = NULL; - for (char* line = buf; line < buf_end; line = line_end + 1) - { - // Skip new lines markers, then find end of the line - while (*line == '\n' || *line == '\r') - line++; - line_end = line; - while (line_end < buf_end && *line_end != '\n' && *line_end != '\r') - line_end++; - line_end[0] = 0; - if (line[0] == ';') - continue; - if (line[0] == '[' && line_end > line && line_end[-1] == ']') - { - // Parse "[Type][Name]". Note that 'Name' can itself contains [] characters, which is acceptable with the current format and parsing code. - line_end[-1] = 0; - const char* name_end = line_end - 1; - const char* type_start = line + 1; - char* type_end = (char*)(void*)ImStrchrRange(type_start, name_end, ']'); - const char* name_start = type_end ? ImStrchrRange(type_end + 1, name_end, '[') : NULL; - if (!type_end || !name_start) - continue; - *type_end = 0; // Overwrite first ']' - name_start++; // Skip second '[' - entry_handler = FindSettingsHandler(type_start); - entry_data = entry_handler ? entry_handler->ReadOpenFn(&g, entry_handler, name_start) : NULL; - } - else if (entry_handler != NULL && entry_data != NULL) - { - // Let type handler parse the line - entry_handler->ReadLineFn(&g, entry_handler, entry_data, line); - } - } - g.SettingsLoaded = true; - - // [DEBUG] Restore untouched copy so it can be browsed in Metrics (not strictly necessary) - memcpy(buf, ini_data, ini_size); - - // Call post-read handlers - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ApplyAllFn) - g.SettingsHandlers[handler_n].ApplyAllFn(&g, &g.SettingsHandlers[handler_n]); -} - -void ImGui::SaveIniSettingsToDisk(const char* ini_filename) -{ - ImGuiContext& g = *GImGui; - g.SettingsDirtyTimer = 0.0f; - if (!ini_filename) - return; - - size_t ini_data_size = 0; - const char* ini_data = SaveIniSettingsToMemory(&ini_data_size); - ImFileHandle f = ImFileOpen(ini_filename, "wt"); - if (!f) - return; - ImFileWrite(ini_data, sizeof(char), ini_data_size, f); - ImFileClose(f); -} - -// Call registered handlers (e.g. SettingsHandlerWindow_WriteAll() + custom handlers) to write their stuff into a text buffer -const char* ImGui::SaveIniSettingsToMemory(size_t* out_size) -{ - ImGuiContext& g = *GImGui; - g.SettingsDirtyTimer = 0.0f; - g.SettingsIniData.Buf.resize(0); - g.SettingsIniData.Buf.push_back(0); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - { - ImGuiSettingsHandler* handler = &g.SettingsHandlers[handler_n]; - handler->WriteAllFn(&g, handler, &g.SettingsIniData); - } - if (out_size) - *out_size = (size_t)g.SettingsIniData.size(); - return g.SettingsIniData.c_str(); -} - -static void WindowSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) -{ - ImGuiContext& g = *ctx; - for (int i = 0; i != g.Windows.Size; i++) - g.Windows[i]->SettingsOffset = -1; - g.SettingsWindows.clear(); -} - -static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) -{ - ImGuiWindowSettings* settings = ImGui::FindOrCreateWindowSettings(name); - ImGuiID id = settings->ID; - *settings = ImGuiWindowSettings(); // Clear existing if recycling previous entry - settings->ID = id; - settings->WantApply = true; - return (void*)settings; -} - -static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) -{ - ImGuiWindowSettings* settings = (ImGuiWindowSettings*)entry; - int x, y; - int i; - if (sscanf(line, "Pos=%i,%i", &x, &y) == 2) { settings->Pos = ImVec2ih((short)x, (short)y); } - else if (sscanf(line, "Size=%i,%i", &x, &y) == 2) { settings->Size = ImVec2ih((short)x, (short)y); } - else if (sscanf(line, "Collapsed=%d", &i) == 1) { settings->Collapsed = (i != 0); } -} - -// Apply to existing windows (if any) -static void WindowSettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*) -{ - ImGuiContext& g = *ctx; - for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) - if (settings->WantApply) - { - if (ImGuiWindow* window = ImGui::FindWindowByID(settings->ID)) - ApplyWindowSettings(window, settings); - settings->WantApply = false; - } -} - -static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) -{ - // Gather data from windows that were active during this session - // (if a window wasn't opened in this session we preserve its settings) - ImGuiContext& g = *ctx; - for (int i = 0; i != g.Windows.Size; i++) - { - ImGuiWindow* window = g.Windows[i]; - if (window->Flags & ImGuiWindowFlags_NoSavedSettings) - continue; - - ImGuiWindowSettings* settings = (window->SettingsOffset != -1) ? g.SettingsWindows.ptr_from_offset(window->SettingsOffset) : ImGui::FindWindowSettings(window->ID); - if (!settings) - { - settings = ImGui::CreateNewWindowSettings(window->Name); - window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings); - } - IM_ASSERT(settings->ID == window->ID); - settings->Pos = ImVec2ih(window->Pos); - settings->Size = ImVec2ih(window->SizeFull); - - settings->Collapsed = window->Collapsed; - } - - // Write to text buffer - buf->reserve(buf->size() + g.SettingsWindows.size() * 6); // ballpark reserve - for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) - { - const char* settings_name = settings->GetName(); - buf->appendf("[%s][%s]\n", handler->TypeName, settings_name); - buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y); - buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); - buf->appendf("Collapsed=%d\n", settings->Collapsed); - buf->append("\n"); - } -} - - -//----------------------------------------------------------------------------- -// [SECTION] VIEWPORTS, PLATFORM WINDOWS -//----------------------------------------------------------------------------- -// - GetMainViewport() -// - SetWindowViewport() [Internal] -// - UpdateViewportsNewFrame() [Internal] -// (this section is more complete in the 'docking' branch) -//----------------------------------------------------------------------------- - -ImGuiViewport* ImGui::GetMainViewport() -{ - ImGuiContext& g = *GImGui; - return g.Viewports[0]; -} - -void ImGui::SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport) -{ - window->Viewport = viewport; -} - -// Update viewports and monitor infos -static void ImGui::UpdateViewportsNewFrame() -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(g.Viewports.Size == 1); - - // Update main viewport with current platform position. - // FIXME-VIEWPORT: Size is driven by backend/user code for backward-compatibility but we should aim to make this more consistent. - ImGuiViewportP* main_viewport = g.Viewports[0]; - main_viewport->Flags = ImGuiViewportFlags_IsPlatformWindow | ImGuiViewportFlags_OwnedByApp; - main_viewport->Pos = ImVec2(0.0f, 0.0f); - main_viewport->Size = g.IO.DisplaySize; - - for (int n = 0; n < g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - - // Lock down space taken by menu bars and status bars, reset the offset for fucntions like BeginMainMenuBar() to alter them again. - viewport->WorkOffsetMin = viewport->BuildWorkOffsetMin; - viewport->WorkOffsetMax = viewport->BuildWorkOffsetMax; - viewport->BuildWorkOffsetMin = viewport->BuildWorkOffsetMax = ImVec2(0.0f, 0.0f); - viewport->UpdateWorkRect(); - } -} - -//----------------------------------------------------------------------------- -// [SECTION] DOCKING -//----------------------------------------------------------------------------- - -// (this section is filled in the 'docking' branch) - - -//----------------------------------------------------------------------------- -// [SECTION] PLATFORM DEPENDENT HELPERS -//----------------------------------------------------------------------------- - -#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) - -#ifdef _MSC_VER -#pragma comment(lib, "user32") -#pragma comment(lib, "kernel32") -#endif - -// Win32 clipboard implementation -// We use g.ClipboardHandlerData for temporary storage to ensure it is freed on Shutdown() -static const char* GetClipboardTextFn_DefaultImpl(void*) -{ - ImGuiContext& g = *GImGui; - g.ClipboardHandlerData.clear(); - if (!::OpenClipboard(NULL)) - return NULL; - HANDLE wbuf_handle = ::GetClipboardData(CF_UNICODETEXT); - if (wbuf_handle == NULL) - { - ::CloseClipboard(); - return NULL; - } - if (const WCHAR* wbuf_global = (const WCHAR*)::GlobalLock(wbuf_handle)) - { - int buf_len = ::WideCharToMultiByte(CP_UTF8, 0, wbuf_global, -1, NULL, 0, NULL, NULL); - g.ClipboardHandlerData.resize(buf_len); - ::WideCharToMultiByte(CP_UTF8, 0, wbuf_global, -1, g.ClipboardHandlerData.Data, buf_len, NULL, NULL); - } - ::GlobalUnlock(wbuf_handle); - ::CloseClipboard(); - return g.ClipboardHandlerData.Data; -} - -static void SetClipboardTextFn_DefaultImpl(void*, const char* text) -{ - if (!::OpenClipboard(NULL)) - return; - const int wbuf_length = ::MultiByteToWideChar(CP_UTF8, 0, text, -1, NULL, 0); - HGLOBAL wbuf_handle = ::GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(WCHAR)); - if (wbuf_handle == NULL) - { - ::CloseClipboard(); - return; - } - WCHAR* wbuf_global = (WCHAR*)::GlobalLock(wbuf_handle); - ::MultiByteToWideChar(CP_UTF8, 0, text, -1, wbuf_global, wbuf_length); - ::GlobalUnlock(wbuf_handle); - ::EmptyClipboard(); - if (::SetClipboardData(CF_UNICODETEXT, wbuf_handle) == NULL) - ::GlobalFree(wbuf_handle); - ::CloseClipboard(); -} - -#elif defined(__APPLE__) && TARGET_OS_OSX && defined(IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS) - -#include // Use old API to avoid need for separate .mm file -static PasteboardRef main_clipboard = 0; - -// OSX clipboard implementation -// If you enable this you will need to add '-framework ApplicationServices' to your linker command-line! -static void SetClipboardTextFn_DefaultImpl(void*, const char* text) -{ - if (!main_clipboard) - PasteboardCreate(kPasteboardClipboard, &main_clipboard); - PasteboardClear(main_clipboard); - CFDataRef cf_data = CFDataCreate(kCFAllocatorDefault, (const UInt8*)text, strlen(text)); - if (cf_data) - { - PasteboardPutItemFlavor(main_clipboard, (PasteboardItemID)1, CFSTR("public.utf8-plain-text"), cf_data, 0); - CFRelease(cf_data); - } -} - -static const char* GetClipboardTextFn_DefaultImpl(void*) -{ - if (!main_clipboard) - PasteboardCreate(kPasteboardClipboard, &main_clipboard); - PasteboardSynchronize(main_clipboard); - - ItemCount item_count = 0; - PasteboardGetItemCount(main_clipboard, &item_count); - for (ItemCount i = 0; i < item_count; i++) - { - PasteboardItemID item_id = 0; - PasteboardGetItemIdentifier(main_clipboard, i + 1, &item_id); - CFArrayRef flavor_type_array = 0; - PasteboardCopyItemFlavors(main_clipboard, item_id, &flavor_type_array); - for (CFIndex j = 0, nj = CFArrayGetCount(flavor_type_array); j < nj; j++) - { - CFDataRef cf_data; - if (PasteboardCopyItemFlavorData(main_clipboard, item_id, CFSTR("public.utf8-plain-text"), &cf_data) == noErr) - { - ImGuiContext& g = *GImGui; - g.ClipboardHandlerData.clear(); - int length = (int)CFDataGetLength(cf_data); - g.ClipboardHandlerData.resize(length + 1); - CFDataGetBytes(cf_data, CFRangeMake(0, length), (UInt8*)g.ClipboardHandlerData.Data); - g.ClipboardHandlerData[length] = 0; - CFRelease(cf_data); - return g.ClipboardHandlerData.Data; - } - } - } - return NULL; -} - -#else - -// Local Dear ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers. -static const char* GetClipboardTextFn_DefaultImpl(void*) -{ - ImGuiContext& g = *GImGui; - return g.ClipboardHandlerData.empty() ? NULL : g.ClipboardHandlerData.begin(); -} - -static void SetClipboardTextFn_DefaultImpl(void*, const char* text) -{ - ImGuiContext& g = *GImGui; - g.ClipboardHandlerData.clear(); - const char* text_end = text + strlen(text); - g.ClipboardHandlerData.resize((int)(text_end - text) + 1); - memcpy(&g.ClipboardHandlerData[0], text, (size_t)(text_end - text)); - g.ClipboardHandlerData[(int)(text_end - text)] = 0; -} - -#endif - -// Win32 API IME support (for Asian languages, etc.) -#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) - -#include -#ifdef _MSC_VER -#pragma comment(lib, "imm32") -#endif - -static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatformImeData* data) -{ - // Notify OS Input Method Editor of text input position - HWND hwnd = (HWND)viewport->PlatformHandleRaw; -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - if (hwnd == 0) - hwnd = (HWND)ImGui::GetIO().ImeWindowHandle; -#endif - if (hwnd == 0) - return; - - ::ImmAssociateContextEx(hwnd, NULL, data->WantVisible ? IACE_DEFAULT : 0); - - if (HIMC himc = ::ImmGetContext(hwnd)) - { - COMPOSITIONFORM composition_form = {}; - composition_form.ptCurrentPos.x = (LONG)data->InputPos.x; - composition_form.ptCurrentPos.y = (LONG)data->InputPos.y; - composition_form.dwStyle = CFS_FORCE_POSITION; - ::ImmSetCompositionWindow(himc, &composition_form); - CANDIDATEFORM candidate_form = {}; - candidate_form.dwStyle = CFS_CANDIDATEPOS; - candidate_form.ptCurrentPos.x = (LONG)data->InputPos.x; - candidate_form.ptCurrentPos.y = (LONG)data->InputPos.y; - ::ImmSetCandidateWindow(himc, &candidate_form); - ::ImmReleaseContext(hwnd, himc); - } -} - -#else - -static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport*, ImGuiPlatformImeData*) {} - -#endif - -//----------------------------------------------------------------------------- -// [SECTION] METRICS/DEBUGGER WINDOW -//----------------------------------------------------------------------------- -// - RenderViewportThumbnail() [Internal] -// - RenderViewportsThumbnails() [Internal] -// - DebugTextEncoding() -// - MetricsHelpMarker() [Internal] -// - ShowFontAtlas() [Internal] -// - ShowMetricsWindow() -// - DebugNodeColumns() [Internal] -// - DebugNodeDrawList() [Internal] -// - DebugNodeDrawCmdShowMeshAndBoundingBox() [Internal] -// - DebugNodeFont() [Internal] -// - DebugNodeFontGlyph() [Internal] -// - DebugNodeStorage() [Internal] -// - DebugNodeTabBar() [Internal] -// - DebugNodeViewport() [Internal] -// - DebugNodeWindow() [Internal] -// - DebugNodeWindowSettings() [Internal] -// - DebugNodeWindowsList() [Internal] -// - DebugNodeWindowsListByBeginStackParent() [Internal] -//----------------------------------------------------------------------------- - -#ifndef IMGUI_DISABLE_DEBUG_TOOLS - -void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - ImVec2 scale = bb.GetSize() / viewport->Size; - ImVec2 off = bb.Min - viewport->Pos * scale; - float alpha_mul = 1.0f; - window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul * 0.40f)); - for (int i = 0; i != g.Windows.Size; i++) - { - ImGuiWindow* thumb_window = g.Windows[i]; - if (!thumb_window->WasActive || (thumb_window->Flags & ImGuiWindowFlags_ChildWindow)) - continue; - - ImRect thumb_r = thumb_window->Rect(); - ImRect title_r = thumb_window->TitleBarRect(); - thumb_r = ImRect(ImFloor(off + thumb_r.Min * scale), ImFloor(off + thumb_r.Max * scale)); - title_r = ImRect(ImFloor(off + title_r.Min * scale), ImFloor(off + ImVec2(title_r.Max.x, title_r.Min.y) * scale) + ImVec2(0,5)); // Exaggerate title bar height - thumb_r.ClipWithFull(bb); - title_r.ClipWithFull(bb); - const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight); - window->DrawList->AddRectFilled(thumb_r.Min, thumb_r.Max, GetColorU32(ImGuiCol_WindowBg, alpha_mul)); - window->DrawList->AddRectFilled(title_r.Min, title_r.Max, GetColorU32(window_is_focused ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg, alpha_mul)); - window->DrawList->AddRect(thumb_r.Min, thumb_r.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); - window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name)); - } - draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); -} - -static void RenderViewportsThumbnails() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // We don't display full monitor bounds (we could, but it often looks awkward), instead we display just enough to cover all of our viewports. - float SCALE = 1.0f / 8.0f; - ImRect bb_full(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); - for (int n = 0; n < g.Viewports.Size; n++) - bb_full.Add(g.Viewports[n]->GetMainRect()); - ImVec2 p = window->DC.CursorPos; - ImVec2 off = p - bb_full.Min * SCALE; - for (int n = 0; n < g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE); - ImGui::DebugRenderViewportThumbnail(window->DrawList, viewport, viewport_draw_bb); - } - ImGui::Dummy(bb_full.GetSize() * SCALE); -} - -// Helper tool to diagnose between text encoding issues and font loading issues. Pass your UTF-8 string and verify that there are correct. -void ImGui::DebugTextEncoding(const char* str) -{ - Text("Text: \"%s\"", str); - if (!BeginTable("list", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit)) - return; - TableSetupColumn("Offset"); - TableSetupColumn("UTF-8"); - TableSetupColumn("Glyph"); - TableSetupColumn("Codepoint"); - TableHeadersRow(); - for (const char* p = str; *p != 0; ) - { - unsigned int c; - const int c_utf8_len = ImTextCharFromUtf8(&c, p, NULL); - TableNextColumn(); - Text("%d", (int)(p - str)); - TableNextColumn(); - for (int byte_index = 0; byte_index < c_utf8_len; byte_index++) - { - if (byte_index > 0) - SameLine(); - Text("0x%02X", (int)(unsigned char)p[byte_index]); - } - TableNextColumn(); - if (GetFont()->FindGlyphNoFallback((ImWchar)c)) - TextUnformatted(p, p + c_utf8_len); - else - TextUnformatted((c == IM_UNICODE_CODEPOINT_INVALID) ? "[invalid]" : "[missing]"); - TableNextColumn(); - Text("U+%04X", (int)c); - p += c_utf8_len; - } - EndTable(); -} - -// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds. -static void MetricsHelpMarker(const char* desc) -{ - ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); - ImGui::TextUnformatted(desc); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } -} - -// [DEBUG] List fonts in a font atlas and display its texture -void ImGui::ShowFontAtlas(ImFontAtlas* atlas) -{ - for (int i = 0; i < atlas->Fonts.Size; i++) - { - ImFont* font = atlas->Fonts[i]; - PushID(font); - DebugNodeFont(font); - PopID(); - } - if (TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight)) - { - ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); - ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f); - Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), tint_col, border_col); - TreePop(); - } -} - -void ImGui::ShowMetricsWindow(bool* p_open) -{ - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; - if (cfg->ShowDebugLog) - ShowDebugLogWindow(&cfg->ShowDebugLog); - if (cfg->ShowStackTool) - ShowStackToolWindow(&cfg->ShowStackTool); - - if (!Begin("Dear ImGui Metrics/Debugger", p_open) || GetCurrentWindow()->BeginCount > 1) - { - End(); - return; - } - - // Basic info - Text("Dear ImGui %s", GetVersion()); - Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); - Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3); - Text("%d visible windows, %d active allocations", io.MetricsRenderWindows, io.MetricsActiveAllocations); - //SameLine(); if (SmallButton("GC")) { g.GcCompactAll = true; } - - Separator(); - - // Debugging enums - enum { WRT_OuterRect, WRT_OuterRectClipped, WRT_InnerRect, WRT_InnerClipRect, WRT_WorkRect, WRT_Content, WRT_ContentIdeal, WRT_ContentRegionRect, WRT_Count }; // Windows Rect Type - const char* wrt_rects_names[WRT_Count] = { "OuterRect", "OuterRectClipped", "InnerRect", "InnerClipRect", "WorkRect", "Content", "ContentIdeal", "ContentRegionRect" }; - enum { TRT_OuterRect, TRT_InnerRect, TRT_WorkRect, TRT_HostClipRect, TRT_InnerClipRect, TRT_BackgroundClipRect, TRT_ColumnsRect, TRT_ColumnsWorkRect, TRT_ColumnsClipRect, TRT_ColumnsContentHeadersUsed, TRT_ColumnsContentHeadersIdeal, TRT_ColumnsContentFrozen, TRT_ColumnsContentUnfrozen, TRT_Count }; // Tables Rect Type - const char* trt_rects_names[TRT_Count] = { "OuterRect", "InnerRect", "WorkRect", "HostClipRect", "InnerClipRect", "BackgroundClipRect", "ColumnsRect", "ColumnsWorkRect", "ColumnsClipRect", "ColumnsContentHeadersUsed", "ColumnsContentHeadersIdeal", "ColumnsContentFrozen", "ColumnsContentUnfrozen" }; - if (cfg->ShowWindowsRectsType < 0) - cfg->ShowWindowsRectsType = WRT_WorkRect; - if (cfg->ShowTablesRectsType < 0) - cfg->ShowTablesRectsType = TRT_WorkRect; - - struct Funcs - { - static ImRect GetTableRect(ImGuiTable* table, int rect_type, int n) - { - ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); // Always using last submitted instance - if (rect_type == TRT_OuterRect) { return table->OuterRect; } - else if (rect_type == TRT_InnerRect) { return table->InnerRect; } - else if (rect_type == TRT_WorkRect) { return table->WorkRect; } - else if (rect_type == TRT_HostClipRect) { return table->HostClipRect; } - else if (rect_type == TRT_InnerClipRect) { return table->InnerClipRect; } - else if (rect_type == TRT_BackgroundClipRect) { return table->BgClipRect; } - else if (rect_type == TRT_ColumnsRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MaxX, table->InnerClipRect.Min.y + table_instance->LastOuterHeight); } - else if (rect_type == TRT_ColumnsWorkRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->WorkRect.Min.y, c->WorkMaxX, table->WorkRect.Max.y); } - else if (rect_type == TRT_ColumnsClipRect) { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; } - else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } // Note: y1/y2 not always accurate - else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } - else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } - else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); } - IM_ASSERT(0); - return ImRect(); - } - - static ImRect GetWindowRect(ImGuiWindow* window, int rect_type) - { - if (rect_type == WRT_OuterRect) { return window->Rect(); } - else if (rect_type == WRT_OuterRectClipped) { return window->OuterRectClipped; } - else if (rect_type == WRT_InnerRect) { return window->InnerRect; } - else if (rect_type == WRT_InnerClipRect) { return window->InnerClipRect; } - else if (rect_type == WRT_WorkRect) { return window->WorkRect; } - else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); } - else if (rect_type == WRT_ContentIdeal) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSizeIdeal); } - else if (rect_type == WRT_ContentRegionRect) { return window->ContentRegionRect; } - IM_ASSERT(0); - return ImRect(); - } - }; - - // Tools - if (TreeNode("Tools")) - { - bool show_encoding_viewer = TreeNode("UTF-8 Encoding viewer"); - SameLine(); - MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct."); - if (show_encoding_viewer) - { - static char buf[100] = ""; - SetNextItemWidth(-FLT_MIN); - InputText("##Text", buf, IM_ARRAYSIZE(buf)); - if (buf[0] != 0) - DebugTextEncoding(buf); - TreePop(); - } - - // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted. - if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive) - DebugStartItemPicker(); - SameLine(); - MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash."); - - // Stack Tool is your best friend! - Checkbox("Show Debug Log", &cfg->ShowDebugLog); - SameLine(); - MetricsHelpMarker("You can also call ImGui::ShowDebugLogWindow() from your code."); - - // Stack Tool is your best friend! - Checkbox("Show Stack Tool", &cfg->ShowStackTool); - SameLine(); - MetricsHelpMarker("You can also call ImGui::ShowStackToolWindow() from your code."); - - Checkbox("Show windows begin order", &cfg->ShowWindowsBeginOrder); - Checkbox("Show windows rectangles", &cfg->ShowWindowsRects); - SameLine(); - SetNextItemWidth(GetFontSize() * 12); - cfg->ShowWindowsRects |= Combo("##show_windows_rect_type", &cfg->ShowWindowsRectsType, wrt_rects_names, WRT_Count, WRT_Count); - if (cfg->ShowWindowsRects && g.NavWindow != NULL) - { - BulletText("'%s':", g.NavWindow->Name); - Indent(); - for (int rect_n = 0; rect_n < WRT_Count; rect_n++) - { - ImRect r = Funcs::GetWindowRect(g.NavWindow, rect_n); - Text("(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), wrt_rects_names[rect_n]); - } - Unindent(); - } - - Checkbox("Show tables rectangles", &cfg->ShowTablesRects); - SameLine(); - SetNextItemWidth(GetFontSize() * 12); - cfg->ShowTablesRects |= Combo("##show_table_rects_type", &cfg->ShowTablesRectsType, trt_rects_names, TRT_Count, TRT_Count); - if (cfg->ShowTablesRects && g.NavWindow != NULL) - { - for (int table_n = 0; table_n < g.Tables.GetMapSize(); table_n++) - { - ImGuiTable* table = g.Tables.TryGetMapData(table_n); - if (table == NULL || table->LastFrameActive < g.FrameCount - 1 || (table->OuterWindow != g.NavWindow && table->InnerWindow != g.NavWindow)) - continue; - - BulletText("Table 0x%08X (%d columns, in '%s')", table->ID, table->ColumnsCount, table->OuterWindow->Name); - if (IsItemHovered()) - GetForegroundDrawList()->AddRect(table->OuterRect.Min - ImVec2(1, 1), table->OuterRect.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); - Indent(); - char buf[128]; - for (int rect_n = 0; rect_n < TRT_Count; rect_n++) - { - if (rect_n >= TRT_ColumnsRect) - { - if (rect_n != TRT_ColumnsRect && rect_n != TRT_ColumnsClipRect) - continue; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImRect r = Funcs::GetTableRect(table, rect_n, column_n); - ImFormatString(buf, IM_ARRAYSIZE(buf), "(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) Col %d %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), column_n, trt_rects_names[rect_n]); - Selectable(buf); - if (IsItemHovered()) - GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); - } - } - else - { - ImRect r = Funcs::GetTableRect(table, rect_n, -1); - ImFormatString(buf, IM_ARRAYSIZE(buf), "(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), trt_rects_names[rect_n]); - Selectable(buf); - if (IsItemHovered()) - GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); - } - } - Unindent(); - } - } - - TreePop(); - } - - // Windows - if (TreeNode("Windows", "Windows (%d)", g.Windows.Size)) - { - //SetNextItemOpen(true, ImGuiCond_Once); - DebugNodeWindowsList(&g.Windows, "By display order"); - DebugNodeWindowsList(&g.WindowsFocusOrder, "By focus order (root windows)"); - if (TreeNode("By submission order (begin stack)")) - { - // Here we display windows in their submitted order/hierarchy, however note that the Begin stack doesn't constitute a Parent<>Child relationship! - ImVector& temp_buffer = g.WindowsTempSortBuffer; - temp_buffer.resize(0); - for (int i = 0; i < g.Windows.Size; i++) - if (g.Windows[i]->LastFrameActive + 1 >= g.FrameCount) - temp_buffer.push_back(g.Windows[i]); - struct Func { static int IMGUI_CDECL WindowComparerByBeginOrder(const void* lhs, const void* rhs) { return ((int)(*(const ImGuiWindow* const *)lhs)->BeginOrderWithinContext - (*(const ImGuiWindow* const*)rhs)->BeginOrderWithinContext); } }; - ImQsort(temp_buffer.Data, (size_t)temp_buffer.Size, sizeof(ImGuiWindow*), Func::WindowComparerByBeginOrder); - DebugNodeWindowsListByBeginStackParent(temp_buffer.Data, temp_buffer.Size, NULL); - TreePop(); - } - - TreePop(); - } - - // DrawLists - int drawlist_count = 0; - for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) - drawlist_count += g.Viewports[viewport_i]->DrawDataBuilder.GetDrawListCount(); - if (TreeNode("DrawLists", "DrawLists (%d)", drawlist_count)) - { - Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh); - Checkbox("Show ImDrawCmd bounding boxes when hovering", &cfg->ShowDrawCmdBoundingBoxes); - for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) - { - ImGuiViewportP* viewport = g.Viewports[viewport_i]; - for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) - for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) - DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); - } - TreePop(); - } - - // Viewports - if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size)) - { - Indent(GetTreeNodeToLabelSpacing()); - RenderViewportsThumbnails(); - Unindent(GetTreeNodeToLabelSpacing()); - for (int i = 0; i < g.Viewports.Size; i++) - DebugNodeViewport(g.Viewports[i]); - TreePop(); - } - - // Details for Popups - if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size)) - { - for (int i = 0; i < g.OpenPopupStack.Size; i++) - { - ImGuiWindow* window = g.OpenPopupStack[i].Window; - BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenPopupStack[i].PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : ""); - } - TreePop(); - } - - // Details for TabBars - if (TreeNode("TabBars", "Tab Bars (%d)", g.TabBars.GetAliveCount())) - { - for (int n = 0; n < g.TabBars.GetMapSize(); n++) - if (ImGuiTabBar* tab_bar = g.TabBars.TryGetMapData(n)) - { - PushID(tab_bar); - DebugNodeTabBar(tab_bar, "TabBar"); - PopID(); - } - TreePop(); - } - - // Details for Tables - if (TreeNode("Tables", "Tables (%d)", g.Tables.GetAliveCount())) - { - for (int n = 0; n < g.Tables.GetMapSize(); n++) - if (ImGuiTable* table = g.Tables.TryGetMapData(n)) - DebugNodeTable(table); - TreePop(); - } - - // Details for Fonts - ImFontAtlas* atlas = g.IO.Fonts; - if (TreeNode("Fonts", "Fonts (%d)", atlas->Fonts.Size)) - { - ShowFontAtlas(atlas); - TreePop(); - } - - // Details for InputText - if (TreeNode("InputText")) - { - DebugNodeInputTextState(&g.InputTextState); - TreePop(); - } - - // Details for Docking -#ifdef IMGUI_HAS_DOCK - if (TreeNode("Docking")) - { - TreePop(); - } -#endif // #ifdef IMGUI_HAS_DOCK - - // Settings - if (TreeNode("Settings")) - { - if (SmallButton("Clear")) - ClearIniSettings(); - SameLine(); - if (SmallButton("Save to memory")) - SaveIniSettingsToMemory(); - SameLine(); - if (SmallButton("Save to disk")) - SaveIniSettingsToDisk(g.IO.IniFilename); - SameLine(); - if (g.IO.IniFilename) - Text("\"%s\"", g.IO.IniFilename); - else - TextUnformatted(""); - Text("SettingsDirtyTimer %.2f", g.SettingsDirtyTimer); - if (TreeNode("SettingsHandlers", "Settings handlers: (%d)", g.SettingsHandlers.Size)) - { - for (int n = 0; n < g.SettingsHandlers.Size; n++) - BulletText("%s", g.SettingsHandlers[n].TypeName); - TreePop(); - } - if (TreeNode("SettingsWindows", "Settings packed data: Windows: %d bytes", g.SettingsWindows.size())) - { - for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) - DebugNodeWindowSettings(settings); - TreePop(); - } - - if (TreeNode("SettingsTables", "Settings packed data: Tables: %d bytes", g.SettingsTables.size())) - { - for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) - DebugNodeTableSettings(settings); - TreePop(); - } - -#ifdef IMGUI_HAS_DOCK -#endif // #ifdef IMGUI_HAS_DOCK - - if (TreeNode("SettingsIniData", "Settings unpacked data (.ini): %d bytes", g.SettingsIniData.size())) - { - InputTextMultiline("##Ini", (char*)(void*)g.SettingsIniData.c_str(), g.SettingsIniData.Buf.Size, ImVec2(-FLT_MIN, GetTextLineHeight() * 20), ImGuiInputTextFlags_ReadOnly); - TreePop(); - } - TreePop(); - } - - // Misc Details - if (TreeNode("Internal state")) - { - Text("WINDOWING"); - Indent(); - Text("HoveredWindow: '%s'", g.HoveredWindow ? g.HoveredWindow->Name : "NULL"); - Text("HoveredWindow->Root: '%s'", g.HoveredWindow ? g.HoveredWindow->RootWindow->Name : "NULL"); - Text("HoveredWindowUnderMovingWindow: '%s'", g.HoveredWindowUnderMovingWindow ? g.HoveredWindowUnderMovingWindow->Name : "NULL"); - Text("MovingWindow: '%s'", g.MovingWindow ? g.MovingWindow->Name : "NULL"); - Unindent(); - - Text("ITEMS"); - Indent(); - Text("ActiveId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d, Source: %s", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer, g.ActiveIdAllowOverlap, GetInputSourceName(g.ActiveIdSource)); - Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); - - int active_id_using_key_input_count = 0; - for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++) - active_id_using_key_input_count += g.ActiveIdUsingKeyInputMask[n] ? 1 : 0; - Text("ActiveIdUsing: NavDirMask: %X, KeyInputMask: %d key(s)", g.ActiveIdUsingNavDirMask, active_id_using_key_input_count); - Text("HoveredId: 0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Not displaying g.HoveredId as it is update mid-frame - Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize); - Unindent(); - - Text("NAV,FOCUS"); - Indent(); - Text("NavWindow: '%s'", g.NavWindow ? g.NavWindow->Name : "NULL"); - Text("NavId: 0x%08X, NavLayer: %d", g.NavId, g.NavLayer); - Text("NavInputSource: %s", GetInputSourceName(g.NavInputSource)); - Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible); - Text("NavActivateId/DownId/PressedId/InputId: %08X/%08X/%08X/%08X", g.NavActivateId, g.NavActivateDownId, g.NavActivatePressedId, g.NavActivateInputId); - Text("NavActivateFlags: %04X", g.NavActivateFlags); - Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover); - Text("NavFocusScopeId = 0x%08X", g.NavFocusScopeId); - Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL"); - Unindent(); - - TreePop(); - } - - // Overlay: Display windows Rectangles and Begin Order - if (cfg->ShowWindowsRects || cfg->ShowWindowsBeginOrder) - { - for (int n = 0; n < g.Windows.Size; n++) - { - ImGuiWindow* window = g.Windows[n]; - if (!window->WasActive) - continue; - ImDrawList* draw_list = GetForegroundDrawList(window); - if (cfg->ShowWindowsRects) - { - ImRect r = Funcs::GetWindowRect(window, cfg->ShowWindowsRectsType); - draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); - } - if (cfg->ShowWindowsBeginOrder && !(window->Flags & ImGuiWindowFlags_ChildWindow)) - { - char buf[32]; - ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext); - float font_size = GetFontSize(); - draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255)); - draw_list->AddText(window->Pos, IM_COL32(255, 255, 255, 255), buf); - } - } - } - - // Overlay: Display Tables Rectangles - if (cfg->ShowTablesRects) - { - for (int table_n = 0; table_n < g.Tables.GetMapSize(); table_n++) - { - ImGuiTable* table = g.Tables.TryGetMapData(table_n); - if (table == NULL || table->LastFrameActive < g.FrameCount - 1) - continue; - ImDrawList* draw_list = GetForegroundDrawList(table->OuterWindow); - if (cfg->ShowTablesRectsType >= TRT_ColumnsRect) - { - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, column_n); - ImU32 col = (table->HoveredColumnBody == column_n) ? IM_COL32(255, 255, 128, 255) : IM_COL32(255, 0, 128, 255); - float thickness = (table->HoveredColumnBody == column_n) ? 3.0f : 1.0f; - draw_list->AddRect(r.Min, r.Max, col, 0.0f, 0, thickness); - } - } - else - { - ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, -1); - draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); - } - } - } - -#ifdef IMGUI_HAS_DOCK - // Overlay: Display Docking info - if (show_docking_nodes && g.IO.KeyCtrl) - { - } -#endif // #ifdef IMGUI_HAS_DOCK - - End(); -} - -// [DEBUG] Display contents of Columns -void ImGui::DebugNodeColumns(ImGuiOldColumns* columns) -{ - if (!TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags)) - return; - BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->OffMaxX - columns->OffMinX, columns->OffMinX, columns->OffMaxX); - for (int column_n = 0; column_n < columns->Columns.Size; column_n++) - BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, GetColumnOffsetFromNorm(columns, columns->Columns[column_n].OffsetNorm)); - TreePop(); -} - -// [DEBUG] Display contents of ImDrawList -void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label) -{ - ImGuiContext& g = *GImGui; - ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; - int cmd_count = draw_list->CmdBuffer.Size; - if (cmd_count > 0 && draw_list->CmdBuffer.back().ElemCount == 0 && draw_list->CmdBuffer.back().UserCallback == NULL) - cmd_count--; - bool node_open = TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, cmd_count); - if (draw_list == GetWindowDrawList()) - { - SameLine(); - TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered) - if (node_open) - TreePop(); - return; - } - - ImDrawList* fg_draw_list = GetForegroundDrawList(window); // Render additional visuals into the top-most draw list - if (window && IsItemHovered() && fg_draw_list) - fg_draw_list->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); - if (!node_open) - return; - - if (window && !window->WasActive) - TextDisabled("Warning: owning Window is inactive. This DrawList is not being rendered!"); - - for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.Data; pcmd < draw_list->CmdBuffer.Data + cmd_count; pcmd++) - { - if (pcmd->UserCallback) - { - BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData); - continue; - } - - char buf[300]; - ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", - pcmd->ElemCount / 3, (void*)(intptr_t)pcmd->TextureId, - pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); - bool pcmd_node_open = TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf); - if (IsItemHovered() && (cfg->ShowDrawCmdMesh || cfg->ShowDrawCmdBoundingBoxes) && fg_draw_list) - DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, cfg->ShowDrawCmdMesh, cfg->ShowDrawCmdBoundingBoxes); - if (!pcmd_node_open) - continue; - - // Calculate approximate coverage area (touched pixel count) - // This will be in pixels squared as long there's no post-scaling happening to the renderer output. - const ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; - const ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data + pcmd->VtxOffset; - float total_area = 0.0f; - for (unsigned int idx_n = pcmd->IdxOffset; idx_n < pcmd->IdxOffset + pcmd->ElemCount; ) - { - ImVec2 triangle[3]; - for (int n = 0; n < 3; n++, idx_n++) - triangle[n] = vtx_buffer[idx_buffer ? idx_buffer[idx_n] : idx_n].pos; - total_area += ImTriangleArea(triangle[0], triangle[1], triangle[2]); - } - - // Display vertex information summary. Hover to get all triangles drawn in wire-frame - ImFormatString(buf, IM_ARRAYSIZE(buf), "Mesh: ElemCount: %d, VtxOffset: +%d, IdxOffset: +%d, Area: ~%0.f px", pcmd->ElemCount, pcmd->VtxOffset, pcmd->IdxOffset, total_area); - Selectable(buf); - if (IsItemHovered() && fg_draw_list) - DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, true, false); - - // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted. - ImGuiListClipper clipper; - clipper.Begin(pcmd->ElemCount / 3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. - while (clipper.Step()) - for (int prim = clipper.DisplayStart, idx_i = pcmd->IdxOffset + clipper.DisplayStart * 3; prim < clipper.DisplayEnd; prim++) - { - char* buf_p = buf, * buf_end = buf + IM_ARRAYSIZE(buf); - ImVec2 triangle[3]; - for (int n = 0; n < 3; n++, idx_i++) - { - const ImDrawVert& v = vtx_buffer[idx_buffer ? idx_buffer[idx_i] : idx_i]; - triangle[n] = v.pos; - buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", - (n == 0) ? "Vert:" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); - } - - Selectable(buf, false); - if (fg_draw_list && IsItemHovered()) - { - ImDrawListFlags backup_flags = fg_draw_list->Flags; - fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles. - fg_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), ImDrawFlags_Closed, 1.0f); - fg_draw_list->Flags = backup_flags; - } - } - TreePop(); - } - TreePop(); -} - -// [DEBUG] Display mesh/aabb of a ImDrawCmd -void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb) -{ - IM_ASSERT(show_mesh || show_aabb); - - // Draw wire-frame version of all triangles - ImRect clip_rect = draw_cmd->ClipRect; - ImRect vtxs_rect(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); - ImDrawListFlags backup_flags = out_draw_list->Flags; - out_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles. - for (unsigned int idx_n = draw_cmd->IdxOffset, idx_end = draw_cmd->IdxOffset + draw_cmd->ElemCount; idx_n < idx_end; ) - { - ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; // We don't hold on those pointers past iterations as ->AddPolyline() may invalidate them if out_draw_list==draw_list - ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data + draw_cmd->VtxOffset; - - ImVec2 triangle[3]; - for (int n = 0; n < 3; n++, idx_n++) - vtxs_rect.Add((triangle[n] = vtx_buffer[idx_buffer ? idx_buffer[idx_n] : idx_n].pos)); - if (show_mesh) - out_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), ImDrawFlags_Closed, 1.0f); // In yellow: mesh triangles - } - // Draw bounding boxes - if (show_aabb) - { - out_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU - out_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles - } - out_draw_list->Flags = backup_flags; -} - -// [DEBUG] Display details for a single font, called by ShowStyleEditor(). -void ImGui::DebugNodeFont(ImFont* font) -{ - bool opened = TreeNode(font, "Font: \"%s\"\n%.2f px, %d glyphs, %d file(s)", - font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount); - SameLine(); - if (SmallButton("Set as default")) - GetIO().FontDefault = font; - if (!opened) - return; - - // Display preview text - PushFont(font); - Text("The quick brown fox jumps over the lazy dog"); - PopFont(); - - // Display details - SetNextItemWidth(GetFontSize() * 8); - DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); - SameLine(); MetricsHelpMarker( - "Note than the default embedded font is NOT meant to be scaled.\n\n" - "Font are currently rendered into bitmaps at a given size at the time of building the atlas. " - "You may oversample them to get some flexibility with scaling. " - "You can also render at multiple sizes and select which one to use at runtime.\n\n" - "(Glimmer of hope: the atlas system will be rewritten in the future to make scaling more flexible.)"); - Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent); - char c_str[5]; - Text("Fallback character: '%s' (U+%04X)", ImTextCharToUtf8(c_str, font->FallbackChar), font->FallbackChar); - Text("Ellipsis character: '%s' (U+%04X)", ImTextCharToUtf8(c_str, font->EllipsisChar), font->EllipsisChar); - const int surface_sqrt = (int)ImSqrt((float)font->MetricsTotalSurface); - Text("Texture Area: about %d px ~%dx%d px", font->MetricsTotalSurface, surface_sqrt, surface_sqrt); - for (int config_i = 0; config_i < font->ConfigDataCount; config_i++) - if (font->ConfigData) - if (const ImFontConfig* cfg = &font->ConfigData[config_i]) - BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d, Offset: (%.1f,%.1f)", - config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH, cfg->GlyphOffset.x, cfg->GlyphOffset.y); - - // Display all glyphs of the fonts in separate pages of 256 characters - if (TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size)) - { - ImDrawList* draw_list = GetWindowDrawList(); - const ImU32 glyph_col = GetColorU32(ImGuiCol_Text); - const float cell_size = font->FontSize * 1; - const float cell_spacing = GetStyle().ItemSpacing.y; - for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256) - { - // Skip ahead if a large bunch of glyphs are not present in the font (test in chunks of 4k) - // This is only a small optimization to reduce the number of iterations when IM_UNICODE_MAX_CODEPOINT - // is large // (if ImWchar==ImWchar32 we will do at least about 272 queries here) - if (!(base & 4095) && font->IsGlyphRangeUnused(base, base + 4095)) - { - base += 4096 - 256; - continue; - } - - int count = 0; - for (unsigned int n = 0; n < 256; n++) - if (font->FindGlyphNoFallback((ImWchar)(base + n))) - count++; - if (count <= 0) - continue; - if (!TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph")) - continue; - - // Draw a 16x16 grid of glyphs - ImVec2 base_pos = GetCursorScreenPos(); - for (unsigned int n = 0; n < 256; n++) - { - // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions - // available here and thus cannot easily generate a zero-terminated UTF-8 encoded string. - ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing)); - ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size); - const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n)); - draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50)); - if (!glyph) - continue; - font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n)); - if (IsMouseHoveringRect(cell_p1, cell_p2)) - { - BeginTooltip(); - DebugNodeFontGlyph(font, glyph); - EndTooltip(); - } - } - Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16)); - TreePop(); - } - TreePop(); - } - TreePop(); -} - -void ImGui::DebugNodeFontGlyph(ImFont*, const ImFontGlyph* glyph) -{ - Text("Codepoint: U+%04X", glyph->Codepoint); - Separator(); - Text("Visible: %d", glyph->Visible); - Text("AdvanceX: %.1f", glyph->AdvanceX); - Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1); - Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1); -} - -// [DEBUG] Display contents of ImGuiStorage -void ImGui::DebugNodeStorage(ImGuiStorage* storage, const char* label) -{ - if (!TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes())) - return; - for (int n = 0; n < storage->Data.Size; n++) - { - const ImGuiStorage::ImGuiStoragePair& p = storage->Data[n]; - BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer. - } - TreePop(); -} - -// [DEBUG] Display contents of ImGuiTabBar -void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label) -{ - // Standalone tab bars (not associated to docking/windows functionality) currently hold no discernible strings. - char buf[256]; - char* p = buf; - const char* buf_end = buf + IM_ARRAYSIZE(buf); - const bool is_active = (tab_bar->PrevFrameVisible >= GetFrameCount() - 2); - p += ImFormatString(p, buf_end - p, "%s 0x%08X (%d tabs)%s", label, tab_bar->ID, tab_bar->Tabs.Size, is_active ? "" : " *Inactive*"); - p += ImFormatString(p, buf_end - p, " { "); - for (int tab_n = 0; tab_n < ImMin(tab_bar->Tabs.Size, 3); tab_n++) - { - ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; - p += ImFormatString(p, buf_end - p, "%s'%s'", - tab_n > 0 ? ", " : "", (tab->NameOffset != -1) ? tab_bar->GetTabName(tab) : "???"); - } - p += ImFormatString(p, buf_end - p, (tab_bar->Tabs.Size > 3) ? " ... }" : " } "); - if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } - bool open = TreeNode(label, "%s", buf); - if (!is_active) { PopStyleColor(); } - if (is_active && IsItemHovered()) - { - ImDrawList* draw_list = GetForegroundDrawList(); - draw_list->AddRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max, IM_COL32(255, 255, 0, 255)); - draw_list->AddLine(ImVec2(tab_bar->ScrollingRectMinX, tab_bar->BarRect.Min.y), ImVec2(tab_bar->ScrollingRectMinX, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255)); - draw_list->AddLine(ImVec2(tab_bar->ScrollingRectMaxX, tab_bar->BarRect.Min.y), ImVec2(tab_bar->ScrollingRectMaxX, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255)); - } - if (open) - { - for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) - { - const ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; - PushID(tab); - if (SmallButton("<")) { TabBarQueueReorder(tab_bar, tab, -1); } SameLine(0, 2); - if (SmallButton(">")) { TabBarQueueReorder(tab_bar, tab, +1); } SameLine(); - Text("%02d%c Tab 0x%08X '%s' Offset: %.1f, Width: %.1f/%.1f", - tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, (tab->NameOffset != -1) ? tab_bar->GetTabName(tab) : "???", tab->Offset, tab->Width, tab->ContentWidth); - PopID(); - } - TreePop(); - } -} - -void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) -{ - SetNextItemOpen(true, ImGuiCond_Once); - if (TreeNode("viewport0", "Viewport #%d", 0)) - { - ImGuiWindowFlags flags = viewport->Flags; - BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f", - viewport->Pos.x, viewport->Pos.y, viewport->Size.x, viewport->Size.y, - viewport->WorkOffsetMin.x, viewport->WorkOffsetMin.y, viewport->WorkOffsetMax.x, viewport->WorkOffsetMax.y); - BulletText("Flags: 0x%04X =%s%s%s", viewport->Flags, - (flags & ImGuiViewportFlags_IsPlatformWindow) ? " IsPlatformWindow" : "", - (flags & ImGuiViewportFlags_IsPlatformMonitor) ? " IsPlatformMonitor" : "", - (flags & ImGuiViewportFlags_OwnedByApp) ? " OwnedByApp" : ""); - for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) - for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) - DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); - TreePop(); - } -} - -void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) -{ - if (window == NULL) - { - BulletText("%s: NULL", label); - return; - } - - ImGuiContext& g = *GImGui; - const bool is_active = window->WasActive; - ImGuiTreeNodeFlags tree_node_flags = (window == g.NavWindow) ? ImGuiTreeNodeFlags_Selected : ImGuiTreeNodeFlags_None; - if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } - const bool open = TreeNodeEx(label, tree_node_flags, "%s '%s'%s", label, window->Name, is_active ? "" : " *Inactive*"); - if (!is_active) { PopStyleColor(); } - if (IsItemHovered() && is_active) - GetForegroundDrawList(window)->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); - if (!open) - return; - - if (window->MemoryCompacted) - TextDisabled("Note: some memory buffers have been compacted/freed."); - - ImGuiWindowFlags flags = window->Flags; - DebugNodeDrawList(window, window->DrawList, "DrawList"); - BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y); - BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags, - (flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", - (flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "", - (flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : ""); - BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f) Scrollbar:%s%s", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y, window->ScrollbarX ? "X" : "", window->ScrollbarY ? "Y" : ""); - BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1); - BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems); - for (int layer = 0; layer < ImGuiNavLayer_COUNT; layer++) - { - ImRect r = window->NavRectRel[layer]; - if (r.Min.x >= r.Max.y && r.Min.y >= r.Max.y) - { - BulletText("NavLastIds[%d]: 0x%08X", layer, window->NavLastIds[layer]); - continue; - } - BulletText("NavLastIds[%d]: 0x%08X at +(%.1f,%.1f)(%.1f,%.1f)", layer, window->NavLastIds[layer], r.Min.x, r.Min.y, r.Max.x, r.Max.y); - if (IsItemHovered()) - GetForegroundDrawList(window)->AddRect(r.Min + window->Pos, r.Max + window->Pos, IM_COL32(255, 255, 0, 255)); - } - BulletText("NavLayersActiveMask: %X, NavLastChildNavWindow: %s", window->DC.NavLayersActiveMask, window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL"); - if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); } - if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); } - if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); } - if (window->ColumnsStorage.Size > 0 && TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size)) - { - for (int n = 0; n < window->ColumnsStorage.Size; n++) - DebugNodeColumns(&window->ColumnsStorage[n]); - TreePop(); - } - DebugNodeStorage(&window->StateStorage, "Storage"); - TreePop(); -} - -void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings* settings) -{ - Text("0x%08X \"%s\" Pos (%d,%d) Size (%d,%d) Collapsed=%d", - settings->ID, settings->GetName(), settings->Pos.x, settings->Pos.y, settings->Size.x, settings->Size.y, settings->Collapsed); -} - -void ImGui::DebugNodeWindowsList(ImVector* windows, const char* label) -{ - if (!TreeNode(label, "%s (%d)", label, windows->Size)) - return; - for (int i = windows->Size - 1; i >= 0; i--) // Iterate front to back - { - PushID((*windows)[i]); - DebugNodeWindow((*windows)[i], "Window"); - PopID(); - } - TreePop(); -} - -// FIXME-OPT: This is technically suboptimal, but it is simpler this way. -void ImGui::DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack) -{ - for (int i = 0; i < windows_size; i++) - { - ImGuiWindow* window = windows[i]; - if (window->ParentWindowInBeginStack != parent_in_begin_stack) - continue; - char buf[20]; - ImFormatString(buf, IM_ARRAYSIZE(buf), "[%04d] Window", window->BeginOrderWithinContext); - //BulletText("[%04d] Window '%s'", window->BeginOrderWithinContext, window->Name); - DebugNodeWindow(window, buf); - Indent(); - DebugNodeWindowsListByBeginStackParent(windows + i + 1, windows_size - i - 1, window); - Unindent(); - } -} - -//----------------------------------------------------------------------------- -// [SECTION] DEBUG LOG -//----------------------------------------------------------------------------- - -void ImGui::DebugLog(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - DebugLogV(fmt, args); - va_end(args); -} - -void ImGui::DebugLogV(const char* fmt, va_list args) -{ - ImGuiContext& g = *GImGui; - const int old_size = g.DebugLogBuf.size(); - g.DebugLogBuf.appendf("[%05d] ", g.FrameCount); - g.DebugLogBuf.appendfv(fmt, args); - if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTTY) - IMGUI_DEBUG_PRINTF("%s", g.DebugLogBuf.begin() + old_size); -} - -void ImGui::ShowDebugLogWindow(bool* p_open) -{ - ImGuiContext& g = *GImGui; - if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)) - SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 12.0f), ImGuiCond_FirstUseEver); - if (!Begin("Dear ImGui Debug Log", p_open) || GetCurrentWindow()->BeginCount > 1) - { - End(); - return; - } - - AlignTextToFramePadding(); - Text("Log events:"); - SameLine(); CheckboxFlags("All", &g.DebugLogFlags, ImGuiDebugLogFlags_EventMask_); - SameLine(); CheckboxFlags("ActiveId", &g.DebugLogFlags, ImGuiDebugLogFlags_EventActiveId); - SameLine(); CheckboxFlags("Focus", &g.DebugLogFlags, ImGuiDebugLogFlags_EventFocus); - SameLine(); CheckboxFlags("Popup", &g.DebugLogFlags, ImGuiDebugLogFlags_EventPopup); - SameLine(); CheckboxFlags("Nav", &g.DebugLogFlags, ImGuiDebugLogFlags_EventNav); - - if (SmallButton("Clear")) - g.DebugLogBuf.clear(); - SameLine(); - if (SmallButton("Copy")) - SetClipboardText(g.DebugLogBuf.c_str()); - BeginChild("##log", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar); - TextUnformatted(g.DebugLogBuf.begin(), g.DebugLogBuf.end()); // FIXME-OPT: Could use a line index, but TextUnformatted() has a semi-decent fast path for large text. - if (GetScrollY() >= GetScrollMaxY()) - SetScrollHereY(1.0f); - EndChild(); - - End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) -//----------------------------------------------------------------------------- - -// [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack. -void ImGui::UpdateDebugToolItemPicker() -{ - ImGuiContext& g = *GImGui; - g.DebugItemPickerBreakId = 0; - if (!g.DebugItemPickerActive) - return; - - const ImGuiID hovered_id = g.HoveredIdPreviousFrame; - SetMouseCursor(ImGuiMouseCursor_Hand); - if (IsKeyPressed(ImGuiKey_Escape)) - g.DebugItemPickerActive = false; - const bool change_mapping = g.IO.KeyMods == (ImGuiModFlags_Ctrl | ImGuiModFlags_Shift); - if (!change_mapping && IsMouseClicked(g.DebugItemPickerMouseButton) && hovered_id) - { - g.DebugItemPickerBreakId = hovered_id; - g.DebugItemPickerActive = false; - } - for (int mouse_button = 0; mouse_button < 3; mouse_button++) - if (change_mapping && IsMouseClicked(mouse_button)) - g.DebugItemPickerMouseButton = (ImU8)mouse_button; - SetNextWindowBgAlpha(0.70f); - BeginTooltip(); - Text("HoveredId: 0x%08X", hovered_id); - Text("Press ESC to abort picking."); - const char* mouse_button_names[] = { "Left", "Right", "Middle" }; - if (change_mapping) - Text("Remap w/ Ctrl+Shift: click anywhere to select new mouse button."); - else - TextColored(GetStyleColorVec4(hovered_id ? ImGuiCol_Text : ImGuiCol_TextDisabled), "Click %s Button to break in debugger! (remap w/ Ctrl+Shift)", mouse_button_names[g.DebugItemPickerMouseButton]); - EndTooltip(); -} - -// [DEBUG] Stack Tool: update queries. Called by NewFrame() -void ImGui::UpdateDebugToolStackQueries() -{ - ImGuiContext& g = *GImGui; - ImGuiStackTool* tool = &g.DebugStackTool; - - // Clear hook when stack tool is not visible - g.DebugHookIdInfo = 0; - if (g.FrameCount != tool->LastActiveFrame + 1) - return; - - // Update queries. The steps are: -1: query Stack, >= 0: query each stack item - // We can only perform 1 ID Info query every frame. This is designed so the GetID() tests are cheap and constant-time - const ImGuiID query_id = g.HoveredIdPreviousFrame ? g.HoveredIdPreviousFrame : g.ActiveId; - if (tool->QueryId != query_id) - { - tool->QueryId = query_id; - tool->StackLevel = -1; - tool->Results.resize(0); - } - if (query_id == 0) - return; - - // Advance to next stack level when we got our result, or after 2 frames (in case we never get a result) - int stack_level = tool->StackLevel; - if (stack_level >= 0 && stack_level < tool->Results.Size) - if (tool->Results[stack_level].QuerySuccess || tool->Results[stack_level].QueryFrameCount > 2) - tool->StackLevel++; - - // Update hook - stack_level = tool->StackLevel; - if (stack_level == -1) - g.DebugHookIdInfo = query_id; - if (stack_level >= 0 && stack_level < tool->Results.Size) - { - g.DebugHookIdInfo = tool->Results[stack_level].ID; - tool->Results[stack_level].QueryFrameCount++; - } -} - -// [DEBUG] Stack tool: hooks called by GetID() family functions -void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiStackTool* tool = &g.DebugStackTool; - - // Step 0: stack query - // This assume that the ID was computed with the current ID stack, which tends to be the case for our widget. - if (tool->StackLevel == -1) - { - tool->StackLevel++; - tool->Results.resize(window->IDStack.Size + 1, ImGuiStackLevelInfo()); - for (int n = 0; n < window->IDStack.Size + 1; n++) - tool->Results[n].ID = (n < window->IDStack.Size) ? window->IDStack[n] : id; - return; - } - - // Step 1+: query for individual level - IM_ASSERT(tool->StackLevel >= 0); - if (tool->StackLevel != window->IDStack.Size) - return; - ImGuiStackLevelInfo* info = &tool->Results[tool->StackLevel]; - IM_ASSERT(info->ID == id && info->QueryFrameCount > 0); - - switch (data_type) - { - case ImGuiDataType_S32: - ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%d", (int)(intptr_t)data_id); - break; - case ImGuiDataType_String: - ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%.*s", data_id_end ? (int)((const char*)data_id_end - (const char*)data_id) : (int)strlen((const char*)data_id), (const char*)data_id); - break; - case ImGuiDataType_Pointer: - ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "(void*)0x%p", data_id); - break; - case ImGuiDataType_ID: - if (info->Desc[0] != 0) // PushOverrideID() is often used to avoid hashing twice, which would lead to 2 calls to DebugHookIdInfo(). We prioritize the first one. - return; - ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "0x%08X [override]", id); - break; - default: - IM_ASSERT(0); - } - info->QuerySuccess = true; - info->DataType = data_type; -} - -static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size) -{ - ImGuiStackLevelInfo* info = &tool->Results[n]; - ImGuiWindow* window = (info->Desc[0] == 0 && n == 0) ? ImGui::FindWindowByID(info->ID) : NULL; - if (window) // Source: window name (because the root ID don't call GetID() and so doesn't get hooked) - return ImFormatString(buf, buf_size, format_for_ui ? "\"%s\" [window]" : "%s", window->Name); - if (info->QuerySuccess) // Source: GetID() hooks (prioritize over ItemInfo() because we frequently use patterns like: PushID(str), Button("") where they both have same id) - return ImFormatString(buf, buf_size, (format_for_ui && info->DataType == ImGuiDataType_String) ? "\"%s\"" : "%s", info->Desc); - if (tool->StackLevel < tool->Results.Size) // Only start using fallback below when all queries are done, so during queries we don't flickering ??? markers. - return (*buf = 0); -#ifdef IMGUI_ENABLE_TEST_ENGINE - if (const char* label = ImGuiTestEngine_FindItemDebugLabel(GImGui, info->ID)) // Source: ImGuiTestEngine's ItemInfo() - return ImFormatString(buf, buf_size, format_for_ui ? "??? \"%s\"" : "%s", label); -#endif - return ImFormatString(buf, buf_size, "???"); -} - -// Stack Tool: Display UI -void ImGui::ShowStackToolWindow(bool* p_open) -{ - ImGuiContext& g = *GImGui; - if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)) - SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 8.0f), ImGuiCond_FirstUseEver); - if (!Begin("Dear ImGui Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1) - { - End(); - return; - } - - // Display hovered/active status - ImGuiStackTool* tool = &g.DebugStackTool; - const ImGuiID hovered_id = g.HoveredIdPreviousFrame; - const ImGuiID active_id = g.ActiveId; -#ifdef IMGUI_ENABLE_TEST_ENGINE - Text("HoveredId: 0x%08X (\"%s\"), ActiveId: 0x%08X (\"%s\")", hovered_id, hovered_id ? ImGuiTestEngine_FindItemDebugLabel(&g, hovered_id) : "", active_id, active_id ? ImGuiTestEngine_FindItemDebugLabel(&g, active_id) : ""); -#else - Text("HoveredId: 0x%08X, ActiveId: 0x%08X", hovered_id, active_id); -#endif - SameLine(); - MetricsHelpMarker("Hover an item with the mouse to display elements of the ID Stack leading to the item's final ID.\nEach level of the stack correspond to a PushID() call.\nAll levels of the stack are hashed together to make the final ID of a widget (ID displayed at the bottom level of the stack).\nRead FAQ entry about the ID stack for details."); - - // CTRL+C to copy path - const float time_since_copy = (float)g.Time - tool->CopyToClipboardLastTime; - Checkbox("Ctrl+C: copy path to clipboard", &tool->CopyToClipboardOnCtrlC); - SameLine(); - TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*"); - if (tool->CopyToClipboardOnCtrlC && IsKeyDown(ImGuiKey_ModCtrl) && IsKeyPressed(ImGuiKey_C)) - { - tool->CopyToClipboardLastTime = (float)g.Time; - char* p = g.TempBuffer.Data; - char* p_end = p + g.TempBuffer.Size; - for (int stack_n = 0; stack_n < tool->Results.Size && p + 3 < p_end; stack_n++) - { - *p++ = '/'; - char level_desc[256]; - StackToolFormatLevelInfo(tool, stack_n, false, level_desc, IM_ARRAYSIZE(level_desc)); - for (int n = 0; level_desc[n] && p + 2 < p_end; n++) - { - if (level_desc[n] == '/') - *p++ = '\\'; - *p++ = level_desc[n]; - } - } - *p = '\0'; - SetClipboardText(g.TempBuffer.Data); - } - - // Display decorated stack - tool->LastActiveFrame = g.FrameCount; - if (tool->Results.Size > 0 && BeginTable("##table", 3, ImGuiTableFlags_Borders)) - { - const float id_width = CalcTextSize("0xDDDDDDDD").x; - TableSetupColumn("Seed", ImGuiTableColumnFlags_WidthFixed, id_width); - TableSetupColumn("PushID", ImGuiTableColumnFlags_WidthStretch); - TableSetupColumn("Result", ImGuiTableColumnFlags_WidthFixed, id_width); - TableHeadersRow(); - for (int n = 0; n < tool->Results.Size; n++) - { - ImGuiStackLevelInfo* info = &tool->Results[n]; - TableNextColumn(); - Text("0x%08X", (n > 0) ? tool->Results[n - 1].ID : 0); - TableNextColumn(); - StackToolFormatLevelInfo(tool, n, true, g.TempBuffer.Data, g.TempBuffer.Size); - TextUnformatted(g.TempBuffer.Data); - TableNextColumn(); - Text("0x%08X", info->ID); - if (n == tool->Results.Size - 1) - TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_Header)); - } - EndTable(); - } - End(); -} - -#else - -void ImGui::ShowMetricsWindow(bool*) {} -void ImGui::ShowFontAtlas(ImFontAtlas*) {} -void ImGui::DebugNodeColumns(ImGuiOldColumns*) {} -void ImGui::DebugNodeDrawList(ImGuiWindow*, const ImDrawList*, const char*) {} -void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {} -void ImGui::DebugNodeFont(ImFont*) {} -void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {} -void ImGui::DebugNodeTabBar(ImGuiTabBar*, const char*) {} -void ImGui::DebugNodeWindow(ImGuiWindow*, const char*) {} -void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings*) {} -void ImGui::DebugNodeWindowsList(ImVector*, const char*) {} -void ImGui::DebugNodeViewport(ImGuiViewportP*) {} - -void ImGui::DebugLog(const char*, ...) {} -void ImGui::DebugLogV(const char*, va_list) {} -void ImGui::ShowDebugLogWindow(bool*) {} -void ImGui::ShowStackToolWindow(bool*) {} -void ImGui::DebugHookIdInfo(ImGuiID, ImGuiDataType, const void*, const void*) {} -void ImGui::UpdateDebugToolItemPicker() {} -void ImGui::UpdateDebugToolStackQueries() {} - -#endif // #ifndef IMGUI_DISABLE_DEBUG_TOOLS - -//----------------------------------------------------------------------------- - -// Include imgui_user.inl at the end of imgui.cpp to access private data/functions that aren't exposed. -// Prefer just including imgui_internal.h from your code rather than using this define. If a declaration is missing from imgui_internal.h add it or request it on the github. -#ifdef IMGUI_INCLUDE_IMGUI_USER_INL -#include "imgui_user.inl" -#endif - -//----------------------------------------------------------------------------- - -#endif // #ifndef IMGUI_DISABLE diff --git a/dependencies/reboot/vendor/ImGui/imgui.h b/dependencies/reboot/vendor/ImGui/imgui.h deleted file mode 100644 index ce08569..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui.h +++ /dev/null @@ -1,3046 +0,0 @@ -// dear imgui, v1.89 WIP -// (headers) - -// Help: -// - Read FAQ at http://dearimgui.org/faq -// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. -// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. -// Read imgui.cpp for details, links and comments. - -// Resources: -// - FAQ http://dearimgui.org/faq -// - Homepage & latest https://github.com/ocornut/imgui -// - Releases & changelog https://github.com/ocornut/imgui/releases -// - Gallery https://github.com/ocornut/imgui/issues/5243 (please post your screenshots/video there!) -// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) -// - Glossary https://github.com/ocornut/imgui/wiki/Glossary -// - Issues & support https://github.com/ocornut/imgui/issues - -// Getting Started? -// - For first-time users having issues compiling/linking/running or issues loading fonts: -// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. - -/* - -Index of this file: -// [SECTION] Header mess -// [SECTION] Forward declarations and basic types -// [SECTION] Dear ImGui end-user API functions -// [SECTION] Flags & Enumerations -// [SECTION] Helpers: Memory allocations macros, ImVector<> -// [SECTION] ImGuiStyle -// [SECTION] ImGuiIO -// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) -// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor) -// [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData) -// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont) -// [SECTION] Viewports (ImGuiViewportFlags, ImGuiViewport) -// [SECTION] Platform Dependent Interfaces (ImGuiPlatformImeData) -// [SECTION] Obsolete functions and types - -*/ - -#pragma once - -// Configuration file with compile-time options (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system') -#ifdef IMGUI_USER_CONFIG -#include IMGUI_USER_CONFIG -#endif -#if !defined(IMGUI_DISABLE_INCLUDE_IMCONFIG_H) || defined(IMGUI_INCLUDE_IMCONFIG_H) -#include "imconfig.h" -#endif - -#ifndef IMGUI_DISABLE - -//----------------------------------------------------------------------------- -// [SECTION] Header mess -//----------------------------------------------------------------------------- - -// Includes -#include // FLT_MIN, FLT_MAX -#include // va_list, va_start, va_end -#include // ptrdiff_t, NULL -#include // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp - -// Version -// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) -#define IMGUI_VERSION "1.89 WIP" -#define IMGUI_VERSION_NUM 18805 -#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) -#define IMGUI_HAS_TABLE - -// Define attributes of all API symbols declarations (e.g. for DLL under Windows) -// IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default backends files (imgui_impl_xxx.h) -// Using dear imgui via a shared library is not recommended, because we don't guarantee backward nor forward ABI compatibility (also function call overhead, as dear imgui is a call-heavy API) -#ifndef IMGUI_API -#define IMGUI_API -#endif -#ifndef IMGUI_IMPL_API -#define IMGUI_IMPL_API IMGUI_API -#endif - -// Helper Macros -#ifndef IM_ASSERT -#include -#define IM_ASSERT(_EXPR) assert(_EXPR) // You can override the default assert handler by editing imconfig.h -#endif -#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*(_ARR)))) // Size of a static C-style array. Don't use on pointers! -#define IM_UNUSED(_VAR) ((void)(_VAR)) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds. -#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11 - -// Helper Macros - IM_FMTARGS, IM_FMTLIST: Apply printf-style warnings to our formatting functions. -#if !defined(IMGUI_USE_STB_SPRINTF) && defined(__MINGW32__) && !defined(__clang__) -#define IM_FMTARGS(FMT) __attribute__((format(gnu_printf, FMT, FMT+1))) -#define IM_FMTLIST(FMT) __attribute__((format(gnu_printf, FMT, 0))) -#elif !defined(IMGUI_USE_STB_SPRINTF) && (defined(__clang__) || defined(__GNUC__)) -#define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) -#define IM_FMTLIST(FMT) __attribute__((format(printf, FMT, 0))) -#else -#define IM_FMTARGS(FMT) -#define IM_FMTLIST(FMT) -#endif - -// Disable some of MSVC most aggressive Debug runtime checks in function header/footer (used in some simple/low-level functions) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(__INTEL_COMPILER) && !defined(IMGUI_DEBUG_PARANOID) -#define IM_MSVC_RUNTIME_CHECKS_OFF __pragma(runtime_checks("",off)) __pragma(check_stack(off)) __pragma(strict_gs_check(push,off)) -#define IM_MSVC_RUNTIME_CHECKS_RESTORE __pragma(runtime_checks("",restore)) __pragma(check_stack()) __pragma(strict_gs_check(pop)) -#else -#define IM_MSVC_RUNTIME_CHECKS_OFF -#define IM_MSVC_RUNTIME_CHECKS_RESTORE -#endif - -// Warnings -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). -#endif -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wold-style-cast" -#if __has_warning("-Wzero-as-null-pointer-constant") -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" -#endif -#elif defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind -#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#endif - -//----------------------------------------------------------------------------- -// [SECTION] Forward declarations and basic types -//----------------------------------------------------------------------------- - -// Forward declarations -struct ImDrawChannel; // Temporary storage to output draw commands out of order, used by ImDrawListSplitter and ImDrawList::ChannelsSplit() -struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call, unless it is a callback) -struct ImDrawData; // All draw command lists required to render the frame + pos/size coordinates to use for the projection matrix. -struct ImDrawList; // A single draw command list (generally one per window, conceptually you may see this as a dynamic "mesh" builder) -struct ImDrawListSharedData; // Data shared among multiple draw lists (typically owned by parent ImGui context, but you may create one yourself) -struct ImDrawListSplitter; // Helper to split a draw list into different layers which can be drawn into out of order, then flattened back. -struct ImDrawVert; // A single vertex (pos + uv + col = 20 bytes by default. Override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT) -struct ImFont; // Runtime data for a single font within a parent ImFontAtlas -struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader -struct ImFontBuilderIO; // Opaque interface to a font builder (stb_truetype or FreeType). -struct ImFontConfig; // Configuration data when adding a font or merging fonts -struct ImFontGlyph; // A single font glyph (code point + coordinates within in ImFontAtlas + offset) -struct ImFontGlyphRangesBuilder; // Helper to build glyph ranges from text/string data -struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 (*OBSOLETE* please avoid using) -struct ImGuiContext; // Dear ImGui context (opaque structure, unless including imgui_internal.h) -struct ImGuiIO; // Main configuration and I/O between your application and ImGui -struct ImGuiInputTextCallbackData; // Shared state of InputText() when using custom ImGuiInputTextCallback (rare/advanced use) -struct ImGuiKeyData; // Storage for ImGuiIO and IsKeyDown(), IsKeyPressed() etc functions. -struct ImGuiListClipper; // Helper to manually clip large list of items -struct ImGuiOnceUponAFrame; // Helper for running a block of code not more than once a frame -struct ImGuiPayload; // User data payload for drag and drop operations -struct ImGuiPlatformImeData; // Platform IME data for io.SetPlatformImeDataFn() function. -struct ImGuiSizeCallbackData; // Callback data when using SetNextWindowSizeConstraints() (rare/advanced use) -struct ImGuiStorage; // Helper for key->value storage -struct ImGuiStyle; // Runtime data for styling/colors -struct ImGuiTableSortSpecs; // Sorting specifications for a table (often handling sort specs for a single column, occasionally more) -struct ImGuiTableColumnSortSpecs; // Sorting specification for one column of a table -struct ImGuiTextBuffer; // Helper to hold and append into a text buffer (~string builder) -struct ImGuiTextFilter; // Helper to parse and apply text filters (e.g. "aaaaa[,bbbbb][,ccccc]") -struct ImGuiViewport; // A Platform Window (always only one in 'master' branch), in the future may represent Platform Monitor - -// Enums/Flags (declared as int for compatibility with old C++, to allow using as flags without overhead, and to not pollute the top of this file) -// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! -// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. -typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling -typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for many Set*() functions -typedef int ImGuiDataType; // -> enum ImGuiDataType_ // Enum: A primary data type -typedef int ImGuiDir; // -> enum ImGuiDir_ // Enum: A cardinal direction -typedef int ImGuiKey; // -> enum ImGuiKey_ // Enum: A key identifier -typedef int ImGuiMouseButton; // -> enum ImGuiMouseButton_ // Enum: A mouse button identifier (0=left, 1=right, 2=middle) -typedef int ImGuiMouseCursor; // -> enum ImGuiMouseCursor_ // Enum: A mouse cursor identifier -typedef int ImGuiSortDirection; // -> enum ImGuiSortDirection_ // Enum: A sorting direction (ascending or descending) -typedef int ImGuiStyleVar; // -> enum ImGuiStyleVar_ // Enum: A variable identifier for styling -typedef int ImGuiTableBgTarget; // -> enum ImGuiTableBgTarget_ // Enum: A color target for TableSetBgColor() -typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions -typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance -typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build -typedef int ImGuiBackendFlags; // -> enum ImGuiBackendFlags_ // Flags: for io.BackendFlags -typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for InvisibleButton() -typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit4(), ColorPicker4() etc. -typedef int ImGuiConfigFlags; // -> enum ImGuiConfigFlags_ // Flags: for io.ConfigFlags -typedef int ImGuiComboFlags; // -> enum ImGuiComboFlags_ // Flags: for BeginCombo() -typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for BeginDragDropSource(), AcceptDragDropPayload() -typedef int ImGuiFocusedFlags; // -> enum ImGuiFocusedFlags_ // Flags: for IsWindowFocused() -typedef int ImGuiHoveredFlags; // -> enum ImGuiHoveredFlags_ // Flags: for IsItemHovered(), IsWindowHovered() etc. -typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText(), InputTextMultiline() -typedef int ImGuiModFlags; // -> enum ImGuiModFlags_ // Flags: for io.KeyMods (Ctrl/Shift/Alt/Super) -typedef int ImGuiPopupFlags; // -> enum ImGuiPopupFlags_ // Flags: for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() -typedef int ImGuiSelectableFlags; // -> enum ImGuiSelectableFlags_ // Flags: for Selectable() -typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. -typedef int ImGuiTabBarFlags; // -> enum ImGuiTabBarFlags_ // Flags: for BeginTabBar() -typedef int ImGuiTabItemFlags; // -> enum ImGuiTabItemFlags_ // Flags: for BeginTabItem() -typedef int ImGuiTableFlags; // -> enum ImGuiTableFlags_ // Flags: For BeginTable() -typedef int ImGuiTableColumnFlags; // -> enum ImGuiTableColumnFlags_// Flags: For TableSetupColumn() -typedef int ImGuiTableRowFlags; // -> enum ImGuiTableRowFlags_ // Flags: For TableNextRow() -typedef int ImGuiTreeNodeFlags; // -> enum ImGuiTreeNodeFlags_ // Flags: for TreeNode(), TreeNodeEx(), CollapsingHeader() -typedef int ImGuiViewportFlags; // -> enum ImGuiViewportFlags_ // Flags: for ImGuiViewport -typedef int ImGuiWindowFlags; // -> enum ImGuiWindowFlags_ // Flags: for Begin(), BeginChild() - -// ImTexture: user data for renderer backend to identify a texture [Compile-time configurable type] -// - To use something else than an opaque void* pointer: override with e.g. '#define ImTextureID MyTextureType*' in your imconfig.h file. -// - This can be whatever to you want it to be! read the FAQ about ImTextureID for details. -#ifndef ImTextureID -typedef void* ImTextureID; // Default: store a pointer or an integer fitting in a pointer (most renderer backends are ok with that) -#endif - -// ImDrawIdx: vertex index. [Compile-time configurable type] -// - To use 16-bit indices + allow large meshes: backend need to set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset (recommended). -// - To use 32-bit indices: override with '#define ImDrawIdx unsigned int' in your imconfig.h file. -#ifndef ImDrawIdx -typedef unsigned short ImDrawIdx; // Default: 16-bit (for maximum compatibility with renderer backends) -#endif - -// Scalar data types -typedef unsigned int ImGuiID;// A unique ID used by widgets (typically the result of hashing a stack of string) -typedef signed char ImS8; // 8-bit signed integer -typedef unsigned char ImU8; // 8-bit unsigned integer -typedef signed short ImS16; // 16-bit signed integer -typedef unsigned short ImU16; // 16-bit unsigned integer -typedef signed int ImS32; // 32-bit signed integer == int -typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors) -typedef signed long long ImS64; // 64-bit signed integer -typedef unsigned long long ImU64; // 64-bit unsigned integer - -// Character types -// (we generally use UTF-8 encoded string in the API. This is storage specifically for a decoded character used for keyboard input and display) -typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings. -typedef unsigned int ImWchar32; // A single decoded U32 character/code point. We encode them as multi bytes UTF-8 when used in strings. -#ifdef IMGUI_USE_WCHAR32 // ImWchar [configurable type: override in imconfig.h with '#define IMGUI_USE_WCHAR32' to support Unicode planes 1-16] -typedef ImWchar32 ImWchar; -#else -typedef ImWchar16 ImWchar; -#endif - -// Callback and functions types -typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData* data); // Callback function for ImGui::InputText() -typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data); // Callback function for ImGui::SetNextWindowSizeConstraints() -typedef void* (*ImGuiMemAllocFunc)(size_t sz, void* user_data); // Function signature for ImGui::SetAllocatorFunctions() -typedef void (*ImGuiMemFreeFunc)(void* ptr, void* user_data); // Function signature for ImGui::SetAllocatorFunctions() - -// ImVec2: 2D vector used to store positions, sizes etc. [Compile-time configurable type] -// This is a frequently used type in the API. Consider using IM_VEC2_CLASS_EXTRA to create implicit cast from/to our preferred type. -IM_MSVC_RUNTIME_CHECKS_OFF -struct ImVec2 -{ - float x, y; - constexpr ImVec2() : x(0.0f), y(0.0f) { } - constexpr ImVec2(float _x, float _y) : x(_x), y(_y) { } - float operator[] (size_t idx) const { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. - float& operator[] (size_t idx) { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. -#ifdef IM_VEC2_CLASS_EXTRA - IM_VEC2_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec2. -#endif -}; - -// ImVec4: 4D vector used to store clipping rectangles, colors etc. [Compile-time configurable type] -struct ImVec4 -{ - float x, y, z, w; - constexpr ImVec4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f) { } - constexpr ImVec4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w) { } -#ifdef IM_VEC4_CLASS_EXTRA - IM_VEC4_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec4. -#endif -}; -IM_MSVC_RUNTIME_CHECKS_RESTORE - -//----------------------------------------------------------------------------- -// [SECTION] Dear ImGui end-user API functions -// (Note that ImGui:: being a namespace, you can add extra ImGui:: functions in your own separate file. Please don't modify imgui source files!) -//----------------------------------------------------------------------------- - -namespace ImGui -{ - // Context creation and access - // - Each context create its own ImFontAtlas by default. You may instance one yourself and pass it to CreateContext() to share a font atlas between contexts. - // - DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() - // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for details. - IMGUI_API ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL); - IMGUI_API void DestroyContext(ImGuiContext* ctx = NULL); // NULL = destroy current context - IMGUI_API ImGuiContext* GetCurrentContext(); - IMGUI_API void SetCurrentContext(ImGuiContext* ctx); - - // Main - IMGUI_API ImGuiIO& GetIO(); // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags) - IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame! - IMGUI_API void NewFrame(); // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame(). - IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all! - IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can then get call GetDrawData(). - IMGUI_API ImDrawData* GetDrawData(); // valid after Render() and until the next call to NewFrame(). this is what you have to render. - - // Demo, Debug, Information - IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create Demo window. demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application! - IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create Metrics/Debugger window. display Dear ImGui internals: windows, draw commands, various internal state, etc. - IMGUI_API void ShowDebugLogWindow(bool* p_open = NULL); // create Debug Log window. display a simplified log of important dear imgui events. - IMGUI_API void ShowStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID. - IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create About window. display Dear ImGui version, credits and build/system information. - IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style) - IMGUI_API bool ShowStyleSelector(const char* label); // add style selector block (not a window), essentially a combo listing the default styles. - IMGUI_API void ShowFontSelector(const char* label); // add font selector block (not a window), essentially a combo listing the loaded fonts. - IMGUI_API void ShowUserGuide(); // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls). - IMGUI_API const char* GetVersion(); // get the compiled version string e.g. "1.80 WIP" (essentially the value for IMGUI_VERSION from the compiled version of imgui.cpp) - - // Styles - IMGUI_API void StyleColorsDark(ImGuiStyle* dst = NULL); // new, recommended style (default) - IMGUI_API void StyleColorsLight(ImGuiStyle* dst = NULL); // best used with borders and a custom, thicker font - IMGUI_API void StyleColorsClassic(ImGuiStyle* dst = NULL); // classic imgui style - - // Windows - // - Begin() = push window to the stack and start appending to it. End() = pop window from the stack. - // - Passing 'bool* p_open != NULL' shows a window-closing widget in the upper-right corner of the window, - // which clicking will set the boolean to false when clicked. - // - You may append multiple times to the same window during the same frame by calling Begin()/End() pairs multiple times. - // Some information such as 'flags' or 'p_open' will only be considered by the first call to Begin(). - // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting - // anything to the window. Always call a matching End() for each Begin() call, regardless of its return value! - // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, - // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function - // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] - // - Note that the bottom of window stack always contains a window called "Debug". - IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); - IMGUI_API void End(); - - // Child Windows - // - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child. - // - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400). - // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. - // Always call a matching EndChild() for each BeginChild() call, regardless of its return value. - // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, - // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function - // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] - IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); - IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); - IMGUI_API void EndChild(); - - // Windows Utilities - // - 'current window' = the window we are appending into while inside a Begin()/End() block. 'next window' = next window we will Begin() into. - IMGUI_API bool IsWindowAppearing(); - IMGUI_API bool IsWindowCollapsed(); - IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options. - IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ! - IMGUI_API ImDrawList* GetWindowDrawList(); // get draw list associated to the current window, to append your own drawing primitives - IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList API) - IMGUI_API ImVec2 GetWindowSize(); // get current window size - IMGUI_API float GetWindowWidth(); // get current window width (shortcut for GetWindowSize().x) - IMGUI_API float GetWindowHeight(); // get current window height (shortcut for GetWindowSize().y) - - // Window manipulation - // - Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin). - IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc. - IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin() - IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints. - IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin() - IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin() - IMGUI_API void SetNextWindowFocus(); // set next window to be focused / top-most. call before Begin() - IMGUI_API void SetNextWindowBgAlpha(float alpha); // set next window background color alpha. helper to easily override the Alpha component of ImGuiCol_WindowBg/ChildBg/PopupBg. you may also use ImGuiWindowFlags_NoBackground. - IMGUI_API void SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0); // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects. - IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiCond cond = 0); // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0, 0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects. - IMGUI_API void SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed(). - IMGUI_API void SetWindowFocus(); // (not recommended) set current window to be focused / top-most. prefer using SetNextWindowFocus(). - IMGUI_API void SetWindowFontScale(float scale); // [OBSOLETE] set font scale. Adjust IO.FontGlobalScale if you want to scale all windows. This is an old API! For correct scaling, prefer to reload font + rebuild ImFontAtlas + call style.ScaleAllSizes(). - IMGUI_API void SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0); // set named window position. - IMGUI_API void SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0); // set named window size. set axis to 0.0f to force an auto-fit on this axis. - IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0); // set named window collapsed state - IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / top-most. use NULL to remove focus. - - // Content region - // - Retrieve available space from a given point. GetContentRegionAvail() is frequently useful. - // - Those functions are bound to be redesigned (they are confusing, incomplete and the Min/Max return values are in local window coordinates which increases confusion) - IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos() - IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates - IMGUI_API ImVec2 GetWindowContentRegionMin(); // content boundaries min for the full window (roughly (0,0)-Scroll), in window coordinates - IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max for the full window (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates - - // Windows Scrolling - IMGUI_API float GetScrollX(); // get scrolling amount [0 .. GetScrollMaxX()] - IMGUI_API float GetScrollY(); // get scrolling amount [0 .. GetScrollMaxY()] - IMGUI_API void SetScrollX(float scroll_x); // set scrolling amount [0 .. GetScrollMaxX()] - IMGUI_API void SetScrollY(float scroll_y); // set scrolling amount [0 .. GetScrollMaxY()] - IMGUI_API float GetScrollMaxX(); // get maximum scrolling amount ~~ ContentSize.x - WindowSize.x - DecorationsSize.x - IMGUI_API float GetScrollMaxY(); // get maximum scrolling amount ~~ ContentSize.y - WindowSize.y - DecorationsSize.y - IMGUI_API void SetScrollHereX(float center_x_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_x_ratio=0.0: left, 0.5: center, 1.0: right. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. - IMGUI_API void SetScrollHereY(float center_y_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. - IMGUI_API void SetScrollFromPosX(float local_x, float center_x_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. - IMGUI_API void SetScrollFromPosY(float local_y, float center_y_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. - - // Parameters stacks (shared) - IMGUI_API void PushFont(ImFont* font); // use NULL as a shortcut to push default font - IMGUI_API void PopFont(); - IMGUI_API void PushStyleColor(ImGuiCol idx, ImU32 col); // modify a style color. always use this if you modify the style after NewFrame(). - IMGUI_API void PushStyleColor(ImGuiCol idx, const ImVec4& col); - IMGUI_API void PopStyleColor(int count = 1); - IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val); // modify a style float variable. always use this if you modify the style after NewFrame(). - IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val); // modify a style ImVec2 variable. always use this if you modify the style after NewFrame(). - IMGUI_API void PopStyleVar(int count = 1); - IMGUI_API void PushAllowKeyboardFocus(bool allow_keyboard_focus); // == tab stop enable. Allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets - IMGUI_API void PopAllowKeyboardFocus(); - IMGUI_API void PushButtonRepeat(bool repeat); // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame. - IMGUI_API void PopButtonRepeat(); - - // Parameters stacks (current window) - IMGUI_API void PushItemWidth(float item_width); // push width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side). - IMGUI_API void PopItemWidth(); - IMGUI_API void SetNextItemWidth(float item_width); // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side) - IMGUI_API float CalcItemWidth(); // width of item given pushed settings and current cursor position. NOT necessarily the width of last item unlike most 'Item' functions. - IMGUI_API void PushTextWrapPos(float wrap_local_pos_x = 0.0f); // push word-wrapping position for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space - IMGUI_API void PopTextWrapPos(); - - // Style read access - // - Use the style editor (ShowStyleEditor() function) to interactively see what the colors are) - IMGUI_API ImFont* GetFont(); // get current font - IMGUI_API float GetFontSize(); // get current font size (= height in pixels) of current font with current scale applied - IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API - IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier, packed as a 32-bit value suitable for ImDrawList - IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList - IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList - IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in. - - // Cursor / Layout - // - By "cursor" we mean the current output position. - // - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down. - // - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceding widget. - // - Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API: - // Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() - // Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. - IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator. - IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f); // call between widgets or groups to layout them horizontally. X position given in window coordinates. - IMGUI_API void NewLine(); // undo a SameLine() or force a new line when in an horizontal-layout context. - IMGUI_API void Spacing(); // add vertical spacing. - IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size. unlike InvisibleButton(), Dummy() won't take the mouse click or be navigable into. - IMGUI_API void Indent(float indent_w = 0.0f); // move content position toward the right, by indent_w, or style.IndentSpacing if indent_w <= 0 - IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by indent_w, or style.IndentSpacing if indent_w <= 0 - IMGUI_API void BeginGroup(); // lock horizontal starting position - IMGUI_API void EndGroup(); // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) - IMGUI_API ImVec2 GetCursorPos(); // cursor position in window coordinates (relative to window position) - IMGUI_API float GetCursorPosX(); // (some functions are using window-relative coordinates, such as: GetCursorPos, GetCursorStartPos, GetContentRegionMax, GetWindowContentRegion* etc. - IMGUI_API float GetCursorPosY(); // other functions such as GetCursorScreenPos or everything in ImDrawList:: - IMGUI_API void SetCursorPos(const ImVec2& local_pos); // are using the main, absolute coordinate system. - IMGUI_API void SetCursorPosX(float local_x); // GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.) - IMGUI_API void SetCursorPosY(float local_y); // - IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position in window coordinates - IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (useful to work with ImDrawList API). generally top-left == GetMainViewport()->Pos == (0,0) in single viewport mode, and bottom-right == GetMainViewport()->Pos+Size == io.DisplaySize in single-viewport mode. - IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates - IMGUI_API void AlignTextToFramePadding(); // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item) - IMGUI_API float GetTextLineHeight(); // ~ FontSize - IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text) - IMGUI_API float GetFrameHeight(); // ~ FontSize + style.FramePadding.y * 2 - IMGUI_API float GetFrameHeightWithSpacing(); // ~ FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets) - - // ID stack/scopes - // Read the FAQ (docs/FAQ.md or http://dearimgui.org/faq) for more details about how ID are handled in dear imgui. - // - Those questions are answered and impacted by understanding of the ID stack system: - // - "Q: Why is my widget not reacting when I click on it?" - // - "Q: How can I have widgets with an empty label?" - // - "Q: How can I have multiple widgets with the same label?" - // - Short version: ID are hashes of the entire ID stack. If you are creating widgets in a loop you most likely - // want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them. - // - You can also use the "Label##foobar" syntax within widget label to distinguish them from each others. - // - In this header file we use the "label"/"name" terminology to denote a string that will be displayed + used as an ID, - // whereas "str_id" denote a string that is only used as an ID and not normally displayed. - IMGUI_API void PushID(const char* str_id); // push string into the ID stack (will hash string). - IMGUI_API void PushID(const char* str_id_begin, const char* str_id_end); // push string into the ID stack (will hash string). - IMGUI_API void PushID(const void* ptr_id); // push pointer into the ID stack (will hash pointer). - IMGUI_API void PushID(int int_id); // push integer into the ID stack (will hash integer). - IMGUI_API void PopID(); // pop from the ID stack. - IMGUI_API ImGuiID GetID(const char* str_id); // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself - IMGUI_API ImGuiID GetID(const char* str_id_begin, const char* str_id_end); - IMGUI_API ImGuiID GetID(const void* ptr_id); - - // Widgets: Text - IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text. - IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // formatted text - IMGUI_API void TextV(const char* fmt, va_list args) IM_FMTLIST(1); - IMGUI_API void TextColored(const ImVec4& col, const char* fmt, ...) IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor(); - IMGUI_API void TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2); - IMGUI_API void TextDisabled(const char* fmt, ...) IM_FMTARGS(1); // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor(); - IMGUI_API void TextDisabledV(const char* fmt, va_list args) IM_FMTLIST(1); - IMGUI_API void TextWrapped(const char* fmt, ...) IM_FMTARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize(). - IMGUI_API void TextWrappedV(const char* fmt, va_list args) IM_FMTLIST(1); - IMGUI_API void LabelText(const char* label, const char* fmt, ...) IM_FMTARGS(2); // display text+label aligned the same way as value+label widgets - IMGUI_API void LabelTextV(const char* label, const char* fmt, va_list args) IM_FMTLIST(2); - IMGUI_API void BulletText(const char* fmt, ...) IM_FMTARGS(1); // shortcut for Bullet()+Text() - IMGUI_API void BulletTextV(const char* fmt, va_list args) IM_FMTLIST(1); - - // Widgets: Main - // - Most widgets return true when the value has been changed or when pressed/selected - // - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state. - IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0, 0)); // button - IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text - IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) - IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape - IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); - IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding - IMGUI_API bool Checkbox(const char* label, bool* v); - IMGUI_API bool CheckboxFlags(const char* label, int* flags, int flags_value); - IMGUI_API bool CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value); - IMGUI_API bool RadioButton(const char* label, bool active); // use with e.g. if (RadioButton("one", my_value==1)) { my_value = 1; } - IMGUI_API bool RadioButton(const char* label, int* v, int v_button); // shortcut to handle the above pattern when value is an integer - IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-FLT_MIN, 0), const char* overlay = NULL); - IMGUI_API void Bullet(); // draw a small circle + keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses - - // Widgets: Combo Box - // - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items. - // - The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose. This is analogous to how ListBox are created. - IMGUI_API bool BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0); - IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true! - IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1); - IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0" - IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1); - - // Widgets: Drag Sliders - // - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp. - // - For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', - // the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x - // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc. - // - Format string may also be set to NULL or use the default format ("%f" or "%d"). - // - Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision). - // - Use v_min < v_max to clamp edits to given limits. Note that CTRL+Click manual input can override those limits if ImGuiSliderFlags_AlwaysClamp is not used. - // - Use v_max = FLT_MAX / INT_MAX etc to avoid clamping to a maximum, same with v_min = -FLT_MAX / INT_MIN to avoid clamping to a minimum. - // - We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them. - // - Legacy: Pre-1.78 there are DragXXX() function signatures that takes a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument. - // If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361 - IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); // If v_min >= v_max we have no bound - IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); - IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); - IMGUI_API bool DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); - IMGUI_API bool DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", const char* format_max = NULL, ImGuiSliderFlags flags = 0); - IMGUI_API bool DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); // If v_min >= v_max we have no bound - IMGUI_API bool DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); - IMGUI_API bool DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); - IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); - IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL, ImGuiSliderFlags flags = 0); - IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed = 1.0f, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0); - IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed = 1.0f, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0); - - // Widgets: Regular Sliders - // - CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp. - // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc. - // - Format string may also be set to NULL or use the default format ("%f" or "%d"). - // - Legacy: Pre-1.78 there are SliderXXX() function signatures that takes a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument. - // If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361 - IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); // adjust format to decorate the value with a prefix or a suffix for in-slider labels or unit display. - IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f, const char* format = "%.0f deg", ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderInt(const char* label, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); - IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); - IMGUI_API bool VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); - IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); - IMGUI_API bool VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); - - // Widgets: Input with Keyboard - // - If you want to use InputText() with std::string or any custom dynamic string type, see misc/cpp/imgui_stdlib.h and comments in imgui_demo.cpp. - // - Most of the ImGuiInputTextFlags flags are only useful for InputText() and not for InputFloatX, InputIntX, InputDouble etc. - IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputFloat2(const char* label, float v[2], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputFloat3(const char* label, float v[3], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputFloat4(const char* label, float v[4], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputDouble(const char* label, double* v, double step = 0.0, double step_fast = 0.0, const char* format = "%.6f", ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); - IMGUI_API bool InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); - - // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little color square that can be left-clicked to open a picker, and right-clicked to open an option menu.) - // - Note that in C++ a 'float v[X]' function argument is the _same_ as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. - // - You can pass the address of a first float element out of a contiguous structure, e.g. &myvector.x - IMGUI_API bool ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); - IMGUI_API bool ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0); - IMGUI_API bool ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); - IMGUI_API bool ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags = 0, const float* ref_col = NULL); - IMGUI_API bool ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // display a color square/button, hover for details, return true when pressed. - IMGUI_API void SetColorEditOptions(ImGuiColorEditFlags flags); // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls. - - // Widgets: Trees - // - TreeNode functions return true when the node is open, in which case you need to also call TreePop() when you are finished displaying the tree node contents. - IMGUI_API bool TreeNode(const char* label); - IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2); // helper variation to easily decorelate the id from the displayed string. Read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet(). - IMGUI_API bool TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2); // " - IMGUI_API bool TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2); - IMGUI_API bool TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2); - IMGUI_API bool TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0); - IMGUI_API bool TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); - IMGUI_API bool TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); - IMGUI_API bool TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); - IMGUI_API bool TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); - IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. - IMGUI_API void TreePush(const void* ptr_id = NULL); // " - IMGUI_API void TreePop(); // ~ Unindent()+PopId() - IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode - IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). - IMGUI_API bool CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags = 0); // when 'p_visible != NULL': if '*p_visible==true' display an additional small close button on upper right of the header which will set the bool to false when clicked, if '*p_visible==false' don't display the header. - IMGUI_API void SetNextItemOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state. - - // Widgets: Selectables - // - A selectable highlights when hovered, and can display another color when selected. - // - Neighbors selectable extend their highlight bounds in order to leave no gap between them. This is so a series of selected Selectable appear contiguous. - IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height - IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper. - - // Widgets: List Boxes - // - This is essentially a thin wrapper to using BeginChild/EndChild with some stylistic changes. - // - The BeginListBox()/EndListBox() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() or any items. - // - The simplified/old ListBox() api are helpers over BeginListBox()/EndListBox() which are kept available for convenience purpose. This is analoguous to how Combos are created. - // - Choose frame width: size.x > 0.0f: custom / size.x < 0.0f or -FLT_MIN: right-align / size.x = 0.0f (default): use current ItemWidth - // - Choose frame height: size.y > 0.0f: custom / size.y < 0.0f or -FLT_MIN: bottom-align / size.y = 0.0f (default): arbitrary default height which can fit ~7 items - IMGUI_API bool BeginListBox(const char* label, const ImVec2& size = ImVec2(0, 0)); // open a framed scrolling region - IMGUI_API void EndListBox(); // only call EndListBox() if BeginListBox() returned true! - IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1); - IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1); - - // Widgets: Data Plotting - // - Consider using ImPlot (https://github.com/epezent/implot) which is much better! - IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); - IMGUI_API void PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); - IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); - IMGUI_API void PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); - - // Widgets: Value() Helpers. - // - Those are merely shortcut to calling Text() with a format string. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace) - IMGUI_API void Value(const char* prefix, bool b); - IMGUI_API void Value(const char* prefix, int v); - IMGUI_API void Value(const char* prefix, unsigned int v); - IMGUI_API void Value(const char* prefix, float v, const char* float_format = NULL); - - // Widgets: Menus - // - Use BeginMenuBar() on a window ImGuiWindowFlags_MenuBar to append to its menu bar. - // - Use BeginMainMenuBar() to create a menu bar at the top of the screen and append to it. - // - Use BeginMenu() to create a menu. You can call BeginMenu() multiple time with the same identifier to append more items to it. - // - Not that MenuItem() keyboardshortcuts are displayed as a convenience but _not processed_ by Dear ImGui at the moment. - IMGUI_API bool BeginMenuBar(); // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window). - IMGUI_API void EndMenuBar(); // only call EndMenuBar() if BeginMenuBar() returns true! - IMGUI_API bool BeginMainMenuBar(); // create and append to a full screen menu-bar. - IMGUI_API void EndMainMenuBar(); // only call EndMainMenuBar() if BeginMainMenuBar() returns true! - IMGUI_API bool BeginMenu(const char* label, bool enabled = true); // create a sub-menu entry. only call EndMenu() if this returns true! - IMGUI_API void EndMenu(); // only call EndMenu() if BeginMenu() returns true! - IMGUI_API bool MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true); // return true when activated. - IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL - - // Tooltips - // - Tooltip are windows following the mouse. They do not take focus away. - IMGUI_API void BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of items). - IMGUI_API void EndTooltip(); - IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip(). - IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); - - // Popups, Modals - // - They block normal mouse hovering detection (and therefore most mouse interactions) behind them. - // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. - // - Their visibility state (~bool) is held internally instead of being held by the programmer as we are used to with regular Begin*() calls. - // - The 3 properties above are related: we need to retain popup visibility state in the library because popups may be closed as any time. - // - You can bypass the hovering restriction by using ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered(). - // - IMPORTANT: Popup identifiers are relative to the current ID stack, so OpenPopup and BeginPopup generally needs to be at the same level of the stack. - // This is sometimes leading to confusing mistakes. May rework this in the future. - - // Popups: begin/end functions - // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards. ImGuiWindowFlags are forwarded to the window. - // - BeginPopupModal(): block every interactions behind the window, cannot be closed by user, add a dimming background, has a title bar. - IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it. - IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // return true if the modal is open, and you can start outputting to it. - IMGUI_API void EndPopup(); // only call EndPopup() if BeginPopupXXX() returns true! - - // Popups: open/close functions - // - OpenPopup(): set popup state to open. ImGuiPopupFlags are available for opening options. - // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. - // - CloseCurrentPopup(): use inside the BeginPopup()/EndPopup() scope to close manually. - // - CloseCurrentPopup() is called by default by Selectable()/MenuItem() when activated (FIXME: need some options). - // - Use ImGuiPopupFlags_NoOpenOverExistingPopup to avoid opening a popup if there's already one at the same level. This is equivalent to e.g. testing for !IsAnyPopupOpen() prior to OpenPopup(). - // - Use IsWindowAppearing() after BeginPopup() to tell if a window just opened. - // - IMPORTANT: Notice that for OpenPopupOnItemClick() we exceptionally default flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter - IMGUI_API void OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags = 0); // call to mark popup as open (don't call every frame!). - IMGUI_API void OpenPopup(ImGuiID id, ImGuiPopupFlags popup_flags = 0); // id overload to facilitate calling from nested stacks - IMGUI_API void OpenPopupOnItemClick(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // helper to open popup when clicked on last item. Default to ImGuiPopupFlags_MouseButtonRight == 1. (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors) - IMGUI_API void CloseCurrentPopup(); // manually close the popup we have begin-ed into. - - // Popups: open+begin combined functions helpers - // - Helpers to do OpenPopup+BeginPopup where the Open action is triggered by e.g. hovering an item and right-clicking. - // - They are convenient to easily create context menus, hence the name. - // - IMPORTANT: Notice that BeginPopupContextXXX takes ImGuiPopupFlags just like OpenPopup() and unlike BeginPopup(). For full consistency, we may add ImGuiWindowFlags to the BeginPopupContextXXX functions in the future. - // - IMPORTANT: Notice that we exceptionally default their flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter, so if you add other flags remember to re-add the ImGuiPopupFlags_MouseButtonRight. - IMGUI_API bool BeginPopupContextItem(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // open+begin popup when clicked on last item. Use str_id==NULL to associate the popup to previous item. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp! - IMGUI_API bool BeginPopupContextWindow(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);// open+begin popup when clicked on current window. - IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // open+begin popup when clicked in void (where there are no windows). - - // Popups: query functions - // - IsPopupOpen(): return true if the popup is open at the current BeginPopup() level of the popup stack. - // - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId: return true if any popup is open at the current BeginPopup() level of the popup stack. - // - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId + ImGuiPopupFlags_AnyPopupLevel: return true if any popup is open. - IMGUI_API bool IsPopupOpen(const char* str_id, ImGuiPopupFlags flags = 0); // return true if the popup is open. - - // Tables - // - Full-featured replacement for old Columns API. - // - See Demo->Tables for demo code. See top of imgui_tables.cpp for general commentary. - // - See ImGuiTableFlags_ and ImGuiTableColumnFlags_ enums for a description of available flags. - // The typical call flow is: - // - 1. Call BeginTable(), early out if returning false. - // - 2. Optionally call TableSetupColumn() to submit column name/flags/defaults. - // - 3. Optionally call TableSetupScrollFreeze() to request scroll freezing of columns/rows. - // - 4. Optionally call TableHeadersRow() to submit a header row. Names are pulled from TableSetupColumn() data. - // - 5. Populate contents: - // - In most situations you can use TableNextRow() + TableSetColumnIndex(N) to start appending into a column. - // - If you are using tables as a sort of grid, where every columns is holding the same type of contents, - // you may prefer using TableNextColumn() instead of TableNextRow() + TableSetColumnIndex(). - // TableNextColumn() will automatically wrap-around into the next row if needed. - // - IMPORTANT: Comparatively to the old Columns() API, we need to call TableNextColumn() for the first column! - // - Summary of possible call flow: - // -------------------------------------------------------------------------------------------------------- - // TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK - // TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK - // TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row! - // TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear! - // -------------------------------------------------------------------------------------------------------- - // - 5. Call EndTable() - IMGUI_API bool BeginTable(const char* str_id, int column, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0.0f, 0.0f), float inner_width = 0.0f); - IMGUI_API void EndTable(); // only call EndTable() if BeginTable() returns true! - IMGUI_API void TableNextRow(ImGuiTableRowFlags row_flags = 0, float min_row_height = 0.0f); // append into the first cell of a new row. - IMGUI_API bool TableNextColumn(); // append into the next column (or first column of next row if currently in last column). Return true when column is visible. - IMGUI_API bool TableSetColumnIndex(int column_n); // append into the specified column. Return true when column is visible. - - // Tables: Headers & Columns declaration - // - Use TableSetupColumn() to specify label, resizing policy, default width/weight, id, various other flags etc. - // - Use TableHeadersRow() to create a header row and automatically submit a TableHeader() for each column. - // Headers are required to perform: reordering, sorting, and opening the context menu. - // The context menu can also be made available in columns body using ImGuiTableFlags_ContextMenuInBody. - // - You may manually submit headers using TableNextRow() + TableHeader() calls, but this is only useful in - // some advanced use cases (e.g. adding custom widgets in header row). - // - Use TableSetupScrollFreeze() to lock columns/rows so they stay visible when scrolled. - IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = 0.0f, ImGuiID user_id = 0); - IMGUI_API void TableSetupScrollFreeze(int cols, int rows); // lock columns/rows so they stay visible when scrolled. - IMGUI_API void TableHeadersRow(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu - IMGUI_API void TableHeader(const char* label); // submit one header cell manually (rarely used) - - // Tables: Sorting & Miscellaneous functions - // - Sorting: call TableGetSortSpecs() to retrieve latest sort specs for the table. NULL when not sorting. - // When 'sort_specs->SpecsDirty == true' you should sort your data. It will be true when sorting specs have - // changed since last call, or the first time. Make sure to set 'SpecsDirty = false' after sorting, - // else you may wastefully sort your data every frame! - // - Functions args 'int column_n' treat the default value of -1 as the same as passing the current column index. - IMGUI_API ImGuiTableSortSpecs* TableGetSortSpecs(); // get latest sort specs for the table (NULL if not sorting). Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable(). - IMGUI_API int TableGetColumnCount(); // return number of columns (value passed to BeginTable) - IMGUI_API int TableGetColumnIndex(); // return current column index. - IMGUI_API int TableGetRowIndex(); // return current row index. - IMGUI_API const char* TableGetColumnName(int column_n = -1); // return "" if column didn't have a name declared by TableSetupColumn(). Pass -1 to use current column. - IMGUI_API ImGuiTableColumnFlags TableGetColumnFlags(int column_n = -1); // return column flags so you can query their Enabled/Visible/Sorted/Hovered status flags. Pass -1 to use current column. - IMGUI_API void TableSetColumnEnabled(int column_n, bool v);// change user accessible enabled/disabled state of a column. Set to false to hide the column. User can use the context menu to change this themselves (right-click in headers, or right-click in columns body with ImGuiTableFlags_ContextMenuInBody) - IMGUI_API void TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n = -1); // change the color of a cell, row, or column. See ImGuiTableBgTarget_ flags for details. - - // Legacy Columns API (prefer using Tables!) - // - You can also use SameLine(pos_x) to mimic simplified columns. - IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true); - IMGUI_API void NextColumn(); // next column, defaults to current row or next row if the current row is finished - IMGUI_API int GetColumnIndex(); // get current column index - IMGUI_API float GetColumnWidth(int column_index = -1); // get column width (in pixels). pass -1 to use current column - IMGUI_API void SetColumnWidth(int column_index, float width); // set column width (in pixels). pass -1 to use current column - IMGUI_API float GetColumnOffset(int column_index = -1); // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetColumnsCount() inclusive. column 0 is typically 0.0f - IMGUI_API void SetColumnOffset(int column_index, float offset_x); // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column - IMGUI_API int GetColumnsCount(); - - // Tab Bars, Tabs - IMGUI_API bool BeginTabBar(const char* str_id, ImGuiTabBarFlags flags = 0); // create and append into a TabBar - IMGUI_API void EndTabBar(); // only call EndTabBar() if BeginTabBar() returns true! - IMGUI_API bool BeginTabItem(const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0); // create a Tab. Returns true if the Tab is selected. - IMGUI_API void EndTabItem(); // only call EndTabItem() if BeginTabItem() returns true! - IMGUI_API bool TabItemButton(const char* label, ImGuiTabItemFlags flags = 0); // create a Tab behaving like a button. return true when clicked. cannot be selected in the tab bar. - IMGUI_API void SetTabItemClosed(const char* tab_or_docked_window_label); // notify TabBar or Docking system of a closed tab/window ahead (useful to reduce visual flicker on reorderable tab bars). For tab-bar: call after BeginTabBar() and before Tab submissions. Otherwise call with a window name. - - // Logging/Capture - // - All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging. - IMGUI_API void LogToTTY(int auto_open_depth = -1); // start logging to tty (stdout) - IMGUI_API void LogToFile(int auto_open_depth = -1, const char* filename = NULL); // start logging to file - IMGUI_API void LogToClipboard(int auto_open_depth = -1); // start logging to OS clipboard - IMGUI_API void LogFinish(); // stop logging (close file, etc.) - IMGUI_API void LogButtons(); // helper to display buttons for logging to tty/file/clipboard - IMGUI_API void LogText(const char* fmt, ...) IM_FMTARGS(1); // pass text data straight to log (without being displayed) - IMGUI_API void LogTextV(const char* fmt, va_list args) IM_FMTLIST(1); - - // Drag and Drop - // - On source items, call BeginDragDropSource(), if it returns true also call SetDragDropPayload() + EndDragDropSource(). - // - On target candidates, call BeginDragDropTarget(), if it returns true also call AcceptDragDropPayload() + EndDragDropTarget(). - // - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip, see #1725) - // - An item can be both drag source and drop target. - IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0); // call after submitting an item which may be dragged. when this return true, you can call SetDragDropPayload() + EndDragDropSource() - IMGUI_API bool SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0); // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui. Return true when payload has been accepted. - IMGUI_API void EndDragDropSource(); // only call EndDragDropSource() if BeginDragDropSource() returns true! - IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() - IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0); // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released. - IMGUI_API void EndDragDropTarget(); // only call EndDragDropTarget() if BeginDragDropTarget() returns true! - IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type. - - // Disabling [BETA API] - // - Disable all user interactions and dim items visuals (applying style.DisabledAlpha over current colors) - // - Those can be nested but it cannot be used to enable an already disabled section (a single BeginDisabled(true) in the stack is enough to keep everything disabled) - // - BeginDisabled(false) essentially does nothing useful but is provided to facilitate use of boolean expressions. If you can avoid calling BeginDisabled(False)/EndDisabled() best to avoid it. - IMGUI_API void BeginDisabled(bool disabled = true); - IMGUI_API void EndDisabled(); - - // Clipping - // - Mouse hovering is affected by ImGui::PushClipRect() calls, unlike direct calls to ImDrawList::PushClipRect() which are render only. - IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect); - IMGUI_API void PopClipRect(); - - // Focus, Activation - // - Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item" - IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a window. - IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget. - - // Item/Widgets Utilities and Query Functions - // - Most of the functions are referring to the previous Item that has been submitted. - // - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions. - IMGUI_API bool IsItemHovered(ImGuiHoveredFlags flags = 0); // is the last item hovered? (and usable, aka not blocked by a popup, etc.). See ImGuiHoveredFlags for more options. - IMGUI_API bool IsItemActive(); // is the last item active? (e.g. button being held, text field being edited. This will continuously return true while holding mouse button on an item. Items that don't interact will always return false) - IMGUI_API bool IsItemFocused(); // is the last item focused for keyboard/gamepad navigation? - IMGUI_API bool IsItemClicked(ImGuiMouseButton mouse_button = 0); // is the last item hovered and mouse clicked on? (**) == IsMouseClicked(mouse_button) && IsItemHovered()Important. (**) this it NOT equivalent to the behavior of e.g. Button(). Read comments in function definition. - IMGUI_API bool IsItemVisible(); // is the last item visible? (items may be out of sight because of clipping/scrolling) - IMGUI_API bool IsItemEdited(); // did the last item modify its underlying value this frame? or was pressed? This is generally the same as the "bool" return value of many widgets. - IMGUI_API bool IsItemActivated(); // was the last item just made active (item was previously inactive). - IMGUI_API bool IsItemDeactivated(); // was the last item just made inactive (item was previously active). Useful for Undo/Redo patterns with widgets that requires continuous editing. - IMGUI_API bool IsItemDeactivatedAfterEdit(); // was the last item just made inactive and made a value change when it was active? (e.g. Slider/Drag moved). Useful for Undo/Redo patterns with widgets that requires continuous editing. Note that you may get false positives (some widgets such as Combo()/ListBox()/Selectable() will return true even when clicking an already selected item). - IMGUI_API bool IsItemToggledOpen(); // was the last item open state toggled? set by TreeNode(). - IMGUI_API bool IsAnyItemHovered(); // is any item hovered? - IMGUI_API bool IsAnyItemActive(); // is any item active? - IMGUI_API bool IsAnyItemFocused(); // is any item focused? - IMGUI_API ImVec2 GetItemRectMin(); // get upper-left bounding rectangle of the last item (screen space) - IMGUI_API ImVec2 GetItemRectMax(); // get lower-right bounding rectangle of the last item (screen space) - IMGUI_API ImVec2 GetItemRectSize(); // get size of last item - IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area. - - // Viewports - // - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. - // - In 'docking' branch with multi-viewport enabled, we extend this concept to have multiple active viewports. - // - In the future we will extend this concept further to also represent Platform Monitor and support a "no main platform window" operation mode. - IMGUI_API ImGuiViewport* GetMainViewport(); // return primary/default viewport. This can never be NULL. - - // Background/Foreground Draw Lists - IMGUI_API ImDrawList* GetBackgroundDrawList(); // this draw list will be the first rendered one. Useful to quickly draw shapes/text behind dear imgui contents. - IMGUI_API ImDrawList* GetForegroundDrawList(); // this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. - - // Miscellaneous Utilities - IMGUI_API bool IsRectVisible(const ImVec2& size); // test if rectangle (of given size, starting from cursor position) is visible / not clipped. - IMGUI_API bool IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max); // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side. - IMGUI_API double GetTime(); // get global imgui time. incremented by io.DeltaTime every frame. - IMGUI_API int GetFrameCount(); // get global imgui frame count. incremented by 1 every frame. - IMGUI_API ImDrawListSharedData* GetDrawListSharedData(); // you may use this when creating your own ImDrawList instances. - IMGUI_API const char* GetStyleColorName(ImGuiCol idx); // get a string corresponding to the enum value (for display, saving, etc.). - IMGUI_API void SetStateStorage(ImGuiStorage* storage); // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it) - IMGUI_API ImGuiStorage* GetStateStorage(); - IMGUI_API bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame - IMGUI_API void EndChildFrame(); // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window) - - // Text Utilities - IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); - - // Color Utilities - IMGUI_API ImVec4 ColorConvertU32ToFloat4(ImU32 in); - IMGUI_API ImU32 ColorConvertFloat4ToU32(const ImVec4& in); - IMGUI_API void ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v); - IMGUI_API void ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b); - - // Inputs Utilities: Keyboard - // Without IMGUI_DISABLE_OBSOLETE_KEYIO: (legacy support) - // - For 'ImGuiKey key' you can still use your legacy native/user indices according to how your backend/engine stored them in io.KeysDown[]. - // With IMGUI_DISABLE_OBSOLETE_KEYIO: (this is the way forward) - // - Any use of 'ImGuiKey' will assert when key < 512 will be passed, previously reserved as native/user keys indices - // - GetKeyIndex() is pass-through and therefore deprecated (gone if IMGUI_DISABLE_OBSOLETE_KEYIO is defined) - IMGUI_API bool IsKeyDown(ImGuiKey key); // is key being held. - IMGUI_API bool IsKeyPressed(ImGuiKey key, bool repeat = true); // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate - IMGUI_API bool IsKeyReleased(ImGuiKey key); // was key released (went from Down to !Down)? - IMGUI_API int GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate - IMGUI_API const char* GetKeyName(ImGuiKey key); // [DEBUG] returns English name of the key. Those names a provided for debugging purpose and are not meant to be saved persistently not compared. - IMGUI_API void SetNextFrameWantCaptureKeyboard(bool want_capture_keyboard); // Override io.WantCaptureKeyboard flag next frame (said flag is left for your application to handle, typically when true it instructs your app to ignore inputs). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard"; after the next NewFrame() call. - - // Inputs Utilities: Mouse - // - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right. - // - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle. - // - Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold') - IMGUI_API bool IsMouseDown(ImGuiMouseButton button); // is mouse button held? - IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, bool repeat = false); // did mouse button clicked? (went from !Down to Down). Same as GetMouseClickedCount() == 1. - IMGUI_API bool IsMouseReleased(ImGuiMouseButton button); // did mouse button released? (went from Down to !Down) - IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button); // did mouse button double-clicked? Same as GetMouseClickedCount() == 2. (note that a double-click will also report IsMouseClicked() == true) - IMGUI_API int GetMouseClickedCount(ImGuiMouseButton button); // return the number of successive mouse-clicks at the time where a click happen (otherwise 0). - IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);// is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block. - IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); // by convention we use (-FLT_MAX,-FLT_MAX) to denote that there is no mouse available - IMGUI_API bool IsAnyMouseDown(); // [WILL OBSOLETE] is any mouse button held? This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid. - IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls - IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves) - IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) - IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) - IMGUI_API void ResetMouseDragDelta(ImGuiMouseButton button = 0); // - IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you - IMGUI_API void SetMouseCursor(ImGuiMouseCursor cursor_type); // set desired cursor type - IMGUI_API void SetNextFrameWantCaptureMouse(bool want_capture_mouse); // Override io.WantCaptureMouse flag next frame (said flag is left for your application to handle, typical when true it instucts your app to ignore inputs). This is equivalent to setting "io.WantCaptureMouse = want_capture_mouse;" after the next NewFrame() call. - - // Clipboard Utilities - // - Also see the LogToClipboard() function to capture GUI into clipboard, or easily output text data to the clipboard. - IMGUI_API const char* GetClipboardText(); - IMGUI_API void SetClipboardText(const char* text); - - // Settings/.Ini Utilities - // - The disk functions are automatically called if io.IniFilename != NULL (default is "imgui.ini"). - // - Set io.IniFilename to NULL to load/save manually. Read io.WantSaveIniSettings description about handling .ini saving manually. - // - Important: default value "imgui.ini" is relative to current working dir! Most apps will want to lock this to an absolute path (e.g. same path as executables). - IMGUI_API void LoadIniSettingsFromDisk(const char* ini_filename); // call after CreateContext() and before the first call to NewFrame(). NewFrame() automatically calls LoadIniSettingsFromDisk(io.IniFilename). - IMGUI_API void LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size=0); // call after CreateContext() and before the first call to NewFrame() to provide .ini data from your own data source. - IMGUI_API void SaveIniSettingsToDisk(const char* ini_filename); // this is automatically called (if io.IniFilename is not empty) a few seconds after any modification that should be reflected in the .ini file (and also by DestroyContext). - IMGUI_API const char* SaveIniSettingsToMemory(size_t* out_ini_size = NULL); // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings. - - // Debug Utilities - IMGUI_API void DebugTextEncoding(const char* text); - IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // This is called by IMGUI_CHECKVERSION() macro. - - // Memory Allocators - // - Those functions are not reliant on the current context. - // - DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() - // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. - IMGUI_API void SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data = NULL); - IMGUI_API void GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data); - IMGUI_API void* MemAlloc(size_t size); - IMGUI_API void MemFree(void* ptr); - -} // namespace ImGui - -//----------------------------------------------------------------------------- -// [SECTION] Flags & Enumerations -//----------------------------------------------------------------------------- - -// Flags for ImGui::Begin() -enum ImGuiWindowFlags_ -{ - ImGuiWindowFlags_None = 0, - ImGuiWindowFlags_NoTitleBar = 1 << 0, // Disable title-bar - ImGuiWindowFlags_NoResize = 1 << 1, // Disable user resizing with the lower-right grip - ImGuiWindowFlags_NoMove = 1 << 2, // Disable user moving the window - ImGuiWindowFlags_NoScrollbar = 1 << 3, // Disable scrollbars (window can still scroll with mouse or programmatically) - ImGuiWindowFlags_NoScrollWithMouse = 1 << 4, // Disable user vertically scrolling with mouse wheel. On child window, mouse wheel will be forwarded to the parent unless NoScrollbar is also set. - ImGuiWindowFlags_NoCollapse = 1 << 5, // Disable user collapsing window by double-clicking on it. Also referred to as Window Menu Button (e.g. within a docking node). - ImGuiWindowFlags_AlwaysAutoResize = 1 << 6, // Resize every window to its content every frame - ImGuiWindowFlags_NoBackground = 1 << 7, // Disable drawing background color (WindowBg, etc.) and outside border. Similar as using SetNextWindowBgAlpha(0.0f). - ImGuiWindowFlags_NoSavedSettings = 1 << 8, // Never load/save settings in .ini file - ImGuiWindowFlags_NoMouseInputs = 1 << 9, // Disable catching mouse, hovering test with pass through. - ImGuiWindowFlags_MenuBar = 1 << 10, // Has a menu-bar - ImGuiWindowFlags_HorizontalScrollbar = 1 << 11, // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section. - ImGuiWindowFlags_NoFocusOnAppearing = 1 << 12, // Disable taking focus when transitioning from hidden to visible state - ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programmatically giving it focus) - ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y) - ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x) - ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient) - ImGuiWindowFlags_NoNavInputs = 1 << 18, // No gamepad/keyboard navigation within the window - ImGuiWindowFlags_NoNavFocus = 1 << 19, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB) - ImGuiWindowFlags_UnsavedDocument = 1 << 20, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. - ImGuiWindowFlags_NoNav = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, - ImGuiWindowFlags_NoDecoration = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse, - ImGuiWindowFlags_NoInputs = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, - - // [Internal] - ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows. - ImGuiWindowFlags_ChildWindow = 1 << 24, // Don't use! For internal use by BeginChild() - ImGuiWindowFlags_Tooltip = 1 << 25, // Don't use! For internal use by BeginTooltip() - ImGuiWindowFlags_Popup = 1 << 26, // Don't use! For internal use by BeginPopup() - ImGuiWindowFlags_Modal = 1 << 27, // Don't use! For internal use by BeginPopupModal() - ImGuiWindowFlags_ChildMenu = 1 << 28, // Don't use! For internal use by BeginMenu() -}; - -// Flags for ImGui::InputText() -enum ImGuiInputTextFlags_ -{ - ImGuiInputTextFlags_None = 0, - ImGuiInputTextFlags_CharsDecimal = 1 << 0, // Allow 0123456789.+-*/ - ImGuiInputTextFlags_CharsHexadecimal = 1 << 1, // Allow 0123456789ABCDEFabcdef - ImGuiInputTextFlags_CharsUppercase = 1 << 2, // Turn a..z into A..Z - ImGuiInputTextFlags_CharsNoBlank = 1 << 3, // Filter out spaces, tabs - ImGuiInputTextFlags_AutoSelectAll = 1 << 4, // Select entire text when first taking mouse focus - ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function. - ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Callback on pressing TAB (for completion handling) - ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Callback on pressing Up/Down arrows (for history handling) - ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Callback on each iteration. User code may query cursor position, modify text buffer. - ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. - ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field - ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter). - ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally - ImGuiInputTextFlags_AlwaysOverwrite = 1 << 13, // Overwrite mode - ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode - ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*' - ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). - ImGuiInputTextFlags_CharsScientific = 1 << 17, // Allow 0123456789.+-*/eE (Scientific notation input) - ImGuiInputTextFlags_CallbackResize = 1 << 18, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) - ImGuiInputTextFlags_CallbackEdit = 1 << 19, // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) - - // Obsolete names (will be removed soon) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior -#endif -}; - -// Flags for ImGui::TreeNodeEx(), ImGui::CollapsingHeader*() -enum ImGuiTreeNodeFlags_ -{ - ImGuiTreeNodeFlags_None = 0, - ImGuiTreeNodeFlags_Selected = 1 << 0, // Draw as selected - ImGuiTreeNodeFlags_Framed = 1 << 1, // Draw frame with background (e.g. for CollapsingHeader) - ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one - ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3, // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack - ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4, // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes) - ImGuiTreeNodeFlags_DefaultOpen = 1 << 5, // Default node to be open - ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6, // Need double-click to open node - ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7, // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open. - ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes). - ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow - ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding(). - ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default. - ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (bypass the indented area). - ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop) - //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 14, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible - ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog, -}; - -// Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions. -// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat -// small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags. -// It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags. -// - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0. -// IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter -// and want to another another flag, you need to pass in the ImGuiPopupFlags_MouseButtonRight flag. -// - Multiple buttons currently cannot be combined/or-ed in those functions (we could allow it later). -enum ImGuiPopupFlags_ -{ - ImGuiPopupFlags_None = 0, - ImGuiPopupFlags_MouseButtonLeft = 0, // For BeginPopupContext*(): open on Left Mouse release. Guaranteed to always be == 0 (same as ImGuiMouseButton_Left) - ImGuiPopupFlags_MouseButtonRight = 1, // For BeginPopupContext*(): open on Right Mouse release. Guaranteed to always be == 1 (same as ImGuiMouseButton_Right) - ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle) - ImGuiPopupFlags_MouseButtonMask_ = 0x1F, - ImGuiPopupFlags_MouseButtonDefault_ = 1, - ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack - ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space - ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. - ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) - ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel, -}; - -// Flags for ImGui::Selectable() -enum ImGuiSelectableFlags_ -{ - ImGuiSelectableFlags_None = 0, - ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this don't close parent popup window - ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column) - ImGuiSelectableFlags_AllowDoubleClick = 1 << 2, // Generate press events on double clicks too - ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text - ImGuiSelectableFlags_AllowItemOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one -}; - -// Flags for ImGui::BeginCombo() -enum ImGuiComboFlags_ -{ - ImGuiComboFlags_None = 0, - ImGuiComboFlags_PopupAlignLeft = 1 << 0, // Align the popup toward the left by default - ImGuiComboFlags_HeightSmall = 1 << 1, // Max ~4 items visible. Tip: If you want your combo popup to be a specific size you can use SetNextWindowSizeConstraints() prior to calling BeginCombo() - ImGuiComboFlags_HeightRegular = 1 << 2, // Max ~8 items visible (default) - ImGuiComboFlags_HeightLarge = 1 << 3, // Max ~20 items visible - ImGuiComboFlags_HeightLargest = 1 << 4, // As many fitting items as possible - ImGuiComboFlags_NoArrowButton = 1 << 5, // Display on the preview box without the square arrow button - ImGuiComboFlags_NoPreview = 1 << 6, // Display only a square arrow button - ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest, -}; - -// Flags for ImGui::BeginTabBar() -enum ImGuiTabBarFlags_ -{ - ImGuiTabBarFlags_None = 0, - ImGuiTabBarFlags_Reorderable = 1 << 0, // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list - ImGuiTabBarFlags_AutoSelectNewTabs = 1 << 1, // Automatically select new tabs when they appear - ImGuiTabBarFlags_TabListPopupButton = 1 << 2, // Disable buttons to open the tab list popup - ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. - ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll) - ImGuiTabBarFlags_NoTooltip = 1 << 5, // Disable tooltips when hovering a tab - ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit - ImGuiTabBarFlags_FittingPolicyScroll = 1 << 7, // Add scroll buttons when tabs don't fit - ImGuiTabBarFlags_FittingPolicyMask_ = ImGuiTabBarFlags_FittingPolicyResizeDown | ImGuiTabBarFlags_FittingPolicyScroll, - ImGuiTabBarFlags_FittingPolicyDefault_ = ImGuiTabBarFlags_FittingPolicyResizeDown, -}; - -// Flags for ImGui::BeginTabItem() -enum ImGuiTabItemFlags_ -{ - ImGuiTabItemFlags_None = 0, - ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. - ImGuiTabItemFlags_SetSelected = 1 << 1, // Trigger flag to programmatically make the tab selected when calling BeginTabItem() - ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. - ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem() - ImGuiTabItemFlags_NoTooltip = 1 << 4, // Disable tooltip for the given tab - ImGuiTabItemFlags_NoReorder = 1 << 5, // Disable reordering this tab or having another tab cross over this tab - ImGuiTabItemFlags_Leading = 1 << 6, // Enforce the tab position to the left of the tab bar (after the tab list popup button) - ImGuiTabItemFlags_Trailing = 1 << 7, // Enforce the tab position to the right of the tab bar (before the scrolling buttons) -}; - -// Flags for ImGui::BeginTable() -// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect. -// Read comments/demos carefully + experiment with live demos to get acquainted with them. -// - The DEFAULT sizing policies are: -// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize. -// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off. -// - When ScrollX is off: -// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight. -// - Columns sizing policy allowed: Stretch (default), Fixed/Auto. -// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all). -// - Stretch Columns will share the remaining width according to their respective weight. -// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors. -// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. -// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). -// - When ScrollX is on: -// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed -// - Columns sizing policy allowed: Fixed/Auto mostly. -// - Fixed Columns can be enlarged as needed. Table will show an horizontal scrollbar if needed. -// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop. -// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). -// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. -// - Read on documentation at the top of imgui_tables.cpp for details. -enum ImGuiTableFlags_ -{ - // Features - ImGuiTableFlags_None = 0, - ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns. - ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers) - ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu. - ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate. - ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file. - ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow(). - // Decorations - ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually) - ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows. - ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom. - ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns. - ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides. - ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders. - ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders. - ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders. - ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders. - ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders. - ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appears in Headers). -> May move to style - ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers). -> May move to style - // Sizing Policy (read above for defaults) - ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width. - ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible. - ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths. - ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn(). - // Sizing Extra Options - ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. - ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. - ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable. - ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. - // Clipping - ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze(). - // Padding - ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outer-most padding. Generally desirable if you have headers. - ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outer-most padding. - ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off). - // Scrolling - ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this create a child window, ScrollY is currently generally recommended when using ScrollX. - ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. - // Sorting - ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). - ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). - - // [Internal] Combinations and masks - ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame, - - // Obsolete names (will be removed soon) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - //, ImGuiTableFlags_ColumnsWidthFixed = ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_ColumnsWidthStretch = ImGuiTableFlags_SizingStretchSame // WIP Tables 2020/12 - //, ImGuiTableFlags_SizingPolicyFixed = ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingPolicyStretch = ImGuiTableFlags_SizingStretchSame // WIP Tables 2021/01 -#endif -}; - -// Flags for ImGui::TableSetupColumn() -enum ImGuiTableColumnFlags_ -{ - // Input configuration flags - ImGuiTableColumnFlags_None = 0, - ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state) - ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column. - ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column. - ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp). - ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable). - ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing. - ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column. - ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column. - ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command). - ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). - ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction. - ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction. - ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will not submit label for this column. Convenient for some small columns. Name will still appear in context menu. - ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width. - ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default). - ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column. - ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0). - ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored. - - // Output status flags, read-only via TableGetColumnFlags() - ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags. - ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling. - ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs - ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse - - // [Internal] Combinations and masks - ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed, - ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable, - ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered, - ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30, // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) - - // Obsolete names (will be removed soon) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - //ImGuiTableColumnFlags_WidthAuto = ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoResize, // Column will not stretch and keep resizing based on submitted contents. -#endif -}; - -// Flags for ImGui::TableNextRow() -enum ImGuiTableRowFlags_ -{ - ImGuiTableRowFlags_None = 0, - ImGuiTableRowFlags_Headers = 1 << 0, // Identify header row (set default background color + width of its contents accounted differently for auto column width) -}; - -// Enum for ImGui::TableSetBgColor() -// Background colors are rendering in 3 layers: -// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set. -// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set. -// - Layer 2: draw with CellBg color if set. -// The purpose of the two row/columns layers is to let you decide if a background color changes should override or blend with the existing color. -// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows. -// If you set the color of RowBg0 target, your color will override the existing RowBg0 color. -// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color. -enum ImGuiTableBgTarget_ -{ - ImGuiTableBgTarget_None = 0, - ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used) - ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking) - ImGuiTableBgTarget_CellBg = 3, // Set cell background color (top-most color) -}; - -// Flags for ImGui::IsWindowFocused() -enum ImGuiFocusedFlags_ -{ - ImGuiFocusedFlags_None = 0, - ImGuiFocusedFlags_ChildWindows = 1 << 0, // Return true if any children of the window is focused - ImGuiFocusedFlags_RootWindow = 1 << 1, // Test from root window (top most parent of the current hierarchy) - ImGuiFocusedFlags_AnyWindow = 1 << 2, // Return true if any window is focused. Important: If you are trying to tell how to dispatch your low-level inputs, do NOT use this. Use 'io.WantCaptureMouse' instead! Please read the FAQ! - ImGuiFocusedFlags_NoPopupHierarchy = 1 << 3, // Do not consider popup hierarchy (do not treat popup emitter as parent of popup) (when used with _ChildWindows or _RootWindow) - //ImGuiFocusedFlags_DockHierarchy = 1 << 4, // Consider docking hierarchy (treat dockspace host as parent of docked window) (when used with _ChildWindows or _RootWindow) - ImGuiFocusedFlags_RootAndChildWindows = ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows, -}; - -// Flags for ImGui::IsItemHovered(), ImGui::IsWindowHovered() -// Note: if you are trying to check whether your mouse should be dispatched to Dear ImGui or to your app, you should use 'io.WantCaptureMouse' instead! Please read the FAQ! -// Note: windows with the ImGuiWindowFlags_NoInputs flag are ignored by IsWindowHovered() calls. -enum ImGuiHoveredFlags_ -{ - ImGuiHoveredFlags_None = 0, // Return true if directly over the item/window, not obstructed by another window, not obstructed by an active popup or modal blocking inputs under them. - ImGuiHoveredFlags_ChildWindows = 1 << 0, // IsWindowHovered() only: Return true if any children of the window is hovered - ImGuiHoveredFlags_RootWindow = 1 << 1, // IsWindowHovered() only: Test from root window (top most parent of the current hierarchy) - ImGuiHoveredFlags_AnyWindow = 1 << 2, // IsWindowHovered() only: Return true if any window is hovered - ImGuiHoveredFlags_NoPopupHierarchy = 1 << 3, // IsWindowHovered() only: Do not consider popup hierarchy (do not treat popup emitter as parent of popup) (when used with _ChildWindows or _RootWindow) - //ImGuiHoveredFlags_DockHierarchy = 1 << 4, // IsWindowHovered() only: Consider docking hierarchy (treat dockspace host as parent of docked window) (when used with _ChildWindows or _RootWindow) - ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 5, // Return true even if a popup window is normally blocking access to this item/window - //ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 6, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet. - ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 7, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns. - ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 8, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window - ImGuiHoveredFlags_AllowWhenDisabled = 1 << 9, // IsItemHovered() only: Return true even if the item is disabled - ImGuiHoveredFlags_NoNavOverride = 1 << 10, // Disable using gamepad/keyboard navigation state when active, always query mouse. - ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped, - ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows, -}; - -// Flags for ImGui::BeginDragDropSource(), ImGui::AcceptDragDropPayload() -enum ImGuiDragDropFlags_ -{ - ImGuiDragDropFlags_None = 0, - // BeginDragDropSource() flags - ImGuiDragDropFlags_SourceNoPreviewTooltip = 1 << 0, // By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disable this behavior. - ImGuiDragDropFlags_SourceNoDisableHover = 1 << 1, // By default, when dragging we clear data so that IsItemHovered() will return false, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item. - ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item. - ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit. - ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously. - ImGuiDragDropFlags_SourceAutoExpirePayload = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged) - // AcceptDragDropPayload() flags - ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered. - ImGuiDragDropFlags_AcceptNoDrawDefaultRect = 1 << 11, // Do not draw the default highlight rectangle when hovering over target. - ImGuiDragDropFlags_AcceptNoPreviewTooltip = 1 << 12, // Request hiding the BeginDragDropSource tooltip from the BeginDragDropTarget site. - ImGuiDragDropFlags_AcceptPeekOnly = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect, // For peeking ahead and inspecting the payload before delivery. -}; - -// Standard Drag and Drop payload types. You can define you own payload types using short strings. Types starting with '_' are defined by Dear ImGui. -#define IMGUI_PAYLOAD_TYPE_COLOR_3F "_COL3F" // float[3]: Standard type for colors, without alpha. User code may use this type. -#define IMGUI_PAYLOAD_TYPE_COLOR_4F "_COL4F" // float[4]: Standard type for colors. User code may use this type. - -// A primary data type -enum ImGuiDataType_ -{ - ImGuiDataType_S8, // signed char / char (with sensible compilers) - ImGuiDataType_U8, // unsigned char - ImGuiDataType_S16, // short - ImGuiDataType_U16, // unsigned short - ImGuiDataType_S32, // int - ImGuiDataType_U32, // unsigned int - ImGuiDataType_S64, // long long / __int64 - ImGuiDataType_U64, // unsigned long long / unsigned __int64 - ImGuiDataType_Float, // float - ImGuiDataType_Double, // double - ImGuiDataType_COUNT -}; - -// A cardinal direction -enum ImGuiDir_ -{ - ImGuiDir_None = -1, - ImGuiDir_Left = 0, - ImGuiDir_Right = 1, - ImGuiDir_Up = 2, - ImGuiDir_Down = 3, - ImGuiDir_COUNT -}; - -// A sorting direction -enum ImGuiSortDirection_ -{ - ImGuiSortDirection_None = 0, - ImGuiSortDirection_Ascending = 1, // Ascending = 0->9, A->Z etc. - ImGuiSortDirection_Descending = 2 // Descending = 9->0, Z->A etc. -}; - -// Keys value 0 to 511 are left unused as legacy native/opaque key values (< 1.87) -// Keys value >= 512 are named keys (>= 1.87) -enum ImGuiKey_ -{ - // Keyboard - ImGuiKey_None = 0, - ImGuiKey_Tab = 512, // == ImGuiKey_NamedKey_BEGIN - ImGuiKey_LeftArrow, - ImGuiKey_RightArrow, - ImGuiKey_UpArrow, - ImGuiKey_DownArrow, - ImGuiKey_PageUp, - ImGuiKey_PageDown, - ImGuiKey_Home, - ImGuiKey_End, - ImGuiKey_Insert, - ImGuiKey_Delete, - ImGuiKey_Backspace, - ImGuiKey_Space, - ImGuiKey_Enter, - ImGuiKey_Escape, - ImGuiKey_LeftCtrl, ImGuiKey_LeftShift, ImGuiKey_LeftAlt, ImGuiKey_LeftSuper, - ImGuiKey_RightCtrl, ImGuiKey_RightShift, ImGuiKey_RightAlt, ImGuiKey_RightSuper, - ImGuiKey_Menu, - ImGuiKey_0, ImGuiKey_1, ImGuiKey_2, ImGuiKey_3, ImGuiKey_4, ImGuiKey_5, ImGuiKey_6, ImGuiKey_7, ImGuiKey_8, ImGuiKey_9, - ImGuiKey_A, ImGuiKey_B, ImGuiKey_C, ImGuiKey_D, ImGuiKey_E, ImGuiKey_F, ImGuiKey_G, ImGuiKey_H, ImGuiKey_I, ImGuiKey_J, - ImGuiKey_K, ImGuiKey_L, ImGuiKey_M, ImGuiKey_N, ImGuiKey_O, ImGuiKey_P, ImGuiKey_Q, ImGuiKey_R, ImGuiKey_S, ImGuiKey_T, - ImGuiKey_U, ImGuiKey_V, ImGuiKey_W, ImGuiKey_X, ImGuiKey_Y, ImGuiKey_Z, - ImGuiKey_F1, ImGuiKey_F2, ImGuiKey_F3, ImGuiKey_F4, ImGuiKey_F5, ImGuiKey_F6, - ImGuiKey_F7, ImGuiKey_F8, ImGuiKey_F9, ImGuiKey_F10, ImGuiKey_F11, ImGuiKey_F12, - ImGuiKey_Apostrophe, // ' - ImGuiKey_Comma, // , - ImGuiKey_Minus, // - - ImGuiKey_Period, // . - ImGuiKey_Slash, // / - ImGuiKey_Semicolon, // ; - ImGuiKey_Equal, // = - ImGuiKey_LeftBracket, // [ - ImGuiKey_Backslash, // \ (this text inhibit multiline comment caused by backslash) - ImGuiKey_RightBracket, // ] - ImGuiKey_GraveAccent, // ` - ImGuiKey_CapsLock, - ImGuiKey_ScrollLock, - ImGuiKey_NumLock, - ImGuiKey_PrintScreen, - ImGuiKey_Pause, - ImGuiKey_Keypad0, ImGuiKey_Keypad1, ImGuiKey_Keypad2, ImGuiKey_Keypad3, ImGuiKey_Keypad4, - ImGuiKey_Keypad5, ImGuiKey_Keypad6, ImGuiKey_Keypad7, ImGuiKey_Keypad8, ImGuiKey_Keypad9, - ImGuiKey_KeypadDecimal, - ImGuiKey_KeypadDivide, - ImGuiKey_KeypadMultiply, - ImGuiKey_KeypadSubtract, - ImGuiKey_KeypadAdd, - ImGuiKey_KeypadEnter, - ImGuiKey_KeypadEqual, - - // Gamepad (some of those are analog values, 0.0f to 1.0f) // GAME NAVIGATION ACTION - // (download controller mapping PNG/PSD at http://dearimgui.org/controls_sheets) - ImGuiKey_GamepadStart, // Menu (Xbox) + (Switch) Start/Options (PS) - ImGuiKey_GamepadBack, // View (Xbox) - (Switch) Share (PS) - ImGuiKey_GamepadFaceLeft, // X (Xbox) Y (Switch) Square (PS) // Tap: Toggle Menu. Hold: Windowing mode (Focus/Move/Resize windows) - ImGuiKey_GamepadFaceRight, // B (Xbox) A (Switch) Circle (PS) // Cancel / Close / Exit - ImGuiKey_GamepadFaceUp, // Y (Xbox) X (Switch) Triangle (PS) // Text Input / On-screen Keyboard - ImGuiKey_GamepadFaceDown, // A (Xbox) B (Switch) Cross (PS) // Activate / Open / Toggle / Tweak - ImGuiKey_GamepadDpadLeft, // D-pad Left // Move / Tweak / Resize Window (in Windowing mode) - ImGuiKey_GamepadDpadRight, // D-pad Right // Move / Tweak / Resize Window (in Windowing mode) - ImGuiKey_GamepadDpadUp, // D-pad Up // Move / Tweak / Resize Window (in Windowing mode) - ImGuiKey_GamepadDpadDown, // D-pad Down // Move / Tweak / Resize Window (in Windowing mode) - ImGuiKey_GamepadL1, // L Bumper (Xbox) L (Switch) L1 (PS) // Tweak Slower / Focus Previous (in Windowing mode) - ImGuiKey_GamepadR1, // R Bumper (Xbox) R (Switch) R1 (PS) // Tweak Faster / Focus Next (in Windowing mode) - ImGuiKey_GamepadL2, // L Trig. (Xbox) ZL (Switch) L2 (PS) [Analog] - ImGuiKey_GamepadR2, // R Trig. (Xbox) ZR (Switch) R2 (PS) [Analog] - ImGuiKey_GamepadL3, // L Stick (Xbox) L3 (Switch) L3 (PS) - ImGuiKey_GamepadR3, // R Stick (Xbox) R3 (Switch) R3 (PS) - ImGuiKey_GamepadLStickLeft, // [Analog] // Move Window (in Windowing mode) - ImGuiKey_GamepadLStickRight, // [Analog] // Move Window (in Windowing mode) - ImGuiKey_GamepadLStickUp, // [Analog] // Move Window (in Windowing mode) - ImGuiKey_GamepadLStickDown, // [Analog] // Move Window (in Windowing mode) - ImGuiKey_GamepadRStickLeft, // [Analog] - ImGuiKey_GamepadRStickRight, // [Analog] - ImGuiKey_GamepadRStickUp, // [Analog] - ImGuiKey_GamepadRStickDown, // [Analog] - - // Keyboard Modifiers (explicitly submitted by backend via AddKeyEvent() calls) - // - This is mirroring the data also written to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper, in a format allowing - // them to be accessed via standard key API, allowing calls such as IsKeyPressed(), IsKeyReleased(), querying duration etc. - // - Code polling every keys (e.g. an interface to detect a key press for input mapping) might want to ignore those - // and prefer using the real keys (e.g. ImGuiKey_LeftCtrl, ImGuiKey_RightCtrl instead of ImGuiKey_ModCtrl). - // - In theory the value of keyboard modifiers should be roughly equivalent to a logical or of the equivalent left/right keys. - // In practice: it's complicated; mods are often provided from different sources. Keyboard layout, IME, sticky keys and - // backends tend to interfere and break that equivalence. The safer decision is to relay that ambiguity down to the end-user... - ImGuiKey_ModCtrl, ImGuiKey_ModShift, ImGuiKey_ModAlt, ImGuiKey_ModSuper, - - // Mouse Buttons (auto-submitted from AddMouseButtonEvent() calls) - // - This is mirroring the data also written to io.MouseDown[], io.MouseWheel, in a format allowing them to be accessed via standard key API. - ImGuiKey_MouseLeft, ImGuiKey_MouseRight, ImGuiKey_MouseMiddle, ImGuiKey_MouseX1, ImGuiKey_MouseX2, ImGuiKey_MouseWheelX, ImGuiKey_MouseWheelY, - - // End of list - ImGuiKey_COUNT, // No valid ImGuiKey is ever greater than this value - - // [Internal] Prior to 1.87 we required user to fill io.KeysDown[512] using their own native index + a io.KeyMap[] array. - // We are ditching this method but keeping a legacy path for user code doing e.g. IsKeyPressed(MY_NATIVE_KEY_CODE) - ImGuiKey_NamedKey_BEGIN = 512, - ImGuiKey_NamedKey_END = ImGuiKey_COUNT, - ImGuiKey_NamedKey_COUNT = ImGuiKey_NamedKey_END - ImGuiKey_NamedKey_BEGIN, -#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO - ImGuiKey_KeysData_SIZE = ImGuiKey_NamedKey_COUNT, // Size of KeysData[]: only hold named keys - ImGuiKey_KeysData_OFFSET = ImGuiKey_NamedKey_BEGIN, // First key stored in io.KeysData[0]. Accesses to io.KeysData[] must use (key - ImGuiKey_KeysData_OFFSET). -#else - ImGuiKey_KeysData_SIZE = ImGuiKey_COUNT, // Size of KeysData[]: hold legacy 0..512 keycodes + named keys - ImGuiKey_KeysData_OFFSET = 0, // First key stored in io.KeysData[0]. Accesses to io.KeysData[] must use (key - ImGuiKey_KeysData_OFFSET). -#endif - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter, // Renamed in 1.87 -#endif -}; - -// Helper "flags" version of key-mods to store and compare multiple key-mods easily. Sometimes used for storage (e.g. io.KeyMods) but otherwise not much used in public API. -enum ImGuiModFlags_ -{ - ImGuiModFlags_None = 0, - ImGuiModFlags_Ctrl = 1 << 0, - ImGuiModFlags_Shift = 1 << 1, - ImGuiModFlags_Alt = 1 << 2, // Option/Menu key - ImGuiModFlags_Super = 1 << 3, // Cmd/Super/Windows key - ImGuiModFlags_All = 0x0F -}; - -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO -// OBSOLETED in 1.88 (from July 2022): ImGuiNavInput and io.NavInputs[]. -// Official backends between 1.60 and 1.86: will keep working and feed gamepad inputs as long as IMGUI_DISABLE_OBSOLETE_KEYIO is not set. -// Custom backends: feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums. -enum ImGuiNavInput -{ - ImGuiNavInput_Activate, ImGuiNavInput_Cancel, ImGuiNavInput_Input, ImGuiNavInput_Menu, ImGuiNavInput_DpadLeft, ImGuiNavInput_DpadRight, ImGuiNavInput_DpadUp, ImGuiNavInput_DpadDown, - ImGuiNavInput_LStickLeft, ImGuiNavInput_LStickRight, ImGuiNavInput_LStickUp, ImGuiNavInput_LStickDown, ImGuiNavInput_FocusPrev, ImGuiNavInput_FocusNext, ImGuiNavInput_TweakSlow, ImGuiNavInput_TweakFast, - ImGuiNavInput_COUNT, -}; -#endif - -// Configuration flags stored in io.ConfigFlags. Set by user/application. -enum ImGuiConfigFlags_ -{ - ImGuiConfigFlags_None = 0, - ImGuiConfigFlags_NavEnableKeyboard = 1 << 0, // Master keyboard navigation enable flag. - ImGuiConfigFlags_NavEnableGamepad = 1 << 1, // Master gamepad navigation enable flag. Backend also needs to set ImGuiBackendFlags_HasGamepad. - ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2, // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your backend, otherwise ImGui will react as if the mouse is jumping around back and forth. - ImGuiConfigFlags_NavNoCaptureKeyboard = 1 << 3, // Instruct navigation to not set the io.WantCaptureKeyboard flag when io.NavActive is set. - ImGuiConfigFlags_NoMouse = 1 << 4, // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information set by the backend. - ImGuiConfigFlags_NoMouseCursorChange = 1 << 5, // Instruct backend to not alter mouse cursor shape and visibility. Use if the backend cursor changes are interfering with yours and you don't want to use SetMouseCursor() to change mouse cursor. You may want to honor requests from imgui by reading GetMouseCursor() yourself instead. - - // User storage (to allow your backend/engine to communicate to code that may be shared between multiple projects. Those flags are NOT used by core Dear ImGui) - ImGuiConfigFlags_IsSRGB = 1 << 20, // Application is SRGB-aware. - ImGuiConfigFlags_IsTouchScreen = 1 << 21, // Application is using a touch screen instead of a mouse. -}; - -// Backend capabilities flags stored in io.BackendFlags. Set by imgui_impl_xxx or custom backend. -enum ImGuiBackendFlags_ -{ - ImGuiBackendFlags_None = 0, - ImGuiBackendFlags_HasGamepad = 1 << 0, // Backend Platform supports gamepad and currently has one connected. - ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Backend Platform supports honoring GetMouseCursor() value to change the OS cursor shape. - ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Backend Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set). - ImGuiBackendFlags_RendererHasVtxOffset = 1 << 3, // Backend Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices. -}; - -// Enumeration for PushStyleColor() / PopStyleColor() -enum ImGuiCol_ -{ - ImGuiCol_Text, - ImGuiCol_TextDisabled, - ImGuiCol_WindowBg, // Background of normal windows - ImGuiCol_ChildBg, // Background of child windows - ImGuiCol_PopupBg, // Background of popups, menus, tooltips windows - ImGuiCol_Border, - ImGuiCol_BorderShadow, - ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input - ImGuiCol_FrameBgHovered, - ImGuiCol_FrameBgActive, - ImGuiCol_TitleBg, - ImGuiCol_TitleBgActive, - ImGuiCol_TitleBgCollapsed, - ImGuiCol_MenuBarBg, - ImGuiCol_ScrollbarBg, - ImGuiCol_ScrollbarGrab, - ImGuiCol_ScrollbarGrabHovered, - ImGuiCol_ScrollbarGrabActive, - ImGuiCol_CheckMark, - ImGuiCol_SliderGrab, - ImGuiCol_SliderGrabActive, - ImGuiCol_Button, - ImGuiCol_ButtonHovered, - ImGuiCol_ButtonActive, - ImGuiCol_Header, // Header* colors are used for CollapsingHeader, TreeNode, Selectable, MenuItem - ImGuiCol_HeaderHovered, - ImGuiCol_HeaderActive, - ImGuiCol_Separator, - ImGuiCol_SeparatorHovered, - ImGuiCol_SeparatorActive, - ImGuiCol_ResizeGrip, // Resize grip in lower-right and lower-left corners of windows. - ImGuiCol_ResizeGripHovered, - ImGuiCol_ResizeGripActive, - ImGuiCol_Tab, // TabItem in a TabBar - ImGuiCol_TabHovered, - ImGuiCol_TabActive, - ImGuiCol_TabUnfocused, - ImGuiCol_TabUnfocusedActive, - ImGuiCol_PlotLines, - ImGuiCol_PlotLinesHovered, - ImGuiCol_PlotHistogram, - ImGuiCol_PlotHistogramHovered, - ImGuiCol_TableHeaderBg, // Table header background - ImGuiCol_TableBorderStrong, // Table outer and header borders (prefer using Alpha=1.0 here) - ImGuiCol_TableBorderLight, // Table inner borders (prefer using Alpha=1.0 here) - ImGuiCol_TableRowBg, // Table row background (even rows) - ImGuiCol_TableRowBgAlt, // Table row background (odd rows) - ImGuiCol_TextSelectedBg, - ImGuiCol_DragDropTarget, // Rectangle highlighting a drop target - ImGuiCol_NavHighlight, // Gamepad/keyboard: current highlighted item - ImGuiCol_NavWindowingHighlight, // Highlight window when using CTRL+TAB - ImGuiCol_NavWindowingDimBg, // Darken/colorize entire screen behind the CTRL+TAB window list, when active - ImGuiCol_ModalWindowDimBg, // Darken/colorize entire screen behind a modal window, when one is active - ImGuiCol_COUNT -}; - -// Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure. -// - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. -// During initialization or between frames, feel free to just poke into ImGuiStyle directly. -// - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description. -// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. -// - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. -enum ImGuiStyleVar_ -{ - // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) - ImGuiStyleVar_Alpha, // float Alpha - ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha - ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding - ImGuiStyleVar_WindowRounding, // float WindowRounding - ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize - ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize - ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign - ImGuiStyleVar_ChildRounding, // float ChildRounding - ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize - ImGuiStyleVar_PopupRounding, // float PopupRounding - ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize - ImGuiStyleVar_FramePadding, // ImVec2 FramePadding - ImGuiStyleVar_FrameRounding, // float FrameRounding - ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize - ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing - ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing - ImGuiStyleVar_IndentSpacing, // float IndentSpacing - ImGuiStyleVar_CellPadding, // ImVec2 CellPadding - ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize - ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding - ImGuiStyleVar_GrabMinSize, // float GrabMinSize - ImGuiStyleVar_GrabRounding, // float GrabRounding - ImGuiStyleVar_TabRounding, // float TabRounding - ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign - ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign - ImGuiStyleVar_COUNT -}; - -// Flags for InvisibleButton() [extended in imgui_internal.h] -enum ImGuiButtonFlags_ -{ - ImGuiButtonFlags_None = 0, - ImGuiButtonFlags_MouseButtonLeft = 1 << 0, // React on left mouse button (default) - ImGuiButtonFlags_MouseButtonRight = 1 << 1, // React on right mouse button - ImGuiButtonFlags_MouseButtonMiddle = 1 << 2, // React on center mouse button - - // [Internal] - ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle, - ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft, -}; - -// Flags for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton() -enum ImGuiColorEditFlags_ -{ - ImGuiColorEditFlags_None = 0, - ImGuiColorEditFlags_NoAlpha = 1 << 1, // // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (will only read 3 components from the input pointer). - ImGuiColorEditFlags_NoPicker = 1 << 2, // // ColorEdit: disable picker when clicking on color square. - ImGuiColorEditFlags_NoOptions = 1 << 3, // // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview. - ImGuiColorEditFlags_NoSmallPreview = 1 << 4, // // ColorEdit, ColorPicker: disable color square preview next to the inputs. (e.g. to show only the inputs) - ImGuiColorEditFlags_NoInputs = 1 << 5, // // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview color square). - ImGuiColorEditFlags_NoTooltip = 1 << 6, // // ColorEdit, ColorPicker, ColorButton: disable tooltip when hovering the preview. - ImGuiColorEditFlags_NoLabel = 1 << 7, // // ColorEdit, ColorPicker: disable display of inline text label (the label is still forwarded to the tooltip and picker). - ImGuiColorEditFlags_NoSidePreview = 1 << 8, // // ColorPicker: disable bigger color preview on right side of the picker, use small color square preview instead. - ImGuiColorEditFlags_NoDragDrop = 1 << 9, // // ColorEdit: disable drag and drop target. ColorButton: disable drag and drop source. - ImGuiColorEditFlags_NoBorder = 1 << 10, // // ColorButton: disable border (which is enforced by default) - - // User Options (right-click on widget to change some of them). - ImGuiColorEditFlags_AlphaBar = 1 << 16, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker. - ImGuiColorEditFlags_AlphaPreview = 1 << 17, // // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque. - ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 18, // // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque. - ImGuiColorEditFlags_HDR = 1 << 19, // // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well). - ImGuiColorEditFlags_DisplayRGB = 1 << 20, // [Display] // ColorEdit: override _display_ type among RGB/HSV/Hex. ColorPicker: select any combination using one or more of RGB/HSV/Hex. - ImGuiColorEditFlags_DisplayHSV = 1 << 21, // [Display] // " - ImGuiColorEditFlags_DisplayHex = 1 << 22, // [Display] // " - ImGuiColorEditFlags_Uint8 = 1 << 23, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0..255. - ImGuiColorEditFlags_Float = 1 << 24, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0.0f..1.0f floats instead of 0..255 integers. No round-trip of value via integers. - ImGuiColorEditFlags_PickerHueBar = 1 << 25, // [Picker] // ColorPicker: bar for Hue, rectangle for Sat/Value. - ImGuiColorEditFlags_PickerHueWheel = 1 << 26, // [Picker] // ColorPicker: wheel for Hue, triangle for Sat/Value. - ImGuiColorEditFlags_InputRGB = 1 << 27, // [Input] // ColorEdit, ColorPicker: input and output data in RGB format. - ImGuiColorEditFlags_InputHSV = 1 << 28, // [Input] // ColorEdit, ColorPicker: input and output data in HSV format. - - // Defaults Options. You can set application defaults using SetColorEditOptions(). The intent is that you probably don't want to - // override them in most of your calls. Let the user choose via the option menu and/or call SetColorEditOptions() once during startup. - ImGuiColorEditFlags_DefaultOptions_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_PickerHueBar, - - // [Internal] Masks - ImGuiColorEditFlags_DisplayMask_ = ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_DisplayHex, - ImGuiColorEditFlags_DataTypeMask_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float, - ImGuiColorEditFlags_PickerMask_ = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar, - ImGuiColorEditFlags_InputMask_ = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_InputHSV, - - // Obsolete names (will be removed) - // ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex // [renamed in 1.69] -}; - -// Flags for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. -// We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them. -enum ImGuiSliderFlags_ -{ - ImGuiSliderFlags_None = 0, - ImGuiSliderFlags_AlwaysClamp = 1 << 4, // Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds. - ImGuiSliderFlags_Logarithmic = 1 << 5, // Make the widget logarithmic (linear otherwise). Consider using ImGuiSliderFlags_NoRoundToFormat with this if using a format-string with small amount of digits. - ImGuiSliderFlags_NoRoundToFormat = 1 << 6, // Disable rounding underlying value to match precision of the display format string (e.g. %.3f values are rounded to those 3 digits) - ImGuiSliderFlags_NoInput = 1 << 7, // Disable CTRL+Click or Enter key allowing to input text directly into the widget - ImGuiSliderFlags_InvalidMask_ = 0x7000000F, // [Internal] We treat using those bits as being potentially a 'float power' argument from the previous API that has got miscast to this enum, and will trigger an assert if needed. - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - ImGuiSliderFlags_ClampOnInput = ImGuiSliderFlags_AlwaysClamp, // [renamed in 1.79] -#endif -}; - -// Identify a mouse button. -// Those values are guaranteed to be stable and we frequently use 0/1 directly. Named enums provided for convenience. -enum ImGuiMouseButton_ -{ - ImGuiMouseButton_Left = 0, - ImGuiMouseButton_Right = 1, - ImGuiMouseButton_Middle = 2, - ImGuiMouseButton_COUNT = 5 -}; - -// Enumeration for GetMouseCursor() -// User code may request backend to display given cursor by calling SetMouseCursor(), which is why we have some cursors that are marked unused here -enum ImGuiMouseCursor_ -{ - ImGuiMouseCursor_None = -1, - ImGuiMouseCursor_Arrow = 0, - ImGuiMouseCursor_TextInput, // When hovering over InputText, etc. - ImGuiMouseCursor_ResizeAll, // (Unused by Dear ImGui functions) - ImGuiMouseCursor_ResizeNS, // When hovering over an horizontal border - ImGuiMouseCursor_ResizeEW, // When hovering over a vertical border or a column - ImGuiMouseCursor_ResizeNESW, // When hovering over the bottom-left corner of a window - ImGuiMouseCursor_ResizeNWSE, // When hovering over the bottom-right corner of a window - ImGuiMouseCursor_Hand, // (Unused by Dear ImGui functions. Use for e.g. hyperlinks) - ImGuiMouseCursor_NotAllowed, // When hovering something with disallowed interaction. Usually a crossed circle. - ImGuiMouseCursor_COUNT -}; - -// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions -// Represent a condition. -// Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always. -enum ImGuiCond_ -{ - ImGuiCond_None = 0, // No condition (always set the variable), same as _Always - ImGuiCond_Always = 1 << 0, // No condition (always set the variable) - ImGuiCond_Once = 1 << 1, // Set the variable once per runtime session (only the first call will succeed) - ImGuiCond_FirstUseEver = 1 << 2, // Set the variable if the object/window has no persistently saved data (no entry in .ini file) - ImGuiCond_Appearing = 1 << 3, // Set the variable if the object/window is appearing after being hidden/inactive (or the first time) -}; - -//----------------------------------------------------------------------------- -// [SECTION] Helpers: Memory allocations macros, ImVector<> -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// IM_MALLOC(), IM_FREE(), IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE() -// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. -// Defining a custom placement new() with a custom parameter allows us to bypass including which on some platforms complains when user has disabled exceptions. -//----------------------------------------------------------------------------- - -struct ImNewWrapper {}; -inline void* operator new(size_t, ImNewWrapper, void* ptr) { return ptr; } -inline void operator delete(void*, ImNewWrapper, void*) {} // This is only required so we can use the symmetrical new() -#define IM_ALLOC(_SIZE) ImGui::MemAlloc(_SIZE) -#define IM_FREE(_PTR) ImGui::MemFree(_PTR) -#define IM_PLACEMENT_NEW(_PTR) new(ImNewWrapper(), _PTR) -#define IM_NEW(_TYPE) new(ImNewWrapper(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE -template void IM_DELETE(T* p) { if (p) { p->~T(); ImGui::MemFree(p); } } - -//----------------------------------------------------------------------------- -// ImVector<> -// Lightweight std::vector<>-like class to avoid dragging dependencies (also, some implementations of STL with debug enabled are absurdly slow, we bypass it so our code runs fast in debug). -//----------------------------------------------------------------------------- -// - You generally do NOT need to care or use this ever. But we need to make it available in imgui.h because some of our public structures are relying on it. -// - We use std-like naming convention here, which is a little unusual for this codebase. -// - Important: clear() frees memory, resize(0) keep the allocated buffer. We use resize(0) a lot to intentionally recycle allocated buffers across frames and amortize our costs. -// - Important: our implementation does NOT call C++ constructors/destructors, we treat everything as raw data! This is intentional but be extra mindful of that, -// Do NOT use this class as a std::vector replacement in your own code! Many of the structures used by dear imgui can be safely initialized by a zero-memset. -//----------------------------------------------------------------------------- - -IM_MSVC_RUNTIME_CHECKS_OFF -template -struct ImVector -{ - int Size; - int Capacity; - T* Data; - - // Provide standard typedefs but we don't use them ourselves. - typedef T value_type; - typedef value_type* iterator; - typedef const value_type* const_iterator; - - // Constructors, destructor - inline ImVector() { Size = Capacity = 0; Data = NULL; } - inline ImVector(const ImVector& src) { Size = Capacity = 0; Data = NULL; operator=(src); } - inline ImVector& operator=(const ImVector& src) { clear(); resize(src.Size); memcpy(Data, src.Data, (size_t)Size * sizeof(T)); return *this; } - inline ~ImVector() { if (Data) IM_FREE(Data); } // Important: does not destruct anything - - inline void clear() { if (Data) { Size = Capacity = 0; IM_FREE(Data); Data = NULL; } } // Important: does not destruct anything - inline void clear_delete() { for (int n = 0; n < Size; n++) IM_DELETE(Data[n]); clear(); } // Important: never called automatically! always explicit. - inline void clear_destruct() { for (int n = 0; n < Size; n++) Data[n].~T(); clear(); } // Important: never called automatically! always explicit. - - inline bool empty() const { return Size == 0; } - inline int size() const { return Size; } - inline int size_in_bytes() const { return Size * (int)sizeof(T); } - inline int max_size() const { return 0x7FFFFFFF / (int)sizeof(T); } - inline int capacity() const { return Capacity; } - inline T& operator[](int i) { IM_ASSERT(i >= 0 && i < Size); return Data[i]; } - inline const T& operator[](int i) const { IM_ASSERT(i >= 0 && i < Size); return Data[i]; } - - inline T* begin() { return Data; } - inline const T* begin() const { return Data; } - inline T* end() { return Data + Size; } - inline const T* end() const { return Data + Size; } - inline T& front() { IM_ASSERT(Size > 0); return Data[0]; } - inline const T& front() const { IM_ASSERT(Size > 0); return Data[0]; } - inline T& back() { IM_ASSERT(Size > 0); return Data[Size - 1]; } - inline const T& back() const { IM_ASSERT(Size > 0); return Data[Size - 1]; } - inline void swap(ImVector& rhs) { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; T* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; } - - inline int _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity / 2) : 8; return new_capacity > sz ? new_capacity : sz; } - inline void resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; } - inline void resize(int new_size, const T& v) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) memcpy(&Data[n], &v, sizeof(v)); Size = new_size; } - inline void shrink(int new_size) { IM_ASSERT(new_size <= Size); Size = new_size; } // Resize a vector to a smaller size, guaranteed not to cause a reallocation - inline void reserve(int new_capacity) { if (new_capacity <= Capacity) return; T* new_data = (T*)IM_ALLOC((size_t)new_capacity * sizeof(T)); if (Data) { memcpy(new_data, Data, (size_t)Size * sizeof(T)); IM_FREE(Data); } Data = new_data; Capacity = new_capacity; } - inline void reserve_discard(int new_capacity) { if (new_capacity <= Capacity) return; if (Data) IM_FREE(Data); Data = (T*)IM_ALLOC((size_t)new_capacity * sizeof(T)); Capacity = new_capacity; } - - // NB: It is illegal to call push_back/push_front/insert with a reference pointing inside the ImVector data itself! e.g. v.push_back(v[10]) is forbidden. - inline void push_back(const T& v) { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); memcpy(&Data[Size], &v, sizeof(v)); Size++; } - inline void pop_back() { IM_ASSERT(Size > 0); Size--; } - inline void push_front(const T& v) { if (Size == 0) push_back(v); else insert(Data, v); } - inline T* erase(const T* it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(T)); Size--; return Data + off; } - inline T* erase(const T* it, const T* it_last){ IM_ASSERT(it >= Data && it < Data + Size && it_last >= it && it_last <= Data + Size); const ptrdiff_t count = it_last - it; const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + count, ((size_t)Size - (size_t)off - (size_t)count) * sizeof(T)); Size -= (int)count; return Data + off; } - inline T* erase_unsorted(const T* it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; if (it < Data + Size - 1) memcpy(Data + off, Data + Size - 1, sizeof(T)); Size--; return Data + off; } - inline T* insert(const T* it, const T& v) { IM_ASSERT(it >= Data && it <= Data + Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(T)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; } - inline bool contains(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; } - inline T* find(const T& v) { T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } - inline const T* find(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } - inline bool find_erase(const T& v) { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; } - inline bool find_erase_unsorted(const T& v) { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; } - inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; } -}; -IM_MSVC_RUNTIME_CHECKS_RESTORE - -//----------------------------------------------------------------------------- -// [SECTION] ImGuiStyle -//----------------------------------------------------------------------------- -// You may modify the ImGui::GetStyle() main instance during initialization and before NewFrame(). -// During the frame, use ImGui::PushStyleVar(ImGuiStyleVar_XXXX)/PopStyleVar() to alter the main style values, -// and ImGui::PushStyleColor(ImGuiCol_XXX)/PopStyleColor() for colors. -//----------------------------------------------------------------------------- - -struct ImGuiStyle -{ - float Alpha; // Global alpha applies to everything in Dear ImGui. - float DisabledAlpha; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. - ImVec2 WindowPadding; // Padding within a window. - float WindowRounding; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. - float WindowBorderSize; // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). - ImVec2 WindowMinSize; // Minimum window size. This is a global setting. If you want to constraint individual windows, use SetNextWindowSizeConstraints(). - ImVec2 WindowTitleAlign; // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered. - ImGuiDir WindowMenuButtonPosition; // Side of the collapsing/docking button in the title bar (None/Left/Right). Defaults to ImGuiDir_Left. - float ChildRounding; // Radius of child window corners rounding. Set to 0.0f to have rectangular windows. - float ChildBorderSize; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). - float PopupRounding; // Radius of popup window corners rounding. (Note that tooltip windows use WindowRounding) - float PopupBorderSize; // Thickness of border around popup/tooltip windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). - ImVec2 FramePadding; // Padding within a framed rectangle (used by most widgets). - float FrameRounding; // Radius of frame corners rounding. Set to 0.0f to have rectangular frame (used by most widgets). - float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). - ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines. - ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label). - ImVec2 CellPadding; // Padding within a table cell - ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! - float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). - float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). - float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar. - float ScrollbarRounding; // Radius of grab corners for scrollbar. - float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar. - float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. - float LogSliderDeadzone; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. - float TabRounding; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. - float TabBorderSize; // Thickness of border around tabs. - float TabMinWidthForCloseButton; // Minimum width for close button to appears on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. - ImGuiDir ColorButtonPosition; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. - ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered). - ImVec2 SelectableTextAlign; // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. - ImVec2 DisplayWindowPadding; // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. - ImVec2 DisplaySafeAreaPadding; // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! - float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. - bool AntiAliasedLines; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). - bool AntiAliasedLinesUseTex; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). Latched at the beginning of the frame (copied to ImDrawList). - bool AntiAliasedFill; // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). - float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. - float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. - ImVec4 Colors[ImGuiCol_COUNT]; - - IMGUI_API ImGuiStyle(); - IMGUI_API void ScaleAllSizes(float scale_factor); -}; - -//----------------------------------------------------------------------------- -// [SECTION] ImGuiIO -//----------------------------------------------------------------------------- -// Communicate most settings and inputs/outputs to Dear ImGui using this structure. -// Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage. -//----------------------------------------------------------------------------- - -// [Internal] Storage used by IsKeyDown(), IsKeyPressed() etc functions. -// If prior to 1.87 you used io.KeysDownDuration[] (which was marked as internal), you should use GetKeyData(key)->DownDuration and not io.KeysData[key]->DownDuration. -struct ImGuiKeyData -{ - bool Down; // True for if key is down - float DownDuration; // Duration the key has been down (<0.0f: not pressed, 0.0f: just pressed, >0.0f: time held) - float DownDurationPrev; // Last frame duration the key has been down - float AnalogValue; // 0.0f..1.0f for gamepad values -}; - -struct ImGuiIO -{ - //------------------------------------------------------------------ - // Configuration // Default value - //------------------------------------------------------------------ - - ImGuiConfigFlags ConfigFlags; // = 0 // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc. - ImGuiBackendFlags BackendFlags; // = 0 // See ImGuiBackendFlags_ enum. Set by backend (imgui_impl_xxx files or custom backend) to communicate features supported by the backend. - ImVec2 DisplaySize; // // Main display size, in pixels (generally == GetMainViewport()->Size). May change every frame. - float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds. May change every frame. - float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds. - const char* IniFilename; // = "imgui.ini" // Path to .ini file (important: default "imgui.ini" is relative to current working dir!). Set NULL to disable automatic .ini loading/saving or if you want to manually call LoadIniSettingsXXX() / SaveIniSettingsXXX() functions. - const char* LogFilename; // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified). - float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. - float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. - float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging. - float KeyRepeatDelay; // = 0.250f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.). - float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. - void* UserData; // = NULL // Store your own data for retrieval by callbacks. - - ImFontAtlas*Fonts; // // Font atlas: load, rasterize and pack one or more fonts into a single texture. - float FontGlobalScale; // = 1.0f // Global scale all fonts - bool FontAllowUserScaling; // = false // Allow user scaling text of individual window with CTRL+Wheel. - ImFont* FontDefault; // = NULL // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0]. - ImVec2 DisplayFramebufferScale; // = (1, 1) // For retina display or other situations where window coordinates are different from framebuffer coordinates. This generally ends up in ImDrawData::FramebufferScale. - - // Miscellaneous options - bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by backend implementations. - bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl. - bool ConfigInputTrickleEventQueue; // = true // Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates. - bool ConfigInputTextCursorBlink; // = true // Enable blinking cursor (optional as some users consider it to be distracting). - bool ConfigInputTextEnterKeepActive; // = false // [BETA] Pressing Enter will keep item active and select contents (single-line only). - bool ConfigDragClickToInputText; // = false // [BETA] Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving). Not desirable on devices without a keyboard. - bool ConfigWindowsResizeFromEdges; // = true // Enable resizing of windows from their edges and from the lower-left corner. This requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback. (This used to be a per-window ImGuiWindowFlags_ResizeFromAnySide flag) - bool ConfigWindowsMoveFromTitleBarOnly; // = false // Enable allowing to move windows only when clicking on their title bar. Does not apply to windows without a title bar. - float ConfigMemoryCompactTimer; // = 60.0f // Timer (in seconds) to free transient windows/tables memory buffers when unused. Set to -1.0f to disable. - - //------------------------------------------------------------------ - // Platform Functions - // (the imgui_impl_xxxx backend files are setting those up for you) - //------------------------------------------------------------------ - - // Optional: Platform/Renderer backend name (informational only! will be displayed in About Window) + User data for backend/wrappers to store their own stuff. - const char* BackendPlatformName; // = NULL - const char* BackendRendererName; // = NULL - void* BackendPlatformUserData; // = NULL // User data for platform backend - void* BackendRendererUserData; // = NULL // User data for renderer backend - void* BackendLanguageUserData; // = NULL // User data for non C++ programming language backend - - // Optional: Access OS clipboard - // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures) - const char* (*GetClipboardTextFn)(void* user_data); - void (*SetClipboardTextFn)(void* user_data, const char* text); - void* ClipboardUserData; - - // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows) - // (default to use native imm32 api on Windows) - void (*SetPlatformImeDataFn)(ImGuiViewport* viewport, ImGuiPlatformImeData* data); -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - void* ImeWindowHandle; // = NULL // [Obsolete] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning. -#else - void* _UnusedPadding; // Unused field to keep data structure the same size. -#endif - - //------------------------------------------------------------------ - // Input - Call before calling NewFrame() - //------------------------------------------------------------------ - - // Input Functions - IMGUI_API void AddKeyEvent(ImGuiKey key, bool down); // Queue a new key down/up event. Key should be "translated" (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character) - IMGUI_API void AddKeyAnalogEvent(ImGuiKey key, bool down, float v); // Queue a new key down/up event for analog values (e.g. ImGuiKey_Gamepad_ values). Dead-zones should be handled by the backend. - IMGUI_API void AddMousePosEvent(float x, float y); // Queue a mouse position update. Use -FLT_MAX,-FLT_MAX to signify no mouse (e.g. app not focused and not hovered) - IMGUI_API void AddMouseButtonEvent(int button, bool down); // Queue a mouse button change - IMGUI_API void AddMouseWheelEvent(float wh_x, float wh_y); // Queue a mouse wheel update - IMGUI_API void AddFocusEvent(bool focused); // Queue a gain/loss of focus for the application (generally based on OS/platform focus of your window) - IMGUI_API void AddInputCharacter(unsigned int c); // Queue a new character input - IMGUI_API void AddInputCharacterUTF16(ImWchar16 c); // Queue a new character input from an UTF-16 character, it can be a surrogate - IMGUI_API void AddInputCharactersUTF8(const char* str); // Queue a new characters input from an UTF-8 string - - IMGUI_API void SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index = -1); // [Optional] Specify index for legacy <1.87 IsKeyXXX() functions with native indices + specify native keycode, scancode. - IMGUI_API void SetAppAcceptingEvents(bool accepting_events); // Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen. - IMGUI_API void ClearInputCharacters(); // [Internal] Clear the text input buffer manually - IMGUI_API void ClearInputKeys(); // [Internal] Release all keys - - //------------------------------------------------------------------ - // Output - Updated by NewFrame() or EndFrame()/Render() - // (when reading from the io.WantCaptureMouse, io.WantCaptureKeyboard flags to dispatch your inputs, it is - // generally easier and more correct to use their state BEFORE calling NewFrame(). See FAQ for details!) - //------------------------------------------------------------------ - - bool WantCaptureMouse; // Set when Dear ImGui will use mouse inputs, in this case do not dispatch them to your main game/application (either way, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.). - bool WantCaptureKeyboard; // Set when Dear ImGui will use keyboard inputs, in this case do not dispatch them to your main game/application (either way, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.). - bool WantTextInput; // Mobile/console: when set, you may display an on-screen keyboard. This is set by Dear ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active). - bool WantSetMousePos; // MousePos has been altered, backend should reposition mouse on next frame. Rarely used! Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled. - bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. Important: clear io.WantSaveIniSettings yourself after saving! - bool NavActive; // Keyboard/Gamepad navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag. - bool NavVisible; // Keyboard/Gamepad navigation is visible and allowed (will handle ImGuiKey_NavXXX events). - float Framerate; // Estimate of application framerate (rolling average over 60 frames, based on io.DeltaTime), in frame per second. Solely for convenience. Slow applications may not want to use a moving average or may want to reset underlying buffers occasionally. - int MetricsRenderVertices; // Vertices output during last call to Render() - int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3 - int MetricsRenderWindows; // Number of visible windows - int MetricsActiveWindows; // Number of active windows - int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts. - ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta. - - // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame. - // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent(). -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512. - bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow. - float NavInputs[ImGuiNavInput_COUNT]; // [LEGACY] Since 1.88, NavInputs[] was removed. Backends from 1.60 to 1.86 won't build. Feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums. -#endif - - //------------------------------------------------------------------ - // [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed! - //------------------------------------------------------------------ - - // Main Input State - // (this block used to be written by backend, since 1.87 it is best to NOT write to those directly, call the AddXXX functions above instead) - // (reading from those variables is fair game, as they are extremely unlikely to be moving anywhere) - ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX, -FLT_MAX) if mouse is unavailable (on another screen, etc.) - bool MouseDown[5]; // Mouse buttons: 0=left, 1=right, 2=middle + extras (ImGuiMouseButton_COUNT == 5). Dear ImGui mostly uses left and right buttons. Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API. - float MouseWheel; // Mouse wheel Vertical: 1 unit scrolls about 5 lines text. - float MouseWheelH; // Mouse wheel Horizontal. Most users don't have a mouse with an horizontal wheel, may not be filled by all backends. - bool KeyCtrl; // Keyboard modifier down: Control - bool KeyShift; // Keyboard modifier down: Shift - bool KeyAlt; // Keyboard modifier down: Alt - bool KeySuper; // Keyboard modifier down: Cmd/Super/Windows - - // Other state maintained from data above + IO function calls - ImGuiModFlags KeyMods; // Key mods flags (same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags), updated by NewFrame() - ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE]; // Key state for all known keys. Use IsKeyXXX() functions to access this. - bool WantCaptureMouseUnlessPopupClose; // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup. - ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid) - ImVec2 MouseClickedPos[5]; // Position at time of clicking - double MouseClickedTime[5]; // Time of last click (used to figure out double-click) - bool MouseClicked[5]; // Mouse button went from !Down to Down (same as MouseClickedCount[x] != 0) - bool MouseDoubleClicked[5]; // Has mouse button been double-clicked? (same as MouseClickedCount[x] == 2) - ImU16 MouseClickedCount[5]; // == 0 (not clicked), == 1 (same as MouseClicked[]), == 2 (double-clicked), == 3 (triple-clicked) etc. when going from !Down to Down - ImU16 MouseClickedLastCount[5]; // Count successive number of clicks. Stays valid after mouse release. Reset after another click is done. - bool MouseReleased[5]; // Mouse button went from Down to !Down - bool MouseDownOwned[5]; // Track if button was clicked inside a dear imgui window or over void blocked by a popup. We don't request mouse capture from the application if click started outside ImGui bounds. - bool MouseDownOwnedUnlessPopupClose[5]; // Track if button was clicked inside a dear imgui window. - float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked) - float MouseDownDurationPrev[5]; // Previous time the mouse button has been down - float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point (used for moving thresholds) - float PenPressure; // Touch/Pen pressure (0.0f to 1.0f, should be >0.0f only when MouseDown[0] == true). Helper storage currently unused by Dear ImGui. - bool AppFocusLost; // Only modify via AddFocusEvent() - bool AppAcceptingEvents; // Only modify via SetAppAcceptingEvents() - ImS8 BackendUsingLegacyKeyArrays; // -1: unknown, 0: using AddKeyEvent(), 1: using legacy io.KeysDown[] - bool BackendUsingLegacyNavInputArray; // 0: using AddKeyAnalogEvent(), 1: writing to legacy io.NavInputs[] directly - ImWchar16 InputQueueSurrogate; // For AddInputCharacterUTF16() - ImVector InputQueueCharacters; // Queue of _characters_ input (obtained by platform backend). Fill using AddInputCharacter() helper. - - IMGUI_API ImGuiIO(); -}; - -//----------------------------------------------------------------------------- -// [SECTION] Misc data structures -//----------------------------------------------------------------------------- - -// Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used. -// The callback function should return 0 by default. -// Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details) -// - ImGuiInputTextFlags_CallbackEdit: Callback on buffer edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) -// - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration -// - ImGuiInputTextFlags_CallbackCompletion: Callback on pressing TAB -// - ImGuiInputTextFlags_CallbackHistory: Callback on pressing Up/Down arrows -// - ImGuiInputTextFlags_CallbackCharFilter: Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. -// - ImGuiInputTextFlags_CallbackResize: Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. -struct ImGuiInputTextCallbackData -{ - ImGuiInputTextFlags EventFlag; // One ImGuiInputTextFlags_Callback* // Read-only - ImGuiInputTextFlags Flags; // What user passed to InputText() // Read-only - void* UserData; // What user passed to InputText() // Read-only - - // Arguments for the different callback events - // - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary. - // - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state. - ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0; - ImGuiKey EventKey; // Key pressed (Up/Down/TAB) // Read-only // [Completion,History] - char* Buf; // Text buffer // Read-write // [Resize] Can replace pointer / [Completion,History,Always] Only write to pointed data, don't replace the actual pointer! - int BufTextLen; // Text length (in bytes) // Read-write // [Resize,Completion,History,Always] Exclude zero-terminator storage. In C land: == strlen(some_text), in C++ land: string.length() - int BufSize; // Buffer size (in bytes) = capacity+1 // Read-only // [Resize,Completion,History,Always] Include zero-terminator storage. In C land == ARRAYSIZE(my_char_array), in C++ land: string.capacity()+1 - bool BufDirty; // Set if you modify Buf/BufTextLen! // Write // [Completion,History,Always] - int CursorPos; // // Read-write // [Completion,History,Always] - int SelectionStart; // // Read-write // [Completion,History,Always] == to SelectionEnd when no selection) - int SelectionEnd; // // Read-write // [Completion,History,Always] - - // Helper functions for text manipulation. - // Use those function to benefit from the CallbackResize behaviors. Calling those function reset the selection. - IMGUI_API ImGuiInputTextCallbackData(); - IMGUI_API void DeleteChars(int pos, int bytes_count); - IMGUI_API void InsertChars(int pos, const char* text, const char* text_end = NULL); - void SelectAll() { SelectionStart = 0; SelectionEnd = BufTextLen; } - void ClearSelection() { SelectionStart = SelectionEnd = BufTextLen; } - bool HasSelection() const { return SelectionStart != SelectionEnd; } -}; - -// Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin(). -// NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough. -struct ImGuiSizeCallbackData -{ - void* UserData; // Read-only. What user passed to SetNextWindowSizeConstraints() - ImVec2 Pos; // Read-only. Window position, for reference. - ImVec2 CurrentSize; // Read-only. Current window size. - ImVec2 DesiredSize; // Read-write. Desired size, based on user's mouse position. Write to this field to restrain resizing. -}; - -// Data payload for Drag and Drop operations: AcceptDragDropPayload(), GetDragDropPayload() -struct ImGuiPayload -{ - // Members - void* Data; // Data (copied and owned by dear imgui) - int DataSize; // Data size - - // [Internal] - ImGuiID SourceId; // Source item id - ImGuiID SourceParentId; // Source parent id (if available) - int DataFrameCount; // Data timestamp - char DataType[32 + 1]; // Data type tag (short user-supplied string, 32 characters max) - bool Preview; // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets) - bool Delivery; // Set when AcceptDragDropPayload() was called and mouse button is released over the target item. - - ImGuiPayload() { Clear(); } - void Clear() { SourceId = SourceParentId = 0; Data = NULL; DataSize = 0; memset(DataType, 0, sizeof(DataType)); DataFrameCount = -1; Preview = Delivery = false; } - bool IsDataType(const char* type) const { return DataFrameCount != -1 && strcmp(type, DataType) == 0; } - bool IsPreview() const { return Preview; } - bool IsDelivery() const { return Delivery; } -}; - -// Sorting specification for one column of a table (sizeof == 12 bytes) -struct ImGuiTableColumnSortSpecs -{ - ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call) - ImS16 ColumnIndex; // Index of the column - ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) - ImGuiSortDirection SortDirection : 8; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending (you can use this or SortSign, whichever is more convenient for your sort function) - - ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); } -}; - -// Sorting specifications for a table (often handling sort specs for a single column, occasionally more) -// Obtained by calling TableGetSortSpecs(). -// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time. -// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! -struct ImGuiTableSortSpecs -{ - const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array. - int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled. - bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag. - - ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor) -//----------------------------------------------------------------------------- - -// Helper: Unicode defines -#define IM_UNICODE_CODEPOINT_INVALID 0xFFFD // Invalid Unicode code point (standard value). -#ifdef IMGUI_USE_WCHAR32 -#define IM_UNICODE_CODEPOINT_MAX 0x10FFFF // Maximum Unicode code point supported by this build. -#else -#define IM_UNICODE_CODEPOINT_MAX 0xFFFF // Maximum Unicode code point supported by this build. -#endif - -// Helper: Execute a block of code at maximum once a frame. Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame. -// Usage: static ImGuiOnceUponAFrame oaf; if (oaf) ImGui::Text("This will be called only once per frame"); -struct ImGuiOnceUponAFrame -{ - ImGuiOnceUponAFrame() { RefFrame = -1; } - mutable int RefFrame; - operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; } -}; - -// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" -struct ImGuiTextFilter -{ - IMGUI_API ImGuiTextFilter(const char* default_filter = ""); - IMGUI_API bool Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f); // Helper calling InputText+Build - IMGUI_API bool PassFilter(const char* text, const char* text_end = NULL) const; - IMGUI_API void Build(); - void Clear() { InputBuf[0] = 0; Build(); } - bool IsActive() const { return !Filters.empty(); } - - // [Internal] - struct ImGuiTextRange - { - const char* b; - const char* e; - - ImGuiTextRange() { b = e = NULL; } - ImGuiTextRange(const char* _b, const char* _e) { b = _b; e = _e; } - bool empty() const { return b == e; } - IMGUI_API void split(char separator, ImVector* out) const; - }; - char InputBuf[256]; - ImVectorFilters; - int CountGrep; -}; - -// Helper: Growable text buffer for logging/accumulating text -// (this could be called 'ImGuiTextBuilder' / 'ImGuiStringBuilder') -struct ImGuiTextBuffer -{ - ImVector Buf; - IMGUI_API static char EmptyString[1]; - - ImGuiTextBuffer() { } - inline char operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; } - const char* begin() const { return Buf.Data ? &Buf.front() : EmptyString; } - const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator - int size() const { return Buf.Size ? Buf.Size - 1 : 0; } - bool empty() const { return Buf.Size <= 1; } - void clear() { Buf.clear(); } - void reserve(int capacity) { Buf.reserve(capacity); } - const char* c_str() const { return Buf.Data ? Buf.Data : EmptyString; } - IMGUI_API void append(const char* str, const char* str_end = NULL); - IMGUI_API void appendf(const char* fmt, ...) IM_FMTARGS(2); - IMGUI_API void appendfv(const char* fmt, va_list args) IM_FMTLIST(2); -}; - -// Helper: Key->Value storage -// Typically you don't have to worry about this since a storage is held within each Window. -// We use it to e.g. store collapse state for a tree (Int 0/1) -// This is optimized for efficient lookup (dichotomy into a contiguous buffer) and rare insertion (typically tied to user interactions aka max once a frame) -// You can use it as custom user storage for temporary values. Declare your own storage if, for example: -// - You want to manipulate the open/close state of a particular sub-tree in your interface (tree node uses Int 0/1 to store their state). -// - You want to store custom debug data easily without adding or editing structures in your code (probably not efficient, but convenient) -// Types are NOT stored, so it is up to you to make sure your Key don't collide with different types. -struct ImGuiStorage -{ - // [Internal] - struct ImGuiStoragePair - { - ImGuiID key; - union { int val_i; float val_f; void* val_p; }; - ImGuiStoragePair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; } - ImGuiStoragePair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } - ImGuiStoragePair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } - }; - - ImVector Data; - - // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N) - // - Set***() functions find pair, insertion on demand if missing. - // - Sorted insertion is costly, paid once. A typical frame shouldn't need to insert any new pair. - void Clear() { Data.clear(); } - IMGUI_API int GetInt(ImGuiID key, int default_val = 0) const; - IMGUI_API void SetInt(ImGuiID key, int val); - IMGUI_API bool GetBool(ImGuiID key, bool default_val = false) const; - IMGUI_API void SetBool(ImGuiID key, bool val); - IMGUI_API float GetFloat(ImGuiID key, float default_val = 0.0f) const; - IMGUI_API void SetFloat(ImGuiID key, float val); - IMGUI_API void* GetVoidPtr(ImGuiID key) const; // default_val is NULL - IMGUI_API void SetVoidPtr(ImGuiID key, void* val); - - // - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set. - // - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. - // - A typical use case where this is convenient for quick hacking (e.g. add storage during a live Edit&Continue session if you can't modify existing struct) - // float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar; - IMGUI_API int* GetIntRef(ImGuiID key, int default_val = 0); - IMGUI_API bool* GetBoolRef(ImGuiID key, bool default_val = false); - IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0.0f); - IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL); - - // Use on your own storage if you know only integer are being stored (open/close all tree nodes) - IMGUI_API void SetAllInt(int val); - - // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. - IMGUI_API void BuildSortByKey(); -}; - -// Helper: Manually clip large list of items. -// If you have lots evenly spaced items and you have a random access to the list, you can perform coarse -// clipping based on visibility to only submit items that are in view. -// The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped. -// (Dear ImGui already clip items based on their bounds but: it needs to first layout the item to do so, and generally -// fetching/submitting your own data incurs additional cost. Coarse clipping using ImGuiListClipper allows you to easily -// scale using lists with tens of thousands of items without a problem) -// Usage: -// ImGuiListClipper clipper; -// clipper.Begin(1000); // We have 1000 elements, evenly spaced. -// while (clipper.Step()) -// for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) -// ImGui::Text("line number %d", i); -// Generally what happens is: -// - Clipper lets you process the first element (DisplayStart = 0, DisplayEnd = 1) regardless of it being visible or not. -// - User code submit that one element. -// - Clipper can measure the height of the first element -// - Clipper calculate the actual range of elements to display based on the current clipping rectangle, position the cursor before the first visible element. -// - User code submit visible elements. -// - The clipper also handles various subtleties related to keyboard/gamepad navigation, wrapping etc. -struct ImGuiListClipper -{ - int DisplayStart; // First item to display, updated by each call to Step() - int DisplayEnd; // End of items to display (exclusive) - int ItemsCount; // [Internal] Number of items - float ItemsHeight; // [Internal] Height of item after a first step and item submission can calculate it - float StartPosY; // [Internal] Cursor position at the time of Begin() or after table frozen rows are all processed - void* TempData; // [Internal] Internal data - - // items_count: Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step) - // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing(). - IMGUI_API ImGuiListClipper(); - IMGUI_API ~ImGuiListClipper(); - IMGUI_API void Begin(int items_count, float items_height = -1.0f); - IMGUI_API void End(); // Automatically called on the last call of Step() that returns false. - IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items. - - // Call ForceDisplayRangeByIndices() before first call to Step() if you need a range of items to be displayed regardless of visibility. - IMGUI_API void ForceDisplayRangeByIndices(int item_min, int item_max); // item_max is exclusive e.g. use (42, 42+1) to make item 42 always visible BUT due to alignment/padding of certain items it is likely that an extra item may be included on either end of the display range. - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79] -#endif -}; - -// Helpers macros to generate 32-bit encoded colors -// User can declare their own format by #defining the 5 _SHIFT/_MASK macros in their imconfig file. -#ifndef IM_COL32_R_SHIFT -#ifdef IMGUI_USE_BGRA_PACKED_COLOR -#define IM_COL32_R_SHIFT 16 -#define IM_COL32_G_SHIFT 8 -#define IM_COL32_B_SHIFT 0 -#define IM_COL32_A_SHIFT 24 -#define IM_COL32_A_MASK 0xFF000000 -#else -#define IM_COL32_R_SHIFT 0 -#define IM_COL32_G_SHIFT 8 -#define IM_COL32_B_SHIFT 16 -#define IM_COL32_A_SHIFT 24 -#define IM_COL32_A_MASK 0xFF000000 -#endif -#endif -#define IM_COL32(R,G,B,A) (((ImU32)(A)<> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; } - inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); } - inline operator ImVec4() const { return Value; } - - // FIXME-OBSOLETE: May need to obsolete/cleanup those helpers. - inline void SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; } - static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r, g, b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r, g, b, a); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Drawing API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData) -// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList. -//----------------------------------------------------------------------------- - -// The maximum line width to bake anti-aliased textures for. Build atlas with ImFontAtlasFlags_NoBakedLines to disable baking. -#ifndef IM_DRAWLIST_TEX_LINES_WIDTH_MAX -#define IM_DRAWLIST_TEX_LINES_WIDTH_MAX (63) -#endif - -// ImDrawCallback: Draw callbacks for advanced uses [configurable type: override in imconfig.h] -// NB: You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering, -// you can poke into the draw list for that! Draw callback may be useful for example to: -// A) Change your GPU render state, -// B) render a complex 3D scene inside a UI element without an intermediate texture/render target, etc. -// The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) { cmd.UserCallback(parent_list, cmd); } else { RenderTriangles() }' -// If you want to override the signature of ImDrawCallback, you can simply use e.g. '#define ImDrawCallback MyDrawCallback' (in imconfig.h) + update rendering backend accordingly. -#ifndef ImDrawCallback -typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd); -#endif - -// Special Draw callback value to request renderer backend to reset the graphics/render state. -// The renderer backend needs to handle this special value, otherwise it will crash trying to call a function at this address. -// This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored. -// It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call). -#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-1) - -// Typically, 1 command = 1 GPU draw call (unless command is a callback) -// - VtxOffset: When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset' is enabled, -// this fields allow us to render meshes larger than 64K vertices while keeping 16-bit indices. -// Backends made for <1.71. will typically ignore the VtxOffset fields. -// - The ClipRect/TextureId/VtxOffset fields must be contiguous as we memcmp() them together (this is asserted for). -struct ImDrawCmd -{ - ImVec4 ClipRect; // 4*4 // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates - ImTextureID TextureId; // 4-8 // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas. - unsigned int VtxOffset; // 4 // Start offset in vertex buffer. ImGuiBackendFlags_RendererHasVtxOffset: always 0, otherwise may be >0 to support meshes larger than 64K vertices with 16-bit indices. - unsigned int IdxOffset; // 4 // Start offset in index buffer. - unsigned int ElemCount; // 4 // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[]. - ImDrawCallback UserCallback; // 4-8 // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally. - void* UserCallbackData; // 4-8 // The draw callback code can access this. - - ImDrawCmd() { memset(this, 0, sizeof(*this)); } // Also ensure our padding fields are zeroed - - // Since 1.83: returns ImTextureID associated with this draw call. Warning: DO NOT assume this is always same as 'TextureId' (we will change this function for an upcoming feature) - inline ImTextureID GetTexID() const { return TextureId; } -}; - -// Vertex layout -#ifndef IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT -struct ImDrawVert -{ - ImVec2 pos; - ImVec2 uv; - ImU32 col; -}; -#else -// You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h -// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine. -// The type has to be described within the macro (you can either declare the struct or use a typedef). This is because ImVec2/ImU32 are likely not declared a the time you'd want to set your type up. -// NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM. -IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT; -#endif - -// [Internal] For use by ImDrawList -struct ImDrawCmdHeader -{ - ImVec4 ClipRect; - ImTextureID TextureId; - unsigned int VtxOffset; -}; - -// [Internal] For use by ImDrawListSplitter -struct ImDrawChannel -{ - ImVector _CmdBuffer; - ImVector _IdxBuffer; -}; - - -// Split/Merge functions are used to split the draw list into different layers which can be drawn into out of order. -// This is used by the Columns/Tables API, so items of each column can be batched together in a same draw call. -struct ImDrawListSplitter -{ - int _Current; // Current channel number (0) - int _Count; // Number of active channels (1+) - ImVector _Channels; // Draw channels (not resized down so _Count might be < Channels.Size) - - inline ImDrawListSplitter() { memset(this, 0, sizeof(*this)); } - inline ~ImDrawListSplitter() { ClearFreeMemory(); } - inline void Clear() { _Current = 0; _Count = 1; } // Do not clear Channels[] so our allocations are reused next frame - IMGUI_API void ClearFreeMemory(); - IMGUI_API void Split(ImDrawList* draw_list, int count); - IMGUI_API void Merge(ImDrawList* draw_list); - IMGUI_API void SetCurrentChannel(ImDrawList* draw_list, int channel_idx); -}; - -// Flags for ImDrawList functions -// (Legacy: bit 0 must always correspond to ImDrawFlags_Closed to be backward compatible with old API using a bool. Bits 1..3 must be unused) -enum ImDrawFlags_ -{ - ImDrawFlags_None = 0, - ImDrawFlags_Closed = 1 << 0, // PathStroke(), AddPolyline(): specify that shape should be closed (Important: this is always == 1 for legacy reason) - ImDrawFlags_RoundCornersTopLeft = 1 << 4, // AddRect(), AddRectFilled(), PathRect(): enable rounding top-left corner only (when rounding > 0.0f, we default to all corners). Was 0x01. - ImDrawFlags_RoundCornersTopRight = 1 << 5, // AddRect(), AddRectFilled(), PathRect(): enable rounding top-right corner only (when rounding > 0.0f, we default to all corners). Was 0x02. - ImDrawFlags_RoundCornersBottomLeft = 1 << 6, // AddRect(), AddRectFilled(), PathRect(): enable rounding bottom-left corner only (when rounding > 0.0f, we default to all corners). Was 0x04. - ImDrawFlags_RoundCornersBottomRight = 1 << 7, // AddRect(), AddRectFilled(), PathRect(): enable rounding bottom-right corner only (when rounding > 0.0f, we default to all corners). Wax 0x08. - ImDrawFlags_RoundCornersNone = 1 << 8, // AddRect(), AddRectFilled(), PathRect(): disable rounding on all corners (when rounding > 0.0f). This is NOT zero, NOT an implicit flag! - ImDrawFlags_RoundCornersTop = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight, - ImDrawFlags_RoundCornersBottom = ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight, - ImDrawFlags_RoundCornersLeft = ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersTopLeft, - ImDrawFlags_RoundCornersRight = ImDrawFlags_RoundCornersBottomRight | ImDrawFlags_RoundCornersTopRight, - ImDrawFlags_RoundCornersAll = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight | ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight, - ImDrawFlags_RoundCornersDefault_ = ImDrawFlags_RoundCornersAll, // Default to ALL corners if none of the _RoundCornersXX flags are specified. - ImDrawFlags_RoundCornersMask_ = ImDrawFlags_RoundCornersAll | ImDrawFlags_RoundCornersNone, -}; - -// Flags for ImDrawList instance. Those are set automatically by ImGui:: functions from ImGuiIO settings, and generally not manipulated directly. -// It is however possible to temporarily alter flags between calls to ImDrawList:: functions. -enum ImDrawListFlags_ -{ - ImDrawListFlags_None = 0, - ImDrawListFlags_AntiAliasedLines = 1 << 0, // Enable anti-aliased lines/borders (*2 the number of triangles for 1.0f wide line or lines thin enough to be drawn using textures, otherwise *3 the number of triangles) - ImDrawListFlags_AntiAliasedLinesUseTex = 1 << 1, // Enable anti-aliased lines/borders using textures when possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). - ImDrawListFlags_AntiAliasedFill = 1 << 2, // Enable anti-aliased edge around filled shapes (rounded rectangles, circles). - ImDrawListFlags_AllowVtxOffset = 1 << 3, // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'ImGuiBackendFlags_RendererHasVtxOffset' is enabled. -}; - -// Draw command list -// This is the low-level list of polygons that ImGui:: functions are filling. At the end of the frame, -// all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering. -// Each dear imgui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to -// access the current window draw list and draw custom primitives. -// You can interleave normal ImGui:: calls and adding primitives to the current draw list. -// In single viewport mode, top-left is == GetMainViewport()->Pos (generally 0,0), bottom-right is == GetMainViewport()->Pos+Size (generally io.DisplaySize). -// You are totally free to apply whatever transformation matrix to want to the data (depending on the use of the transformation you may want to apply it to ClipRect as well!) -// Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects. -struct ImDrawList -{ - // This is what you have to render - ImVector CmdBuffer; // Draw commands. Typically 1 command = 1 GPU draw call, unless the command is a callback. - ImVector IdxBuffer; // Index buffer. Each command consume ImDrawCmd::ElemCount of those - ImVector VtxBuffer; // Vertex buffer. - ImDrawListFlags Flags; // Flags, you may poke into these to adjust anti-aliasing settings per-primitive. - - // [Internal, used while building lists] - unsigned int _VtxCurrentIdx; // [Internal] generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0. - const ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) - const char* _OwnerName; // Pointer to owner window's name for debugging - ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) - ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) - ImVector _ClipRectStack; // [Internal] - ImVector _TextureIdStack; // [Internal] - ImVector _Path; // [Internal] current path building - ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back(). - ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!) - float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content - - // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui) - ImDrawList(const ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; } - - ~ImDrawList() { _ClearFreeMemory(); } - IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect = false); // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) - IMGUI_API void PushClipRectFullScreen(); - IMGUI_API void PopClipRect(); - IMGUI_API void PushTextureID(ImTextureID texture_id); - IMGUI_API void PopTextureID(); - inline ImVec2 GetClipRectMin() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.x, cr.y); } - inline ImVec2 GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); } - - // Primitives - // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. - // - For rectangular primitives, "p_min" and "p_max" represent the upper-left and lower-right corners. - // - For circle primitives, use "num_segments == 0" to automatically calculate tessellation (preferred). - // In older versions (until Dear ImGui 1.77) the AddCircle functions defaulted to num_segments == 12. - // In future versions we will use textures to provide cheaper and higher-quality circles. - // Use AddNgon() and AddNgonFilled() functions if you need to guaranteed a specific number of sides. - IMGUI_API void AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawFlags flags = 0, float thickness = 1.0f); // a: upper-left, b: lower-right (== upper-left + size) - IMGUI_API void AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawFlags flags = 0); // a: upper-left, b: lower-right (== upper-left + size) - IMGUI_API void AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left); - IMGUI_API void AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col); - IMGUI_API void AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness = 1.0f); - IMGUI_API void AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col); - IMGUI_API void AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments = 0, float thickness = 1.0f); - IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0); - IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f); - IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments); - IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL); - IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); - IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness); - IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); - IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points) - IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points) - - // Image primitives - // - Read FAQ to understand what ImTextureID is. - // - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle. - // - "uv_min" and "uv_max" represent the normalized texture coordinates to use for those corners. Using (0,0)->(1,1) texture coordinates will generally display the entire texture. - IMGUI_API void AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min = ImVec2(0, 0), const ImVec2& uv_max = ImVec2(1, 1), ImU32 col = IM_COL32_WHITE); - IMGUI_API void AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1 = ImVec2(0, 0), const ImVec2& uv2 = ImVec2(1, 0), const ImVec2& uv3 = ImVec2(1, 1), const ImVec2& uv4 = ImVec2(0, 1), ImU32 col = IM_COL32_WHITE); - IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags = 0); - - // Stateful path API, add points then finish with PathFillConvex() or PathStroke() - // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. - inline void PathClear() { _Path.Size = 0; } - inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); } - inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); } - inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } - inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; } - IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0); - IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle - IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points) - IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points) - IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0); - - // Advanced - IMGUI_API void AddCallback(ImDrawCallback callback, void* callback_data); // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles. - IMGUI_API void AddDrawCmd(); // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible - IMGUI_API ImDrawList* CloneOutput() const; // Create a clone of the CmdBuffer/IdxBuffer/VtxBuffer. - - // Advanced: Channels - // - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives) - // - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end) - // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place! - // Prefer using your own persistent instance of ImDrawListSplitter as you can stack them. - // Using the ImDrawList::ChannelsXXXX you cannot stack a split over another. - inline void ChannelsSplit(int count) { _Splitter.Split(this, count); } - inline void ChannelsMerge() { _Splitter.Merge(this); } - inline void ChannelsSetCurrent(int n) { _Splitter.SetCurrentChannel(this, n); } - - // Advanced: Primitives allocations - // - We render triangles (three vertices) - // - All primitives needs to be reserved via PrimReserve() beforehand. - IMGUI_API void PrimReserve(int idx_count, int vtx_count); - IMGUI_API void PrimUnreserve(int idx_count, int vtx_count); - IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col); // Axis aligned rectangle (composed of two triangles) - IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col); - IMGUI_API void PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col); - inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; } - inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; } - inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021) - inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021) -#endif - - // [Internal helpers] - IMGUI_API void _ResetForNewFrame(); - IMGUI_API void _ClearFreeMemory(); - IMGUI_API void _PopUnusedDrawCmd(); - IMGUI_API void _TryMergeDrawCmds(); - IMGUI_API void _OnChangedClipRect(); - IMGUI_API void _OnChangedTextureID(); - IMGUI_API void _OnChangedVtxOffset(); - IMGUI_API int _CalcCircleAutoSegmentCount(float radius) const; - IMGUI_API void _PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step); - IMGUI_API void _PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments); -}; - -// All draw data to render a Dear ImGui frame -// (NB: the style and the naming convention here is a little inconsistent, we currently preserve them for backward compatibility purpose, -// as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList) -struct ImDrawData -{ - bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. - int CmdListsCount; // Number of ImDrawList* to render - int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size - int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size - ImDrawList** CmdLists; // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here. - ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications) - ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications) - ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display. - - // Functions - ImDrawData() { Clear(); } - void Clear() { memset(this, 0, sizeof(*this)); } // The ImDrawList are owned by ImGuiContext! - IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! - IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. -}; - -//----------------------------------------------------------------------------- -// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont) -//----------------------------------------------------------------------------- - -struct ImFontConfig -{ - void* FontData; // // TTF/OTF data - int FontDataSize; // // TTF/OTF data size - bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself). - int FontNo; // 0 // Index of font within TTF/OTF file - float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height). - int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal so you can reduce this to 2 to save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. - int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis. - bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1. - ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now. - ImVec2 GlyphOffset; // 0, 0 // Offset all glyphs from this font input. - const ImWchar* GlyphRanges; // NULL // Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE. - float GlyphMinAdvanceX; // 0 // Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font - float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs - bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights. - unsigned int FontBuilderFlags; // 0 // Settings for custom font builder. THIS IS BUILDER IMPLEMENTATION DEPENDENT. Leave as zero if unsure. - float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. - ImWchar EllipsisChar; // -1 // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used. - - // [Internal] - char Name[40]; // Name (strictly to ease debugging) - ImFont* DstFont; - - IMGUI_API ImFontConfig(); -}; - -// Hold rendering data for one glyph. -// (Note: some language parsers may fail to convert the 31+1 bitfield members, in this case maybe drop store a single u32 or we can rework this) -struct ImFontGlyph -{ - unsigned int Colored : 1; // Flag to indicate glyph is colored and should generally ignore tinting (make it usable with no shift on little-endian as this is used in loops) - unsigned int Visible : 1; // Flag to indicate glyph has no visible pixels (e.g. space). Allow early out when rendering. - unsigned int Codepoint : 30; // 0x0000..0x10FFFF - float AdvanceX; // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in) - float X0, Y0, X1, Y1; // Glyph corners - float U0, V0, U1, V1; // Texture coordinates -}; - -// Helper to build glyph ranges from text/string data. Feed your application strings/characters to it then call BuildRanges(). -// This is essentially a tightly packed of vector of 64k booleans = 8KB storage. -struct ImFontGlyphRangesBuilder -{ - ImVector UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used) - - ImFontGlyphRangesBuilder() { Clear(); } - inline void Clear() { int size_in_bytes = (IM_UNICODE_CODEPOINT_MAX + 1) / 8; UsedChars.resize(size_in_bytes / (int)sizeof(ImU32)); memset(UsedChars.Data, 0, (size_t)size_in_bytes); } - inline bool GetBit(size_t n) const { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); return (UsedChars[off] & mask) != 0; } // Get bit n in the array - inline void SetBit(size_t n) { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); UsedChars[off] |= mask; } // Set bit n in the array - inline void AddChar(ImWchar c) { SetBit(c); } // Add character - IMGUI_API void AddText(const char* text, const char* text_end = NULL); // Add string (each character of the UTF-8 string are added) - IMGUI_API void AddRanges(const ImWchar* ranges); // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault()) to force add all of ASCII/Latin+Ext - IMGUI_API void BuildRanges(ImVector* out_ranges); // Output new ranges -}; - -// See ImFontAtlas::AddCustomRectXXX functions. -struct ImFontAtlasCustomRect -{ - unsigned short Width, Height; // Input // Desired rectangle dimension - unsigned short X, Y; // Output // Packed position in Atlas - unsigned int GlyphID; // Input // For custom font glyphs only (ID < 0x110000) - float GlyphAdvanceX; // Input // For custom font glyphs only: glyph xadvance - ImVec2 GlyphOffset; // Input // For custom font glyphs only: glyph display offset - ImFont* Font; // Input // For custom font glyphs only: target font - ImFontAtlasCustomRect() { Width = Height = 0; X = Y = 0xFFFF; GlyphID = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; } - bool IsPacked() const { return X != 0xFFFF; } -}; - -// Flags for ImFontAtlas build -enum ImFontAtlasFlags_ -{ - ImFontAtlasFlags_None = 0, - ImFontAtlasFlags_NoPowerOfTwoHeight = 1 << 0, // Don't round the height to next power of two - ImFontAtlasFlags_NoMouseCursors = 1 << 1, // Don't build software mouse cursors into the atlas (save a little texture memory) - ImFontAtlasFlags_NoBakedLines = 1 << 2, // Don't build thick line textures into the atlas (save a little texture memory, allow support for point/nearest filtering). The AntiAliasedLinesUseTex features uses them, otherwise they will be rendered using polygons (more expensive for CPU/GPU). -}; - -// Load and rasterize multiple TTF/OTF fonts into a same texture. The font atlas will build a single texture holding: -// - One or more fonts. -// - Custom graphics data needed to render the shapes needed by Dear ImGui. -// - Mouse cursor shapes for software cursor rendering (unless setting 'Flags |= ImFontAtlasFlags_NoMouseCursors' in the font atlas). -// It is the user-code responsibility to setup/build the atlas, then upload the pixel data into a texture accessible by your graphics api. -// - Optionally, call any of the AddFont*** functions. If you don't call any, the default font embedded in the code will be loaded for you. -// - Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data. -// - Upload the pixels data into a texture within your graphics system (see imgui_impl_xxxx.cpp examples) -// - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API. -// This value will be passed back to you during rendering to identify the texture. Read FAQ entry about ImTextureID for more details. -// Common pitfalls: -// - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the -// atlas is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data. -// - Important: By default, AddFontFromMemoryTTF() takes ownership of the data. Even though we are not writing to it, we will free the pointer on destruction. -// You can set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed, -// - Even though many functions are suffixed with "TTF", OTF data is supported just as well. -// - This is an old API and it is currently awkward for those and and various other reasons! We will address them in the future! -struct ImFontAtlas -{ - IMGUI_API ImFontAtlas(); - IMGUI_API ~ImFontAtlas(); - IMGUI_API ImFont* AddFont(const ImFontConfig* font_cfg); - IMGUI_API ImFont* AddFontDefault(const ImFontConfig* font_cfg = NULL); - IMGUI_API ImFont* AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); - IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed. - IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp. - IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter. - IMGUI_API void ClearInputData(); // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts. - IMGUI_API void ClearTexData(); // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory. - IMGUI_API void ClearFonts(); // Clear output font data (glyphs storage, UV coordinates). - IMGUI_API void Clear(); // Clear all input and output. - - // Build atlas, retrieve pixel data. - // User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID(). - // The pitch is always = Width * BytesPerPixels (1 or 4) - // Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into - // the texture (e.g. when using the AddCustomRect*** api), then the RGB pixels emitted will always be white (~75% of memory/bandwidth waste. - IMGUI_API bool Build(); // Build pixels data. This is called automatically for you by the GetTexData*** functions. - IMGUI_API void GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 1 byte per-pixel - IMGUI_API void GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 4 bytes-per-pixel - bool IsBuilt() const { return Fonts.Size > 0 && TexReady; } // Bit ambiguous: used to detect when user didn't built texture but effectively we should check TexID != 0 except that would be backend dependent... - void SetTexID(ImTextureID id) { TexID = id; } - - //------------------------------------------- - // Glyph Ranges - //------------------------------------------- - - // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list) - // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details. - // NB: Consider using ImFontGlyphRangesBuilder to build glyph ranges from textual data. - IMGUI_API const ImWchar* GetGlyphRangesDefault(); // Basic Latin, Extended Latin - IMGUI_API const ImWchar* GetGlyphRangesKorean(); // Default + Korean characters - IMGUI_API const ImWchar* GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 2999 Ideographs - IMGUI_API const ImWchar* GetGlyphRangesChineseFull(); // Default + Half-Width + Japanese Hiragana/Katakana + full set of about 21000 CJK Unified Ideographs - IMGUI_API const ImWchar* GetGlyphRangesChineseSimplifiedCommon();// Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese - IMGUI_API const ImWchar* GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters - IMGUI_API const ImWchar* GetGlyphRangesThai(); // Default + Thai characters - IMGUI_API const ImWchar* GetGlyphRangesVietnamese(); // Default + Vietnamese characters - - //------------------------------------------- - // [BETA] Custom Rectangles/Glyphs API - //------------------------------------------- - - // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. - // - After calling Build(), you can query the rectangle position and render your pixels. - // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of prefered texture format. - // - You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), - // so you can render e.g. custom colorful icons and use them as regular glyphs. - // - Read docs/FONTS.md for more details about using colorful icons. - // - Note: this API may be redesigned later in order to support multi-monitor varying DPI settings. - IMGUI_API int AddCustomRectRegular(int width, int height); - IMGUI_API int AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0, 0)); - ImFontAtlasCustomRect* GetCustomRectByIndex(int index) { IM_ASSERT(index >= 0); return &CustomRects[index]; } - - // [Internal] - IMGUI_API void CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const; - IMGUI_API bool GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]); - - //------------------------------------------- - // Members - //------------------------------------------- - - ImFontAtlasFlags Flags; // Build flags (see ImFontAtlasFlags_) - ImTextureID TexID; // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure. - int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height. - int TexGlyphPadding; // Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0 (will also need to set AntiAliasedLinesUseTex = false). - bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert. - - // [Internal] - // NB: Access texture data via GetTexData*() calls! Which will setup a default font for you. - bool TexReady; // Set when texture was built matching current font input - bool TexPixelsUseColors; // Tell whether our texture data is known to use colors (rather than just alpha channel), in order to help backend select a format. - unsigned char* TexPixelsAlpha8; // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight - unsigned int* TexPixelsRGBA32; // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4 - int TexWidth; // Texture width calculated during Build(). - int TexHeight; // Texture height calculated during Build(). - ImVec2 TexUvScale; // = (1.0f/TexWidth, 1.0f/TexHeight) - ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel - ImVector Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font. - ImVector CustomRects; // Rectangles for packing custom texture data into the atlas. - ImVector ConfigData; // Configuration data - ImVec4 TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1]; // UVs for baked anti-aliased lines - - // [Internal] Font builder - const ImFontBuilderIO* FontBuilderIO; // Opaque interface to a font builder (default to stb_truetype, can be changed to use FreeType by defining IMGUI_ENABLE_FREETYPE). - unsigned int FontBuilderFlags; // Shared flags (for all fonts) for custom font builder. THIS IS BUILD IMPLEMENTATION DEPENDENT. Per-font override is also available in ImFontConfig. - - // [Internal] Packing data - int PackIdMouseCursors; // Custom texture rectangle ID for white pixel and mouse cursors - int PackIdLines; // Custom texture rectangle ID for baked anti-aliased lines - - // [Obsolete] - //typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+ - //typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+ -}; - -// Font runtime data and rendering -// ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32(). -struct ImFont -{ - // Members: Hot ~20/24 bytes (for CalcTextSize) - ImVector IndexAdvanceX; // 12-16 // out // // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this this info, and are often bottleneck in large UI). - float FallbackAdvanceX; // 4 // out // = FallbackGlyph->AdvanceX - float FontSize; // 4 // in // // Height of characters/line, set during loading (don't change after loading) - - // Members: Hot ~28/40 bytes (for CalcTextSize + render loop) - ImVector IndexLookup; // 12-16 // out // // Sparse. Index glyphs by Unicode code-point. - ImVector Glyphs; // 12-16 // out // // All glyphs. - const ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar) - - // Members: Cold ~32/40 bytes - ImFontAtlas* ContainerAtlas; // 4-8 // out // // What we has been loaded into - const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData - short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont. - ImWchar FallbackChar; // 2 // out // = FFFD/'?' // Character used if a glyph isn't found. - ImWchar EllipsisChar; // 2 // out // = '...' // Character used for ellipsis rendering. - ImWchar DotChar; // 2 // out // = '.' // Character used for ellipsis rendering (if a single '...' character isn't found) - bool DirtyLookupTables; // 1 // out // - float Scale; // 4 // in // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale() - float Ascent, Descent; // 4+4 // out // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] - int MetricsTotalSurface;// 4 // out // // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs) - ImU8 Used4kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/4096/8]; // 2 bytes if ImWchar=ImWchar16, 34 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints. - - // Methods - IMGUI_API ImFont(); - IMGUI_API ~ImFont(); - IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const; - IMGUI_API const ImFontGlyph*FindGlyphNoFallback(ImWchar c) const; - float GetCharAdvance(ImWchar c) const { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; } - bool IsLoaded() const { return ContainerAtlas != NULL; } - const char* GetDebugName() const { return ConfigData ? ConfigData->Name : ""; } - - // 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable. - // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable. - IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8 - IMGUI_API const char* CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const; - IMGUI_API void RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c) const; - IMGUI_API void RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const; - - // [Internal] Don't use! - IMGUI_API void BuildLookupTable(); - IMGUI_API void ClearOutputData(); - IMGUI_API void GrowIndex(int new_size); - IMGUI_API void AddGlyph(const ImFontConfig* src_cfg, ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x); - IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built. - IMGUI_API void SetGlyphVisible(ImWchar c, bool visible); - IMGUI_API bool IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last); -}; - -//----------------------------------------------------------------------------- -// [SECTION] Viewports -//----------------------------------------------------------------------------- - -// Flags stored in ImGuiViewport::Flags, giving indications to the platform backends. -enum ImGuiViewportFlags_ -{ - ImGuiViewportFlags_None = 0, - ImGuiViewportFlags_IsPlatformWindow = 1 << 0, // Represent a Platform Window - ImGuiViewportFlags_IsPlatformMonitor = 1 << 1, // Represent a Platform Monitor (unused yet) - ImGuiViewportFlags_OwnedByApp = 1 << 2, // Platform Window: is created/managed by the application (rather than a dear imgui backend) -}; - -// - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. -// - In 'docking' branch with multi-viewport enabled, we extend this concept to have multiple active viewports. -// - In the future we will extend this concept further to also represent Platform Monitor and support a "no main platform window" operation mode. -// - About Main Area vs Work Area: -// - Main Area = entire viewport. -// - Work Area = entire viewport minus sections used by main menu bars (for platform windows), or by task bar (for platform monitor). -// - Windows are generally trying to stay within the Work Area of their host viewport. -struct ImGuiViewport -{ - ImGuiViewportFlags Flags; // See ImGuiViewportFlags_ - ImVec2 Pos; // Main Area: Position of the viewport (Dear ImGui coordinates are the same as OS desktop/native coordinates) - ImVec2 Size; // Main Area: Size of the viewport. - ImVec2 WorkPos; // Work Area: Position of the viewport minus task bars, menus bars, status bars (>= Pos) - ImVec2 WorkSize; // Work Area: Size of the viewport minus task bars, menu bars, status bars (<= Size) - - // Platform/Backend Dependent Data - void* PlatformHandleRaw; // void* to hold lower-level, platform-native window handle (under Win32 this is expected to be a HWND, unused for other platforms) - - ImGuiViewport() { memset(this, 0, sizeof(*this)); } - - // Helpers - ImVec2 GetCenter() const { return ImVec2(Pos.x + Size.x * 0.5f, Pos.y + Size.y * 0.5f); } - ImVec2 GetWorkCenter() const { return ImVec2(WorkPos.x + WorkSize.x * 0.5f, WorkPos.y + WorkSize.y * 0.5f); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Platform Dependent Interfaces -//----------------------------------------------------------------------------- - -// (Optional) Support for IME (Input Method Editor) via the io.SetPlatformImeDataFn() function. -struct ImGuiPlatformImeData -{ - bool WantVisible; // A widget wants the IME to be visible - ImVec2 InputPos; // Position of the input cursor - float InputLineHeight; // Line height - - ImGuiPlatformImeData() { memset(this, 0, sizeof(*this)); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Obsolete functions and types -// (Will be removed! Read 'API BREAKING CHANGES' section in imgui.cpp for details) -// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead. -//----------------------------------------------------------------------------- - -namespace ImGui -{ -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - IMGUI_API int GetKeyIndex(ImGuiKey key); // map ImGuiKey_* values into legacy native key index. == io.KeyMap[key] -#else - static inline int GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END && "ImGuiKey and native_index was merged together and native_index is disabled by IMGUI_DISABLE_OBSOLETE_KEYIO. Please switch to ImGuiKey."); return key; } -#endif -} - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -namespace ImGui -{ - // OBSOLETED in 1.88 (from May 2022) - static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value. - static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value. - // OBSOLETED in 1.86 (from November 2021) - IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Calculate coarse clipping for large list of evenly sized items. Prefer using ImGuiListClipper. - // OBSOLETED in 1.85 (from August 2021) - static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; } - // OBSOLETED in 1.81 (from February 2021) - IMGUI_API bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // Helper to calculate size from items_count and height_in_items - static inline bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)) { return BeginListBox(label, size); } - static inline void ListBoxFooter() { EndListBox(); } - // OBSOLETED in 1.79 (from August 2020) - static inline void OpenPopupContextItem(const char* str_id = NULL, ImGuiMouseButton mb = 1) { OpenPopupOnItemClick(str_id, mb); } // Bool return value removed. Use IsWindowAppearing() in BeginPopup() instead. Renamed in 1.77, renamed back in 1.79. Sorry! - // OBSOLETED in 1.78 (from June 2020) - // Old drag/sliders functions that took a 'float power = 1.0' argument instead of flags. - // For shared code, you can version check at compile-time with `#if IMGUI_VERSION_NUM >= 17704`. - IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power); - IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power); - static inline bool DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, power); } - static inline bool DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, power); } - static inline bool DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, power); } - static inline bool DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, power); } - IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power); - IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format, float power); - static inline bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, float power) { return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, power); } - static inline bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, power); } - static inline bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, power); } - static inline bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, power); } - // OBSOLETED in 1.77 (from June 2020) - static inline bool BeginPopupContextWindow(const char* str_id, ImGuiMouseButton mb, bool over_items) { return BeginPopupContextWindow(str_id, mb | (over_items ? 0 : ImGuiPopupFlags_NoOpenOverItems)); } - - // Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE) - //static inline void TreeAdvanceToLabelPos() { SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()); } // OBSOLETED in 1.72 (from July 2019) - //static inline void SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0) { SetNextItemOpen(open, cond); } // OBSOLETED in 1.71 (from June 2019) - //static inline float GetContentRegionAvailWidth() { return GetContentRegionAvail().x; } // OBSOLETED in 1.70 (from May 2019) - //static inline ImDrawList* GetOverlayDrawList() { return GetForegroundDrawList(); } // OBSOLETED in 1.69 (from Mar 2019) - //static inline void SetScrollHere(float ratio = 0.5f) { SetScrollHereY(ratio); } // OBSOLETED in 1.66 (from Nov 2018) - //static inline bool IsItemDeactivatedAfterChange() { return IsItemDeactivatedAfterEdit(); } // OBSOLETED in 1.63 (from Aug 2018) - //static inline bool IsAnyWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_AnyWindow); } // OBSOLETED in 1.60 (from Apr 2018) - //static inline bool IsAnyWindowHovered() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); } // OBSOLETED in 1.60 (between Dec 2017 and Apr 2018) - //static inline void ShowTestWindow() { return ShowDemoWindow(); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) - //static inline bool IsRootWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootWindow); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) - //static inline bool IsRootWindowOrAnyChildFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) - //static inline void SetNextWindowContentWidth(float w) { SetNextWindowContentSize(ImVec2(w, 0.0f)); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) - //static inline float GetItemsLineHeightWithSpacing() { return GetFrameHeightWithSpacing(); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) -} - -// OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() -typedef ImDrawFlags ImDrawCornerFlags; -enum ImDrawCornerFlags_ -{ - ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit - ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally). - ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82. - ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82. - ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82. - ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82 - ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, - ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, - ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, - ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight, -}; - -// RENAMED ImGuiKeyModFlags -> ImGuiModFlags in 1.88 (from April 2022) -typedef int ImGuiKeyModFlags; -enum ImGuiKeyModFlags_ { ImGuiKeyModFlags_None = ImGuiModFlags_None, ImGuiKeyModFlags_Ctrl = ImGuiModFlags_Ctrl, ImGuiKeyModFlags_Shift = ImGuiModFlags_Shift, ImGuiKeyModFlags_Alt = ImGuiModFlags_Alt, ImGuiKeyModFlags_Super = ImGuiModFlags_Super }; - -#endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - -// RENAMED IMGUI_DISABLE_METRICS_WINDOW > IMGUI_DISABLE_DEBUG_TOOLS in 1.88 (from June 2022) -#if defined(IMGUI_DISABLE_METRICS_WINDOW) && !defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) && !defined(IMGUI_DISABLE_DEBUG_TOOLS) -#define IMGUI_DISABLE_DEBUG_TOOLS -#endif -#if defined(IMGUI_DISABLE_METRICS_WINDOW) && defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) -#error IMGUI_DISABLE_METRICS_WINDOW was renamed to IMGUI_DISABLE_DEBUG_TOOLS, please use new name. -#endif - -//----------------------------------------------------------------------------- - -#if defined(__clang__) -#pragma clang diagnostic pop -#elif defined(__GNUC__) -#pragma GCC diagnostic pop -#endif - -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -// Include imgui_user.h at the end of imgui.h (convenient for user to only explicitly include vanilla imgui.h) -#ifdef IMGUI_INCLUDE_IMGUI_USER_H -#include "imgui_user.h" -#endif - -#endif // #ifndef IMGUI_DISABLE diff --git a/dependencies/reboot/vendor/ImGui/imgui_demo.cpp b/dependencies/reboot/vendor/ImGui/imgui_demo.cpp deleted file mode 100644 index 2f63517..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_demo.cpp +++ /dev/null @@ -1,7970 +0,0 @@ -// dear imgui, v1.89 WIP -// (demo code) - -// Help: -// - Read FAQ at http://dearimgui.org/faq -// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. -// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. -// Read imgui.cpp for more details, documentation and comments. -// Get the latest version at https://github.com/ocornut/imgui - -// Message to the person tempted to delete this file when integrating Dear ImGui into their codebase: -// Do NOT remove this file from your project! Think again! It is the most useful reference code that you and other -// coders will want to refer to and call. Have the ImGui::ShowDemoWindow() function wired in an always-available -// debug menu of your game/app! Removing this file from your project is hindering access to documentation for everyone -// in your team, likely leading you to poorer usage of the library. -// Everything in this file will be stripped out by the linker if you don't call ImGui::ShowDemoWindow(). -// If you want to link core Dear ImGui in your shipped builds but want a thorough guarantee that the demo will not be -// linked, you can setup your imconfig.h with #define IMGUI_DISABLE_DEMO_WINDOWS and those functions will be empty. -// In another situation, whenever you have Dear ImGui available you probably want this to be available for reference. -// Thank you, -// -Your beloved friend, imgui_demo.cpp (which you won't delete) - -// Message to beginner C/C++ programmers about the meaning of the 'static' keyword: -// In this demo code, we frequently use 'static' variables inside functions. A static variable persists across calls, -// so it is essentially like a global variable but declared inside the scope of the function. We do this as a way to -// gather code and data in the same place, to make the demo source code faster to read, faster to write, and smaller -// in size. It also happens to be a convenient way of storing simple UI related information as long as your function -// doesn't need to be reentrant or used in multiple threads. This might be a pattern you will want to use in your code, -// but most of the real data you would be editing is likely going to be stored outside your functions. - -// The Demo code in this file is designed to be easy to copy-and-paste into your application! -// Because of this: -// - We never omit the ImGui:: prefix when calling functions, even though most code here is in the same namespace. -// - We try to declare static variables in the local scope, as close as possible to the code using them. -// - We never use any of the helpers/facilities used internally by Dear ImGui, unless available in the public API. -// - We never use maths operators on ImVec2/ImVec4. For our other sources files we use them, and they are provided -// by imgui_internal.h using the IMGUI_DEFINE_MATH_OPERATORS define. For your own sources file they are optional -// and require you either enable those, either provide your own via IM_VEC2_CLASS_EXTRA in imconfig.h. -// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp. - -// Navigating this file: -// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. - -/* - -Index of this file: - -// [SECTION] Forward Declarations, Helpers -// [SECTION] Demo Window / ShowDemoWindow() -// - sub section: ShowDemoWindowWidgets() -// - sub section: ShowDemoWindowLayout() -// - sub section: ShowDemoWindowPopups() -// - sub section: ShowDemoWindowTables() -// - sub section: ShowDemoWindowMisc() -// [SECTION] About Window / ShowAboutWindow() -// [SECTION] Style Editor / ShowStyleEditor() -// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() -// [SECTION] Example App: Debug Console / ShowExampleAppConsole() -// [SECTION] Example App: Debug Log / ShowExampleAppLog() -// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() -// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() -// [SECTION] Example App: Long Text / ShowExampleAppLongText() -// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() -// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() -// [SECTION] Example App: Simple overlay / ShowExampleAppSimpleOverlay() -// [SECTION] Example App: Fullscreen window / ShowExampleAppFullscreen() -// [SECTION] Example App: Manipulating window titles / ShowExampleAppWindowTitles() -// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() -// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() - -*/ - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#ifndef IMGUI_DISABLE - -// System includes -#include // toupper -#include // INT_MIN, INT_MAX -#include // sqrtf, powf, cosf, sinf, floorf, ceilf -#include // vsnprintf, sscanf, printf -#include // NULL, malloc, free, atoi -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else -#include // intptr_t -#endif - -// Visual Studio warnings -#ifdef _MSC_VER -#pragma warning (disable: 4127) // condition expression is constant -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). -#endif - -// Clang/GCC warnings with -Weverything -#if defined(__clang__) -#if __has_warning("-Wunknown-warning-option") -#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' -#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wdeprecated-declarations" // warning: 'xx' is deprecated: The POSIX name for this.. // for strdup used in demo code (so user can copy & paste the code) -#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type -#pragma clang diagnostic ignored "-Wformat-security" // warning: format string is not a string literal -#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. -#pragma clang diagnostic ignored "-Wunused-macros" // warning: macro is not used // we define snprintf/vsnprintf on Windows so they are available, but not always used. -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. -#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier -#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision -#elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind -#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size -#pragma GCC diagnostic ignored "-Wformat-security" // warning: format string is not a string literal (potentially insecure) -#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function -#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value -#pragma GCC diagnostic ignored "-Wmisleading-indentation" // [__GNUC__ >= 6] warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub. -#endif - -// Play it nice with Windows users (Update: May 2018, Notepad now supports Unix-style carriage returns!) -#ifdef _WIN32 -#define IM_NEWLINE "\r\n" -#else -#define IM_NEWLINE "\n" -#endif - -// Helpers -#if defined(_MSC_VER) && !defined(snprintf) -#define snprintf _snprintf -#endif -#if defined(_MSC_VER) && !defined(vsnprintf) -#define vsnprintf _vsnprintf -#endif - -// Format specifiers, printing 64-bit hasn't been decently standardized... -// In a real application you should be using PRId64 and PRIu64 from (non-windows) and on Windows define them yourself. -#ifdef _MSC_VER -#define IM_PRId64 "I64d" -#define IM_PRIu64 "I64u" -#else -#define IM_PRId64 "lld" -#define IM_PRIu64 "llu" -#endif - -// Helpers macros -// We normally try to not use many helpers in imgui_demo.cpp in order to make code easier to copy and paste, -// but making an exception here as those are largely simplifying code... -// In other imgui sources we can use nicer internal functions from imgui_internal.h (ImMin/ImMax) but not in the demo. -#define IM_MIN(A, B) (((A) < (B)) ? (A) : (B)) -#define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B)) -#define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V)) - -// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall -#ifndef IMGUI_CDECL -#ifdef _MSC_VER -#define IMGUI_CDECL __cdecl -#else -#define IMGUI_CDECL -#endif -#endif - -//----------------------------------------------------------------------------- -// [SECTION] Forward Declarations, Helpers -//----------------------------------------------------------------------------- - -#if !defined(IMGUI_DISABLE_DEMO_WINDOWS) - -// Forward Declarations -static void ShowExampleAppDocuments(bool* p_open); -static void ShowExampleAppMainMenuBar(); -static void ShowExampleAppConsole(bool* p_open); -static void ShowExampleAppLog(bool* p_open); -static void ShowExampleAppLayout(bool* p_open); -static void ShowExampleAppPropertyEditor(bool* p_open); -static void ShowExampleAppLongText(bool* p_open); -static void ShowExampleAppAutoResize(bool* p_open); -static void ShowExampleAppConstrainedResize(bool* p_open); -static void ShowExampleAppSimpleOverlay(bool* p_open); -static void ShowExampleAppFullscreen(bool* p_open); -static void ShowExampleAppWindowTitles(bool* p_open); -static void ShowExampleAppCustomRendering(bool* p_open); -static void ShowExampleMenuFile(); - -// Helper to display a little (?) mark which shows a tooltip when hovered. -// In your own code you may want to display an actual icon if you are using a merged icon fonts (see docs/FONTS.md) -static void HelpMarker(const char* desc) -{ - ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); - ImGui::TextUnformatted(desc); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } -} - -// Helper to wire demo markers located in code to a interactive browser -typedef void (*ImGuiDemoMarkerCallback)(const char* file, int line, const char* section, void* user_data); -extern ImGuiDemoMarkerCallback GImGuiDemoMarkerCallback; -extern void* GImGuiDemoMarkerCallbackUserData; -ImGuiDemoMarkerCallback GImGuiDemoMarkerCallback = NULL; -void* GImGuiDemoMarkerCallbackUserData = NULL; -#define IMGUI_DEMO_MARKER(section) do { if (GImGuiDemoMarkerCallback != NULL) GImGuiDemoMarkerCallback(__FILE__, __LINE__, section, GImGuiDemoMarkerCallbackUserData); } while (0) - -// Helper to display basic user controls. -void ImGui::ShowUserGuide() -{ - ImGuiIO& io = ImGui::GetIO(); - ImGui::BulletText("Double-click on title bar to collapse window."); - ImGui::BulletText( - "Click and drag on lower corner to resize window\n" - "(double-click to auto fit window to its contents)."); - ImGui::BulletText("CTRL+Click on a slider or drag box to input value as text."); - ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields."); - ImGui::BulletText("CTRL+Tab to select a window."); - if (io.FontAllowUserScaling) - ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents."); - ImGui::BulletText("While inputing text:\n"); - ImGui::Indent(); - ImGui::BulletText("CTRL+Left/Right to word jump."); - ImGui::BulletText("CTRL+A or double-click to select all."); - ImGui::BulletText("CTRL+X/C/V to use clipboard cut/copy/paste."); - ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo."); - ImGui::BulletText("ESCAPE to revert."); - ImGui::Unindent(); - ImGui::BulletText("With keyboard navigation enabled:"); - ImGui::Indent(); - ImGui::BulletText("Arrow keys to navigate."); - ImGui::BulletText("Space to activate a widget."); - ImGui::BulletText("Return to input text into a widget."); - ImGui::BulletText("Escape to deactivate a widget, close popup, exit child window."); - ImGui::BulletText("Alt to jump to the menu layer of a window."); - ImGui::Unindent(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Demo Window / ShowDemoWindow() -//----------------------------------------------------------------------------- -// - ShowDemoWindowWidgets() -// - ShowDemoWindowLayout() -// - ShowDemoWindowPopups() -// - ShowDemoWindowTables() -// - ShowDemoWindowColumns() -// - ShowDemoWindowMisc() -//----------------------------------------------------------------------------- - -// We split the contents of the big ShowDemoWindow() function into smaller functions -// (because the link time of very large functions grow non-linearly) -static void ShowDemoWindowWidgets(); -static void ShowDemoWindowLayout(); -static void ShowDemoWindowPopups(); -static void ShowDemoWindowTables(); -static void ShowDemoWindowColumns(); -static void ShowDemoWindowMisc(); - -// Demonstrate most Dear ImGui features (this is big function!) -// You may execute this function to experiment with the UI and understand what it does. -// You may then search for keywords in the code when you are interested by a specific feature. -void ImGui::ShowDemoWindow(bool* p_open) -{ - // Exceptionally add an extra assert here for people confused about initial Dear ImGui setup - // Most ImGui functions would normally just crash if the context is missing. - IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing dear imgui context. Refer to examples app!"); - - // Examples Apps (accessible from the "Examples" menu) - static bool show_app_main_menu_bar = false; - static bool show_app_documents = false; - - static bool show_app_console = false; - static bool show_app_log = false; - static bool show_app_layout = false; - static bool show_app_property_editor = false; - static bool show_app_long_text = false; - static bool show_app_auto_resize = false; - static bool show_app_constrained_resize = false; - static bool show_app_simple_overlay = false; - static bool show_app_fullscreen = false; - static bool show_app_window_titles = false; - static bool show_app_custom_rendering = false; - - if (show_app_main_menu_bar) ShowExampleAppMainMenuBar(); - if (show_app_documents) ShowExampleAppDocuments(&show_app_documents); - - if (show_app_console) ShowExampleAppConsole(&show_app_console); - if (show_app_log) ShowExampleAppLog(&show_app_log); - if (show_app_layout) ShowExampleAppLayout(&show_app_layout); - if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor); - if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text); - if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize); - if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize); - if (show_app_simple_overlay) ShowExampleAppSimpleOverlay(&show_app_simple_overlay); - if (show_app_fullscreen) ShowExampleAppFullscreen(&show_app_fullscreen); - if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles); - if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering); - - // Dear ImGui Apps (accessible from the "Tools" menu) - static bool show_app_metrics = false; - static bool show_app_debug_log = false; - static bool show_app_stack_tool = false; - static bool show_app_about = false; - static bool show_app_style_editor = false; - - if (show_app_metrics) - ImGui::ShowMetricsWindow(&show_app_metrics); - if (show_app_debug_log) - ImGui::ShowDebugLogWindow(&show_app_debug_log); - if (show_app_stack_tool) - ImGui::ShowStackToolWindow(&show_app_stack_tool); - if (show_app_about) - ImGui::ShowAboutWindow(&show_app_about); - if (show_app_style_editor) - { - ImGui::Begin("Dear ImGui Style Editor", &show_app_style_editor); - ImGui::ShowStyleEditor(); - ImGui::End(); - } - - // Demonstrate the various window flags. Typically you would just use the default! - static bool no_titlebar = false; - static bool no_scrollbar = false; - static bool no_menu = false; - static bool no_move = false; - static bool no_resize = false; - static bool no_collapse = false; - static bool no_close = false; - static bool no_nav = false; - static bool no_background = false; - static bool no_bring_to_front = false; - static bool unsaved_document = false; - - ImGuiWindowFlags window_flags = 0; - if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar; - if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar; - if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar; - if (no_move) window_flags |= ImGuiWindowFlags_NoMove; - if (no_resize) window_flags |= ImGuiWindowFlags_NoResize; - if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse; - if (no_nav) window_flags |= ImGuiWindowFlags_NoNav; - if (no_background) window_flags |= ImGuiWindowFlags_NoBackground; - if (no_bring_to_front) window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus; - if (unsaved_document) window_flags |= ImGuiWindowFlags_UnsavedDocument; - if (no_close) p_open = NULL; // Don't pass our bool* to Begin - - // We specify a default position/size in case there's no data in the .ini file. - // We only do it to make the demo applications a little more welcoming, but typically this isn't required. - const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); - ImGui::SetNextWindowPos(ImVec2(main_viewport->WorkPos.x + 650, main_viewport->WorkPos.y + 20), ImGuiCond_FirstUseEver); - ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver); - - // Main body of the Demo window starts here. - if (!ImGui::Begin("Dear ImGui Demo", p_open, window_flags)) - { - // Early out if the window is collapsed, as an optimization. - ImGui::End(); - return; - } - - // Most "big" widgets share a common width settings by default. See 'Demo->Layout->Widgets Width' for details. - - // e.g. Use 2/3 of the space for widgets and 1/3 for labels (right align) - //ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f); - - // e.g. Leave a fixed amount of width for labels (by passing a negative value), the rest goes to widgets. - ImGui::PushItemWidth(ImGui::GetFontSize() * -12); - - // Menu Bar - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("Menu")) - { - IMGUI_DEMO_MARKER("Menu/File"); - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Examples")) - { - IMGUI_DEMO_MARKER("Menu/Examples"); - ImGui::MenuItem("Main menu bar", NULL, &show_app_main_menu_bar); - ImGui::MenuItem("Console", NULL, &show_app_console); - ImGui::MenuItem("Log", NULL, &show_app_log); - ImGui::MenuItem("Simple layout", NULL, &show_app_layout); - ImGui::MenuItem("Property editor", NULL, &show_app_property_editor); - ImGui::MenuItem("Long text display", NULL, &show_app_long_text); - ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize); - ImGui::MenuItem("Constrained-resizing window", NULL, &show_app_constrained_resize); - ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay); - ImGui::MenuItem("Fullscreen window", NULL, &show_app_fullscreen); - ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles); - ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering); - ImGui::MenuItem("Documents", NULL, &show_app_documents); - ImGui::EndMenu(); - } - //if (ImGui::MenuItem("MenuItem")) {} // You can also use MenuItem() inside a menu bar! - if (ImGui::BeginMenu("Tools")) - { - IMGUI_DEMO_MARKER("Menu/Tools"); -#ifndef IMGUI_DISABLE_DEBUG_TOOLS - const bool has_debug_tools = true; -#else - const bool has_debug_tools = false; -#endif - ImGui::MenuItem("Metrics/Debugger", NULL, &show_app_metrics, has_debug_tools); - ImGui::MenuItem("Debug Log", NULL, &show_app_debug_log, has_debug_tools); - ImGui::MenuItem("Stack Tool", NULL, &show_app_stack_tool, has_debug_tools); - ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor); - ImGui::MenuItem("About Dear ImGui", NULL, &show_app_about); - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - - ImGui::Text("dear imgui says hello! (%s) (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM); - ImGui::Spacing(); - - IMGUI_DEMO_MARKER("Help"); - if (ImGui::CollapsingHeader("Help")) - { - ImGui::Text("ABOUT THIS DEMO:"); - ImGui::BulletText("Sections below are demonstrating many aspects of the library."); - ImGui::BulletText("The \"Examples\" menu above leads to more demo contents."); - ImGui::BulletText("The \"Tools\" menu above gives access to: About Box, Style Editor,\n" - "and Metrics/Debugger (general purpose Dear ImGui debugging tool)."); - ImGui::Separator(); - - ImGui::Text("PROGRAMMER GUIDE:"); - ImGui::BulletText("See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!"); - ImGui::BulletText("See comments in imgui.cpp."); - ImGui::BulletText("See example applications in the examples/ folder."); - ImGui::BulletText("Read the FAQ at http://www.dearimgui.org/faq/"); - ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls."); - ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls."); - ImGui::Separator(); - - ImGui::Text("USER GUIDE:"); - ImGui::ShowUserGuide(); - } - - IMGUI_DEMO_MARKER("Configuration"); - if (ImGui::CollapsingHeader("Configuration")) - { - ImGuiIO& io = ImGui::GetIO(); - - if (ImGui::TreeNode("Configuration##2")) - { - ImGui::CheckboxFlags("io.ConfigFlags: NavEnableKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); - ImGui::SameLine(); HelpMarker("Enable keyboard controls."); - ImGui::CheckboxFlags("io.ConfigFlags: NavEnableGamepad", &io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad); - ImGui::SameLine(); HelpMarker("Enable gamepad controls. Require backend to set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details."); - ImGui::CheckboxFlags("io.ConfigFlags: NavEnableSetMousePos", &io.ConfigFlags, ImGuiConfigFlags_NavEnableSetMousePos); - ImGui::SameLine(); HelpMarker("Instruct navigation to move the mouse cursor. See comment for ImGuiConfigFlags_NavEnableSetMousePos."); - ImGui::CheckboxFlags("io.ConfigFlags: NoMouse", &io.ConfigFlags, ImGuiConfigFlags_NoMouse); - if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) - { - // The "NoMouse" option can get us stuck with a disabled mouse! Let's provide an alternative way to fix it: - if (fmodf((float)ImGui::GetTime(), 0.40f) < 0.20f) - { - ImGui::SameLine(); - ImGui::Text("<>"); - } - if (ImGui::IsKeyPressed(ImGuiKey_Space)) - io.ConfigFlags &= ~ImGuiConfigFlags_NoMouse; - } - ImGui::CheckboxFlags("io.ConfigFlags: NoMouseCursorChange", &io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange); - ImGui::SameLine(); HelpMarker("Instruct backend to not alter mouse cursor shape and visibility."); - ImGui::Checkbox("io.ConfigInputTrickleEventQueue", &io.ConfigInputTrickleEventQueue); - ImGui::SameLine(); HelpMarker("Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates."); - ImGui::Checkbox("io.ConfigInputTextCursorBlink", &io.ConfigInputTextCursorBlink); - ImGui::SameLine(); HelpMarker("Enable blinking cursor (optional as some users consider it to be distracting)."); - ImGui::Checkbox("io.ConfigInputTextEnterKeepActive", &io.ConfigInputTextEnterKeepActive); - ImGui::SameLine(); HelpMarker("Pressing Enter will keep item active and select contents (single-line only)."); - ImGui::Checkbox("io.ConfigDragClickToInputText", &io.ConfigDragClickToInputText); - ImGui::SameLine(); HelpMarker("Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving)."); - ImGui::Checkbox("io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges); - ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback."); - ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly); - ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor); - ImGui::SameLine(); HelpMarker("Instruct Dear ImGui to render a mouse cursor itself. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something)."); - ImGui::Text("Also see Style->Rendering for rendering options."); - ImGui::TreePop(); - ImGui::Separator(); - } - - IMGUI_DEMO_MARKER("Configuration/Backend Flags"); - if (ImGui::TreeNode("Backend Flags")) - { - HelpMarker( - "Those flags are set by the backends (imgui_impl_xxx files) to specify their capabilities.\n" - "Here we expose them as read-only fields to avoid breaking interactions with your backend."); - - // Make a local copy to avoid modifying actual backend flags. - // FIXME: We don't use BeginDisabled() to keep label bright, maybe we need a BeginReadonly() equivalent.. - ImGuiBackendFlags backend_flags = io.BackendFlags; - ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", &backend_flags, ImGuiBackendFlags_HasGamepad); - ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &backend_flags, ImGuiBackendFlags_HasMouseCursors); - ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &backend_flags, ImGuiBackendFlags_HasSetMousePos); - ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &backend_flags, ImGuiBackendFlags_RendererHasVtxOffset); - ImGui::TreePop(); - ImGui::Separator(); - } - - IMGUI_DEMO_MARKER("Configuration/Style"); - if (ImGui::TreeNode("Style")) - { - HelpMarker("The same contents can be accessed in 'Tools->Style Editor' or by calling the ShowStyleEditor() function."); - ImGui::ShowStyleEditor(); - ImGui::TreePop(); - ImGui::Separator(); - } - - IMGUI_DEMO_MARKER("Configuration/Capture, Logging"); - if (ImGui::TreeNode("Capture/Logging")) - { - HelpMarker( - "The logging API redirects all text output so you can easily capture the content of " - "a window or a block. Tree nodes can be automatically expanded.\n" - "Try opening any of the contents below in this window and then click one of the \"Log To\" button."); - ImGui::LogButtons(); - - HelpMarker("You can also call ImGui::LogText() to output directly to the log without a visual output."); - if (ImGui::Button("Copy \"Hello, world!\" to clipboard")) - { - ImGui::LogToClipboard(); - ImGui::LogText("Hello, world!"); - ImGui::LogFinish(); - } - ImGui::TreePop(); - } - } - - IMGUI_DEMO_MARKER("Window options"); - if (ImGui::CollapsingHeader("Window options")) - { - if (ImGui::BeginTable("split", 3)) - { - ImGui::TableNextColumn(); ImGui::Checkbox("No titlebar", &no_titlebar); - ImGui::TableNextColumn(); ImGui::Checkbox("No scrollbar", &no_scrollbar); - ImGui::TableNextColumn(); ImGui::Checkbox("No menu", &no_menu); - ImGui::TableNextColumn(); ImGui::Checkbox("No move", &no_move); - ImGui::TableNextColumn(); ImGui::Checkbox("No resize", &no_resize); - ImGui::TableNextColumn(); ImGui::Checkbox("No collapse", &no_collapse); - ImGui::TableNextColumn(); ImGui::Checkbox("No close", &no_close); - ImGui::TableNextColumn(); ImGui::Checkbox("No nav", &no_nav); - ImGui::TableNextColumn(); ImGui::Checkbox("No background", &no_background); - ImGui::TableNextColumn(); ImGui::Checkbox("No bring to front", &no_bring_to_front); - ImGui::TableNextColumn(); ImGui::Checkbox("Unsaved document", &unsaved_document); - ImGui::EndTable(); - } - } - - // All demo contents - ShowDemoWindowWidgets(); - ShowDemoWindowLayout(); - ShowDemoWindowPopups(); - ShowDemoWindowTables(); - ShowDemoWindowMisc(); - - // End of ShowDemoWindow() - ImGui::PopItemWidth(); - ImGui::End(); -} - -static void ShowDemoWindowWidgets() -{ - IMGUI_DEMO_MARKER("Widgets"); - if (!ImGui::CollapsingHeader("Widgets")) - return; - - static bool disable_all = false; // The Checkbox for that is inside the "Disabled" section at the bottom - if (disable_all) - ImGui::BeginDisabled(); - - IMGUI_DEMO_MARKER("Widgets/Basic"); - if (ImGui::TreeNode("Basic")) - { - IMGUI_DEMO_MARKER("Widgets/Basic/Button"); - static int clicked = 0; - if (ImGui::Button("Button")) - clicked++; - if (clicked & 1) - { - ImGui::SameLine(); - ImGui::Text("Thanks for clicking me!"); - } - - IMGUI_DEMO_MARKER("Widgets/Basic/Checkbox"); - static bool check = true; - ImGui::Checkbox("checkbox", &check); - - IMGUI_DEMO_MARKER("Widgets/Basic/RadioButton"); - static int e = 0; - ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine(); - ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine(); - ImGui::RadioButton("radio c", &e, 2); - - // Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style. - IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Colored)"); - for (int i = 0; i < 7; i++) - { - if (i > 0) - ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); - ImGui::Button("Click"); - ImGui::PopStyleColor(3); - ImGui::PopID(); - } - - // Use AlignTextToFramePadding() to align text baseline to the baseline of framed widgets elements - // (otherwise a Text+SameLine+Button sequence will have the text a little too high by default!) - // See 'Demo->Layout->Text Baseline Alignment' for details. - ImGui::AlignTextToFramePadding(); - ImGui::Text("Hold to repeat:"); - ImGui::SameLine(); - - // Arrow buttons with Repeater - IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Repeating)"); - static int counter = 0; - float spacing = ImGui::GetStyle().ItemInnerSpacing.x; - ImGui::PushButtonRepeat(true); - if (ImGui::ArrowButton("##left", ImGuiDir_Left)) { counter--; } - ImGui::SameLine(0.0f, spacing); - if (ImGui::ArrowButton("##right", ImGuiDir_Right)) { counter++; } - ImGui::PopButtonRepeat(); - ImGui::SameLine(); - ImGui::Text("%d", counter); - - IMGUI_DEMO_MARKER("Widgets/Basic/Tooltips"); - ImGui::Text("Hover over me"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("I am a tooltip"); - - ImGui::SameLine(); - ImGui::Text("- or me"); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::Text("I am a fancy tooltip"); - static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; - ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); - ImGui::EndTooltip(); - } - - ImGui::Separator(); - ImGui::LabelText("label", "Value"); - - { - // Using the _simplified_ one-liner Combo() api here - // See "Combo" section for examples of how to use the more flexible BeginCombo()/EndCombo() api. - IMGUI_DEMO_MARKER("Widgets/Basic/Combo"); - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIIIIII", "JJJJ", "KKKKKKK" }; - static int item_current = 0; - ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items)); - ImGui::SameLine(); HelpMarker( - "Using the simplified one-liner Combo API here.\nRefer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API."); - } - - { - // To wire InputText() with std::string or any other custom string type, - // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file. - IMGUI_DEMO_MARKER("Widgets/Basic/InputText"); - static char str0[128] = "Hello, world!"; - ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0)); - ImGui::SameLine(); HelpMarker( - "USER:\n" - "Hold SHIFT or use mouse to select text.\n" - "CTRL+Left/Right to word jump.\n" - "CTRL+A or double-click to select all.\n" - "CTRL+X,CTRL+C,CTRL+V clipboard.\n" - "CTRL+Z,CTRL+Y undo/redo.\n" - "ESCAPE to revert.\n\n" - "PROGRAMMER:\n" - "You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() " - "to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated " - "in imgui_demo.cpp)."); - - static char str1[128] = ""; - ImGui::InputTextWithHint("input text (w/ hint)", "enter text here", str1, IM_ARRAYSIZE(str1)); - - IMGUI_DEMO_MARKER("Widgets/Basic/InputInt, InputFloat"); - static int i0 = 123; - ImGui::InputInt("input int", &i0); - - static float f0 = 0.001f; - ImGui::InputFloat("input float", &f0, 0.01f, 1.0f, "%.3f"); - - static double d0 = 999999.00000001; - ImGui::InputDouble("input double", &d0, 0.01f, 1.0f, "%.8f"); - - static float f1 = 1.e10f; - ImGui::InputFloat("input scientific", &f1, 0.0f, 0.0f, "%e"); - ImGui::SameLine(); HelpMarker( - "You can input value using the scientific notation,\n" - " e.g. \"1e+8\" becomes \"100000000\"."); - - static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; - ImGui::InputFloat3("input float3", vec4a); - } - - { - IMGUI_DEMO_MARKER("Widgets/Basic/DragInt, DragFloat"); - static int i1 = 50, i2 = 42; - ImGui::DragInt("drag int", &i1, 1); - ImGui::SameLine(); HelpMarker( - "Click and drag to edit value.\n" - "Hold SHIFT/ALT for faster/slower edit.\n" - "Double-click or CTRL+click to input value."); - - ImGui::DragInt("drag int 0..100", &i2, 1, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp); - - static float f1 = 1.00f, f2 = 0.0067f; - ImGui::DragFloat("drag float", &f1, 0.005f); - ImGui::DragFloat("drag small float", &f2, 0.0001f, 0.0f, 0.0f, "%.06f ns"); - } - - { - IMGUI_DEMO_MARKER("Widgets/Basic/SliderInt, SliderFloat"); - static int i1 = 0; - ImGui::SliderInt("slider int", &i1, -1, 3); - ImGui::SameLine(); HelpMarker("CTRL+click to input value."); - - static float f1 = 0.123f, f2 = 0.0f; - ImGui::SliderFloat("slider float", &f1, 0.0f, 1.0f, "ratio = %.3f"); - ImGui::SliderFloat("slider float (log)", &f2, -10.0f, 10.0f, "%.4f", ImGuiSliderFlags_Logarithmic); - - IMGUI_DEMO_MARKER("Widgets/Basic/SliderAngle"); - static float angle = 0.0f; - ImGui::SliderAngle("slider angle", &angle); - - // Using the format string to display a name instead of an integer. - // Here we completely omit '%d' from the format string, so it'll only display a name. - // This technique can also be used with DragInt(). - IMGUI_DEMO_MARKER("Widgets/Basic/Slider (enum)"); - enum Element { Element_Fire, Element_Earth, Element_Air, Element_Water, Element_COUNT }; - static int elem = Element_Fire; - const char* elems_names[Element_COUNT] = { "Fire", "Earth", "Air", "Water" }; - const char* elem_name = (elem >= 0 && elem < Element_COUNT) ? elems_names[elem] : "Unknown"; - ImGui::SliderInt("slider enum", &elem, 0, Element_COUNT - 1, elem_name); - ImGui::SameLine(); HelpMarker("Using the format string parameter to display a name instead of the underlying integer."); - } - - { - IMGUI_DEMO_MARKER("Widgets/Basic/ColorEdit3, ColorEdit4"); - static float col1[3] = { 1.0f, 0.0f, 0.2f }; - static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; - ImGui::ColorEdit3("color 1", col1); - ImGui::SameLine(); HelpMarker( - "Click on the color square to open a color picker.\n" - "Click and hold to use drag and drop.\n" - "Right-click on the color square to show options.\n" - "CTRL+click on individual component to input value.\n"); - - ImGui::ColorEdit4("color 2", col2); - } - - { - // Using the _simplified_ one-liner ListBox() api here - // See "List boxes" section for examples of how to use the more flexible BeginListBox()/EndListBox() api. - IMGUI_DEMO_MARKER("Widgets/Basic/ListBox"); - const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pineapple", "Strawberry", "Watermelon" }; - static int item_current = 1; - ImGui::ListBox("listbox", &item_current, items, IM_ARRAYSIZE(items), 4); - ImGui::SameLine(); HelpMarker( - "Using the simplified one-liner ListBox API here.\nRefer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API."); - } - - ImGui::TreePop(); - } - - // Testing ImGuiOnceUponAFrame helper. - //static ImGuiOnceUponAFrame once; - //for (int i = 0; i < 5; i++) - // if (once) - // ImGui::Text("This will be displayed only once."); - - IMGUI_DEMO_MARKER("Widgets/Trees"); - if (ImGui::TreeNode("Trees")) - { - IMGUI_DEMO_MARKER("Widgets/Trees/Basic trees"); - if (ImGui::TreeNode("Basic trees")) - { - for (int i = 0; i < 5; i++) - { - // Use SetNextItemOpen() so set the default state of a node to be open. We could - // also use TreeNodeEx() with the ImGuiTreeNodeFlags_DefaultOpen flag to achieve the same thing! - if (i == 0) - ImGui::SetNextItemOpen(true, ImGuiCond_Once); - - if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i)) - { - ImGui::Text("blah blah"); - ImGui::SameLine(); - if (ImGui::SmallButton("button")) {} - ImGui::TreePop(); - } - } - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Trees/Advanced, with Selectable nodes"); - if (ImGui::TreeNode("Advanced, with Selectable nodes")) - { - HelpMarker( - "This is a more typical looking tree with selectable nodes.\n" - "Click to select, CTRL+Click to toggle, click on arrows or double-click to open."); - static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth; - static bool align_label_with_current_x_position = false; - static bool test_drag_and_drop = false; - ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", &base_flags, ImGuiTreeNodeFlags_OpenOnArrow); - ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", &base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick); - ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", &base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker("Extend hit area to all available width instead of allowing more items to be laid out after the node."); - ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &base_flags, ImGuiTreeNodeFlags_SpanFullWidth); - ImGui::Checkbox("Align label with current X position", &align_label_with_current_x_position); - ImGui::Checkbox("Test tree node as drag source", &test_drag_and_drop); - ImGui::Text("Hello!"); - if (align_label_with_current_x_position) - ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing()); - - // 'selection_mask' is dumb representation of what may be user-side selection state. - // You may retain selection state inside or outside your objects in whatever format you see fit. - // 'node_clicked' is temporary storage of what node we have clicked to process selection at the end - /// of the loop. May be a pointer to your own node type, etc. - static int selection_mask = (1 << 2); - int node_clicked = -1; - for (int i = 0; i < 6; i++) - { - // Disable the default "open on single-click behavior" + set Selected flag according to our selection. - // To alter selection we use IsItemClicked() && !IsItemToggledOpen(), so clicking on an arrow doesn't alter selection. - ImGuiTreeNodeFlags node_flags = base_flags; - const bool is_selected = (selection_mask & (1 << i)) != 0; - if (is_selected) - node_flags |= ImGuiTreeNodeFlags_Selected; - if (i < 3) - { - // Items 0..2 are Tree Node - bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i); - if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen()) - node_clicked = i; - if (test_drag_and_drop && ImGui::BeginDragDropSource()) - { - ImGui::SetDragDropPayload("_TREENODE", NULL, 0); - ImGui::Text("This is a drag and drop source"); - ImGui::EndDragDropSource(); - } - if (node_open) - { - ImGui::BulletText("Blah blah\nBlah Blah"); - ImGui::TreePop(); - } - } - else - { - // Items 3..5 are Tree Leaves - // The only reason we use TreeNode at all is to allow selection of the leaf. Otherwise we can - // use BulletText() or advance the cursor by GetTreeNodeToLabelSpacing() and call Text(). - node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet - ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i); - if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen()) - node_clicked = i; - if (test_drag_and_drop && ImGui::BeginDragDropSource()) - { - ImGui::SetDragDropPayload("_TREENODE", NULL, 0); - ImGui::Text("This is a drag and drop source"); - ImGui::EndDragDropSource(); - } - } - } - if (node_clicked != -1) - { - // Update selection state - // (process outside of tree loop to avoid visual inconsistencies during the clicking frame) - if (ImGui::GetIO().KeyCtrl) - selection_mask ^= (1 << node_clicked); // CTRL+click to toggle - else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, may want to preserve selection when clicking on item that is part of the selection - selection_mask = (1 << node_clicked); // Click to single-select - } - if (align_label_with_current_x_position) - ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing()); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Collapsing Headers"); - if (ImGui::TreeNode("Collapsing Headers")) - { - static bool closable_group = true; - ImGui::Checkbox("Show 2nd header", &closable_group); - if (ImGui::CollapsingHeader("Header", ImGuiTreeNodeFlags_None)) - { - ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); - for (int i = 0; i < 5; i++) - ImGui::Text("Some content %d", i); - } - if (ImGui::CollapsingHeader("Header with a close button", &closable_group)) - { - ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); - for (int i = 0; i < 5; i++) - ImGui::Text("More content %d", i); - } - /* - if (ImGui::CollapsingHeader("Header with a bullet", ImGuiTreeNodeFlags_Bullet)) - ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); - */ - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Bullets"); - if (ImGui::TreeNode("Bullets")) - { - ImGui::BulletText("Bullet point 1"); - ImGui::BulletText("Bullet point 2\nOn multiple lines"); - if (ImGui::TreeNode("Tree node")) - { - ImGui::BulletText("Another bullet point"); - ImGui::TreePop(); - } - ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)"); - ImGui::Bullet(); ImGui::SmallButton("Button"); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Text"); - if (ImGui::TreeNode("Text")) - { - IMGUI_DEMO_MARKER("Widgets/Text/Colored Text"); - if (ImGui::TreeNode("Colorful Text")) - { - // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility. - ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink"); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow"); - ImGui::TextDisabled("Disabled"); - ImGui::SameLine(); HelpMarker("The TextDisabled color is stored in ImGuiStyle."); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Text/Word Wrapping"); - if (ImGui::TreeNode("Word Wrapping")) - { - // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility. - ImGui::TextWrapped( - "This text should automatically wrap on the edge of the window. The current implementation " - "for text wrapping follows simple rules suitable for English and possibly other languages."); - ImGui::Spacing(); - - static float wrap_width = 200.0f; - ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f"); - - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - for (int n = 0; n < 2; n++) - { - ImGui::Text("Test paragraph %d:", n); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImVec2 marker_min = ImVec2(pos.x + wrap_width, pos.y); - ImVec2 marker_max = ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()); - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width); - if (n == 0) - ImGui::Text("The lazy dog is a good dog. This paragraph should fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width); - else - ImGui::Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh"); - - // Draw actual text bounding box, following by marker of our expected limit (should not overlap!) - draw_list->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255, 255, 0, 255)); - draw_list->AddRectFilled(marker_min, marker_max, IM_COL32(255, 0, 255, 255)); - ImGui::PopTextWrapPos(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Text/UTF-8 Text"); - if (ImGui::TreeNode("UTF-8 Text")) - { - // UTF-8 test with Japanese characters - // (Needs a suitable font? Try "Google Noto" or "Arial Unicode". See docs/FONTS.md for details.) - // - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8 - // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. in Visual Studio, you - // can save your source files as 'UTF-8 without signature'). - // - FOR THIS DEMO FILE ONLY, BECAUSE WE WANT TO SUPPORT OLD COMPILERS, WE ARE *NOT* INCLUDING RAW UTF-8 - // CHARACTERS IN THIS SOURCE FILE. Instead we are encoding a few strings with hexadecimal constants. - // Don't do this in your application! Please use u8"text in any language" in your application! - // Note that characters values are preserved even by InputText() if the font cannot be displayed, - // so you can safely copy & paste garbled characters into another application. - ImGui::TextWrapped( - "CJK text will only appears if the font was loaded with the appropriate CJK character ranges. " - "Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. " - "Read docs/FONTS.md for details."); - ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); // Normally we would use u8"blah blah" with the proper characters directly in the string. - ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)"); - static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"; - //static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis - ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf)); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Images"); - if (ImGui::TreeNode("Images")) - { - ImGuiIO& io = ImGui::GetIO(); - ImGui::TextWrapped( - "Below we are displaying the font texture (which is the only texture we have access to in this demo). " - "Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. " - "Hover the texture for a zoomed view!"); - - // Below we are displaying the font texture because it is the only texture we have access to inside the demo! - // Remember that ImTextureID is just storage for whatever you want it to be. It is essentially a value that - // will be passed to the rendering backend via the ImDrawCmd structure. - // If you use one of the default imgui_impl_XXXX.cpp rendering backend, they all have comments at the top - // of their respective source file to specify what they expect to be stored in ImTextureID, for example: - // - The imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer - // - The imgui_impl_opengl3.cpp renderer expect a GLuint OpenGL texture identifier, etc. - // More: - // - If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers - // to ImGui::Image(), and gather width/height through your own functions, etc. - // - You can use ShowMetricsWindow() to inspect the draw data that are being passed to your renderer, - // it will help you debug issues if you are confused about it. - // - Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage(). - // - Read https://github.com/ocornut/imgui/blob/master/docs/FAQ.md - // - Read https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples - ImTextureID my_tex_id = io.Fonts->TexID; - float my_tex_w = (float)io.Fonts->TexWidth; - float my_tex_h = (float)io.Fonts->TexHeight; - { - ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImVec2 uv_min = ImVec2(0.0f, 0.0f); // Top-left - ImVec2 uv_max = ImVec2(1.0f, 1.0f); // Lower-right - ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint - ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f); // 50% opaque white - ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - float region_sz = 32.0f; - float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; - float region_y = io.MousePos.y - pos.y - region_sz * 0.5f; - float zoom = 4.0f; - if (region_x < 0.0f) { region_x = 0.0f; } - else if (region_x > my_tex_w - region_sz) { region_x = my_tex_w - region_sz; } - if (region_y < 0.0f) { region_y = 0.0f; } - else if (region_y > my_tex_h - region_sz) { region_y = my_tex_h - region_sz; } - ImGui::Text("Min: (%.2f, %.2f)", region_x, region_y); - ImGui::Text("Max: (%.2f, %.2f)", region_x + region_sz, region_y + region_sz); - ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h); - ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h); - ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, tint_col, border_col); - ImGui::EndTooltip(); - } - } - - IMGUI_DEMO_MARKER("Widgets/Images/Textured buttons"); - ImGui::TextWrapped("And now some textured buttons.."); - static int pressed_count = 0; - for (int i = 0; i < 8; i++) - { - ImGui::PushID(i); - int frame_padding = -1 + i; // -1 == uses default padding (style.FramePadding) - ImVec2 size = ImVec2(32.0f, 32.0f); // Size of the image we want to make visible - ImVec2 uv0 = ImVec2(0.0f, 0.0f); // UV coordinates for lower-left - ImVec2 uv1 = ImVec2(32.0f / my_tex_w, 32.0f / my_tex_h);// UV coordinates for (32,32) in our texture - ImVec4 bg_col = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); // Black background - ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint - if (ImGui::ImageButton(my_tex_id, size, uv0, uv1, frame_padding, bg_col, tint_col)) - pressed_count += 1; - ImGui::PopID(); - ImGui::SameLine(); - } - ImGui::NewLine(); - ImGui::Text("Pressed %d times.", pressed_count); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Combo"); - if (ImGui::TreeNode("Combo")) - { - // Expose flags as checkbox for the demo - static ImGuiComboFlags flags = 0; - ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", &flags, ImGuiComboFlags_PopupAlignLeft); - ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo"); - if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", &flags, ImGuiComboFlags_NoArrowButton)) - flags &= ~ImGuiComboFlags_NoPreview; // Clear the other flag, as we cannot combine both - if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", &flags, ImGuiComboFlags_NoPreview)) - flags &= ~ImGuiComboFlags_NoArrowButton; // Clear the other flag, as we cannot combine both - - // Using the generic BeginCombo() API, you have full control over how to display the combo contents. - // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively - // stored in the object itself, etc.) - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; - static int item_current_idx = 0; // Here we store our selection data as an index. - const char* combo_preview_value = items[item_current_idx]; // Pass in the preview value visible before opening the combo (it could be anything) - if (ImGui::BeginCombo("combo 1", combo_preview_value, flags)) - { - for (int n = 0; n < IM_ARRAYSIZE(items); n++) - { - const bool is_selected = (item_current_idx == n); - if (ImGui::Selectable(items[n], is_selected)) - item_current_idx = n; - - // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - - // Simplified one-liner Combo() API, using values packed in a single constant string - // This is a convenience for when the selection set is small and known at compile-time. - static int item_current_2 = 0; - ImGui::Combo("combo 2 (one-liner)", &item_current_2, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); - - // Simplified one-liner Combo() using an array of const char* - // This is not very useful (may obsolete): prefer using BeginCombo()/EndCombo() for full control. - static int item_current_3 = -1; // If the selection isn't within 0..count, Combo won't display a preview - ImGui::Combo("combo 3 (array)", &item_current_3, items, IM_ARRAYSIZE(items)); - - // Simplified one-liner Combo() using an accessor function - struct Funcs { static bool ItemGetter(void* data, int n, const char** out_str) { *out_str = ((const char**)data)[n]; return true; } }; - static int item_current_4 = 0; - ImGui::Combo("combo 4 (function)", &item_current_4, &Funcs::ItemGetter, items, IM_ARRAYSIZE(items)); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/List Boxes"); - if (ImGui::TreeNode("List boxes")) - { - // Using the generic BeginListBox() API, you have full control over how to display the combo contents. - // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively - // stored in the object itself, etc.) - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; - static int item_current_idx = 0; // Here we store our selection data as an index. - if (ImGui::BeginListBox("listbox 1")) - { - for (int n = 0; n < IM_ARRAYSIZE(items); n++) - { - const bool is_selected = (item_current_idx == n); - if (ImGui::Selectable(items[n], is_selected)) - item_current_idx = n; - - // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndListBox(); - } - - // Custom size: use all width, 5 items tall - ImGui::Text("Full-width:"); - if (ImGui::BeginListBox("##listbox 2", ImVec2(-FLT_MIN, 5 * ImGui::GetTextLineHeightWithSpacing()))) - { - for (int n = 0; n < IM_ARRAYSIZE(items); n++) - { - const bool is_selected = (item_current_idx == n); - if (ImGui::Selectable(items[n], is_selected)) - item_current_idx = n; - - // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndListBox(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Selectables"); - if (ImGui::TreeNode("Selectables")) - { - // Selectable() has 2 overloads: - // - The one taking "bool selected" as a read-only selection information. - // When Selectable() has been clicked it returns true and you can alter selection state accordingly. - // - The one taking "bool* p_selected" as a read-write selection information (convenient in some cases) - // The earlier is more flexible, as in real application your selection may be stored in many different ways - // and not necessarily inside a bool value (e.g. in flags within objects, as an external list, etc). - IMGUI_DEMO_MARKER("Widgets/Selectables/Basic"); - if (ImGui::TreeNode("Basic")) - { - static bool selection[5] = { false, true, false, false, false }; - ImGui::Selectable("1. I am selectable", &selection[0]); - ImGui::Selectable("2. I am selectable", &selection[1]); - ImGui::Text("(I am not selectable)"); - ImGui::Selectable("4. I am selectable", &selection[3]); - if (ImGui::Selectable("5. I am double clickable", selection[4], ImGuiSelectableFlags_AllowDoubleClick)) - if (ImGui::IsMouseDoubleClicked(0)) - selection[4] = !selection[4]; - ImGui::TreePop(); - } - IMGUI_DEMO_MARKER("Widgets/Selectables/Single Selection"); - if (ImGui::TreeNode("Selection State: Single Selection")) - { - static int selected = -1; - for (int n = 0; n < 5; n++) - { - char buf[32]; - sprintf(buf, "Object %d", n); - if (ImGui::Selectable(buf, selected == n)) - selected = n; - } - ImGui::TreePop(); - } - IMGUI_DEMO_MARKER("Widgets/Selectables/Multiple Selection"); - if (ImGui::TreeNode("Selection State: Multiple Selection")) - { - HelpMarker("Hold CTRL and click to select multiple items."); - static bool selection[5] = { false, false, false, false, false }; - for (int n = 0; n < 5; n++) - { - char buf[32]; - sprintf(buf, "Object %d", n); - if (ImGui::Selectable(buf, selection[n])) - { - if (!ImGui::GetIO().KeyCtrl) // Clear selection when CTRL is not held - memset(selection, 0, sizeof(selection)); - selection[n] ^= 1; - } - } - ImGui::TreePop(); - } - IMGUI_DEMO_MARKER("Widgets/Selectables/Rendering more text into the same line"); - if (ImGui::TreeNode("Rendering more text into the same line")) - { - // Using the Selectable() override that takes "bool* p_selected" parameter, - // this function toggle your bool value automatically. - static bool selected[3] = { false, false, false }; - ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); - ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(300); ImGui::Text("12,345 bytes"); - ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); - ImGui::TreePop(); - } - IMGUI_DEMO_MARKER("Widgets/Selectables/In columns"); - if (ImGui::TreeNode("In columns")) - { - static bool selected[10] = {}; - - if (ImGui::BeginTable("split1", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders)) - { - for (int i = 0; i < 10; i++) - { - char label[32]; - sprintf(label, "Item %d", i); - ImGui::TableNextColumn(); - ImGui::Selectable(label, &selected[i]); // FIXME-TABLE: Selection overlap - } - ImGui::EndTable(); - } - ImGui::Spacing(); - if (ImGui::BeginTable("split2", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders)) - { - for (int i = 0; i < 10; i++) - { - char label[32]; - sprintf(label, "Item %d", i); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::Selectable(label, &selected[i], ImGuiSelectableFlags_SpanAllColumns); - ImGui::TableNextColumn(); - ImGui::Text("Some other contents"); - ImGui::TableNextColumn(); - ImGui::Text("123456"); - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - IMGUI_DEMO_MARKER("Widgets/Selectables/Grid"); - if (ImGui::TreeNode("Grid")) - { - static char selected[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; - - // Add in a bit of silly fun... - const float time = (float)ImGui::GetTime(); - const bool winning_state = memchr(selected, 0, sizeof(selected)) == NULL; // If all cells are selected... - if (winning_state) - ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f + 0.5f * cosf(time * 2.0f), 0.5f + 0.5f * sinf(time * 3.0f))); - - for (int y = 0; y < 4; y++) - for (int x = 0; x < 4; x++) - { - if (x > 0) - ImGui::SameLine(); - ImGui::PushID(y * 4 + x); - if (ImGui::Selectable("Sailor", selected[y][x] != 0, 0, ImVec2(50, 50))) - { - // Toggle clicked cell + toggle neighbors - selected[y][x] ^= 1; - if (x > 0) { selected[y][x - 1] ^= 1; } - if (x < 3) { selected[y][x + 1] ^= 1; } - if (y > 0) { selected[y - 1][x] ^= 1; } - if (y < 3) { selected[y + 1][x] ^= 1; } - } - ImGui::PopID(); - } - - if (winning_state) - ImGui::PopStyleVar(); - ImGui::TreePop(); - } - IMGUI_DEMO_MARKER("Widgets/Selectables/Alignment"); - if (ImGui::TreeNode("Alignment")) - { - HelpMarker( - "By default, Selectables uses style.SelectableTextAlign but it can be overridden on a per-item " - "basis using PushStyleVar(). You'll probably want to always keep your default situation to " - "left-align otherwise it becomes difficult to layout multiple items on a same line"); - static bool selected[3 * 3] = { true, false, true, false, true, false, true, false, true }; - for (int y = 0; y < 3; y++) - { - for (int x = 0; x < 3; x++) - { - ImVec2 alignment = ImVec2((float)x / 2.0f, (float)y / 2.0f); - char name[32]; - sprintf(name, "(%.1f,%.1f)", alignment.x, alignment.y); - if (x > 0) ImGui::SameLine(); - ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment); - ImGui::Selectable(name, &selected[3 * y + x], ImGuiSelectableFlags_None, ImVec2(80, 80)); - ImGui::PopStyleVar(); - } - } - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - // To wire InputText() with std::string or any other custom string type, - // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file. - IMGUI_DEMO_MARKER("Widgets/Text Input"); - if (ImGui::TreeNode("Text Input")) - { - IMGUI_DEMO_MARKER("Widgets/Text Input/Multi-line Text Input"); - if (ImGui::TreeNode("Multi-line Text Input")) - { - // Note: we are using a fixed-sized buffer for simplicity here. See ImGuiInputTextFlags_CallbackResize - // and the code in misc/cpp/imgui_stdlib.h for how to setup InputText() for dynamically resizing strings. - static char text[1024 * 16] = - "/*\n" - " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n" - " the hexadecimal encoding of one offending instruction,\n" - " more formally, the invalid operand with locked CMPXCHG8B\n" - " instruction bug, is a design flaw in the majority of\n" - " Intel Pentium, Pentium MMX, and Pentium OverDrive\n" - " processors (all in the P5 microarchitecture).\n" - "*/\n\n" - "label:\n" - "\tlock cmpxchg8b eax\n"; - - static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput; - HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include in here)"); - ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly); - ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput); - ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine); - ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Text Input/Filtered Text Input"); - if (ImGui::TreeNode("Filtered Text Input")) - { - struct TextFilters - { - // Return 0 (pass) if the character is 'i' or 'm' or 'g' or 'u' or 'i' - static int FilterImGuiLetters(ImGuiInputTextCallbackData* data) - { - if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) - return 0; - return 1; - } - }; - - static char buf1[64] = ""; ImGui::InputText("default", buf1, 64); - static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal); - static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase); - static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase); - static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank); - static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Text Input/Password input"); - if (ImGui::TreeNode("Password Input")) - { - static char password[64] = "password123"; - ImGui::InputText("password", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password); - ImGui::SameLine(); HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n"); - ImGui::InputTextWithHint("password (w/ hint)", "", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password); - ImGui::InputText("password (clear)", password, IM_ARRAYSIZE(password)); - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Completion, History, Edit Callbacks")) - { - struct Funcs - { - static int MyCallback(ImGuiInputTextCallbackData* data) - { - if (data->EventFlag == ImGuiInputTextFlags_CallbackCompletion) - { - data->InsertChars(data->CursorPos, ".."); - } - else if (data->EventFlag == ImGuiInputTextFlags_CallbackHistory) - { - if (data->EventKey == ImGuiKey_UpArrow) - { - data->DeleteChars(0, data->BufTextLen); - data->InsertChars(0, "Pressed Up!"); - data->SelectAll(); - } - else if (data->EventKey == ImGuiKey_DownArrow) - { - data->DeleteChars(0, data->BufTextLen); - data->InsertChars(0, "Pressed Down!"); - data->SelectAll(); - } - } - else if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit) - { - // Toggle casing of first character - char c = data->Buf[0]; - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) data->Buf[0] ^= 32; - data->BufDirty = true; - - // Increment a counter - int* p_int = (int*)data->UserData; - *p_int = *p_int + 1; - } - return 0; - } - }; - static char buf1[64]; - ImGui::InputText("Completion", buf1, 64, ImGuiInputTextFlags_CallbackCompletion, Funcs::MyCallback); - ImGui::SameLine(); HelpMarker("Here we append \"..\" each time Tab is pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); - - static char buf2[64]; - ImGui::InputText("History", buf2, 64, ImGuiInputTextFlags_CallbackHistory, Funcs::MyCallback); - ImGui::SameLine(); HelpMarker("Here we replace and select text each time Up/Down are pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); - - static char buf3[64]; - static int edit_count = 0; - ImGui::InputText("Edit", buf3, 64, ImGuiInputTextFlags_CallbackEdit, Funcs::MyCallback, (void*)&edit_count); - ImGui::SameLine(); HelpMarker("Here we toggle the casing of the first character on every edits + count edits."); - ImGui::SameLine(); ImGui::Text("(%d)", edit_count); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Text Input/Resize Callback"); - if (ImGui::TreeNode("Resize Callback")) - { - // To wire InputText() with std::string or any other custom string type, - // you can use the ImGuiInputTextFlags_CallbackResize flag + create a custom ImGui::InputText() wrapper - // using your preferred type. See misc/cpp/imgui_stdlib.h for an implementation of this using std::string. - HelpMarker( - "Using ImGuiInputTextFlags_CallbackResize to wire your custom string type to InputText().\n\n" - "See misc/cpp/imgui_stdlib.h for an implementation of this for std::string."); - struct Funcs - { - static int MyResizeCallback(ImGuiInputTextCallbackData* data) - { - if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) - { - ImVector* my_str = (ImVector*)data->UserData; - IM_ASSERT(my_str->begin() == data->Buf); - my_str->resize(data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 - data->Buf = my_str->begin(); - } - return 0; - } - - // Note: Because ImGui:: is a namespace you would typically add your own function into the namespace. - // For example, you code may declare a function 'ImGui::InputText(const char* label, MyString* my_str)' - static bool MyInputTextMultiline(const char* label, ImVector* my_str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0) - { - IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - return ImGui::InputTextMultiline(label, my_str->begin(), (size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (void*)my_str); - } - }; - - // For this demo we are using ImVector as a string container. - // Note that because we need to store a terminating zero character, our size/capacity are 1 more - // than usually reported by a typical string class. - static ImVector my_str; - if (my_str.empty()) - my_str.push_back(0); - Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16)); - ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity()); - ImGui::TreePop(); - } - - ImGui::TreePop(); - } - - // Tabs - IMGUI_DEMO_MARKER("Widgets/Tabs"); - if (ImGui::TreeNode("Tabs")) - { - IMGUI_DEMO_MARKER("Widgets/Tabs/Basic"); - if (ImGui::TreeNode("Basic")) - { - ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None; - if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) - { - if (ImGui::BeginTabItem("Avocado")) - { - ImGui::Text("This is the Avocado tab!\nblah blah blah blah blah"); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Broccoli")) - { - ImGui::Text("This is the Broccoli tab!\nblah blah blah blah blah"); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Cucumber")) - { - ImGui::Text("This is the Cucumber tab!\nblah blah blah blah blah"); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); - } - ImGui::Separator(); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Tabs/Advanced & Close Button"); - if (ImGui::TreeNode("Advanced & Close Button")) - { - // Expose a couple of the available flags. In most cases you may just call BeginTabBar() with no flags (0). - static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable; - ImGui::CheckboxFlags("ImGuiTabBarFlags_Reorderable", &tab_bar_flags, ImGuiTabBarFlags_Reorderable); - ImGui::CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", &tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs); - ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); - ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", &tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton); - if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) - tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_; - if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) - tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); - if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) - tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); - - // Tab Bar - const char* names[4] = { "Artichoke", "Beetroot", "Celery", "Daikon" }; - static bool opened[4] = { true, true, true, true }; // Persistent user state - for (int n = 0; n < IM_ARRAYSIZE(opened); n++) - { - if (n > 0) { ImGui::SameLine(); } - ImGui::Checkbox(names[n], &opened[n]); - } - - // Passing a bool* to BeginTabItem() is similar to passing one to Begin(): - // the underlying bool will be set to false when the tab is closed. - if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) - { - for (int n = 0; n < IM_ARRAYSIZE(opened); n++) - if (opened[n] && ImGui::BeginTabItem(names[n], &opened[n], ImGuiTabItemFlags_None)) - { - ImGui::Text("This is the %s tab!", names[n]); - if (n & 1) - ImGui::Text("I am an odd tab."); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); - } - ImGui::Separator(); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Tabs/TabItemButton & Leading-Trailing flags"); - if (ImGui::TreeNode("TabItemButton & Leading/Trailing flags")) - { - static ImVector active_tabs; - static int next_tab_id = 0; - if (next_tab_id == 0) // Initialize with some default tabs - for (int i = 0; i < 3; i++) - active_tabs.push_back(next_tab_id++); - - // TabItemButton() and Leading/Trailing flags are distinct features which we will demo together. - // (It is possible to submit regular tabs with Leading/Trailing flags, or TabItemButton tabs without Leading/Trailing flags... - // but they tend to make more sense together) - static bool show_leading_button = true; - static bool show_trailing_button = true; - ImGui::Checkbox("Show Leading TabItemButton()", &show_leading_button); - ImGui::Checkbox("Show Trailing TabItemButton()", &show_trailing_button); - - // Expose some other flags which are useful to showcase how they interact with Leading/Trailing tabs - static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyResizeDown; - ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); - if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) - tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); - if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) - tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); - - if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) - { - // Demo a Leading TabItemButton(): click the "?" button to open a menu - if (show_leading_button) - if (ImGui::TabItemButton("?", ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_NoTooltip)) - ImGui::OpenPopup("MyHelpMenu"); - if (ImGui::BeginPopup("MyHelpMenu")) - { - ImGui::Selectable("Hello!"); - ImGui::EndPopup(); - } - - // Demo Trailing Tabs: click the "+" button to add a new tab (in your app you may want to use a font icon instead of the "+") - // Note that we submit it before the regular tabs, but because of the ImGuiTabItemFlags_Trailing flag it will always appear at the end. - if (show_trailing_button) - if (ImGui::TabItemButton("+", ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip)) - active_tabs.push_back(next_tab_id++); // Add new tab - - // Submit our regular tabs - for (int n = 0; n < active_tabs.Size; ) - { - bool open = true; - char name[16]; - snprintf(name, IM_ARRAYSIZE(name), "%04d", active_tabs[n]); - if (ImGui::BeginTabItem(name, &open, ImGuiTabItemFlags_None)) - { - ImGui::Text("This is the %s tab!", name); - ImGui::EndTabItem(); - } - - if (!open) - active_tabs.erase(active_tabs.Data + n); - else - n++; - } - - ImGui::EndTabBar(); - } - ImGui::Separator(); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - - // Plot/Graph widgets are not very good. - // Consider using a third-party library such as ImPlot: https://github.com/epezent/implot - // (see others https://github.com/ocornut/imgui/wiki/Useful-Extensions) - IMGUI_DEMO_MARKER("Widgets/Plotting"); - if (ImGui::TreeNode("Plotting")) - { - static bool animate = true; - ImGui::Checkbox("Animate", &animate); - - // Plot as lines and plot as histogram - IMGUI_DEMO_MARKER("Widgets/Plotting/PlotLines, PlotHistogram"); - static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; - ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr)); - ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f)); - - // Fill an array of contiguous float values to plot - // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float - // and the sizeof() of your structure in the "stride" parameter. - static float values[90] = {}; - static int values_offset = 0; - static double refresh_time = 0.0; - if (!animate || refresh_time == 0.0) - refresh_time = ImGui::GetTime(); - while (refresh_time < ImGui::GetTime()) // Create data at fixed 60 Hz rate for the demo - { - static float phase = 0.0f; - values[values_offset] = cosf(phase); - values_offset = (values_offset + 1) % IM_ARRAYSIZE(values); - phase += 0.10f * values_offset; - refresh_time += 1.0f / 60.0f; - } - - // Plots can display overlay texts - // (in this example, we will display an average value) - { - float average = 0.0f; - for (int n = 0; n < IM_ARRAYSIZE(values); n++) - average += values[n]; - average /= (float)IM_ARRAYSIZE(values); - char overlay[32]; - sprintf(overlay, "avg %f", average); - ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, overlay, -1.0f, 1.0f, ImVec2(0, 80.0f)); - } - - // Use functions to generate output - // FIXME: This is rather awkward because current plot API only pass in indices. - // We probably want an API passing floats and user provide sample rate/count. - struct Funcs - { - static float Sin(void*, int i) { return sinf(i * 0.1f); } - static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; } - }; - static int func_type = 0, display_count = 70; - ImGui::Separator(); - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); - ImGui::Combo("func", &func_type, "Sin\0Saw\0"); - ImGui::SameLine(); - ImGui::SliderInt("Sample count", &display_count, 1, 400); - float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw; - ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); - ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); - ImGui::Separator(); - - // Animate a simple progress bar - IMGUI_DEMO_MARKER("Widgets/Plotting/ProgressBar"); - static float progress = 0.0f, progress_dir = 1.0f; - if (animate) - { - progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime; - if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; } - if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; } - } - - // Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width, - // or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth. - ImGui::ProgressBar(progress, ImVec2(0.0f, 0.0f)); - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); - ImGui::Text("Progress Bar"); - - float progress_saturated = IM_CLAMP(progress, 0.0f, 1.0f); - char buf[32]; - sprintf(buf, "%d/%d", (int)(progress_saturated * 1753), 1753); - ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Color"); - if (ImGui::TreeNode("Color/Picker Widgets")) - { - static ImVec4 color = ImVec4(114.0f / 255.0f, 144.0f / 255.0f, 154.0f / 255.0f, 200.0f / 255.0f); - - static bool alpha_preview = true; - static bool alpha_half_preview = false; - static bool drag_and_drop = true; - static bool options_menu = true; - static bool hdr = false; - ImGui::Checkbox("With Alpha Preview", &alpha_preview); - ImGui::Checkbox("With Half Alpha Preview", &alpha_half_preview); - ImGui::Checkbox("With Drag and Drop", &drag_and_drop); - ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); HelpMarker("Right-click on the individual color widget to show options."); - ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets."); - ImGuiColorEditFlags misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions); - - IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit"); - ImGui::Text("Color widget:"); - ImGui::SameLine(); HelpMarker( - "Click on the color square to open a color picker.\n" - "CTRL+click on individual component to input value.\n"); - ImGui::ColorEdit3("MyColor##1", (float*)&color, misc_flags); - - IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (HSV, with Alpha)"); - ImGui::Text("Color widget HSV with Alpha:"); - ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_DisplayHSV | misc_flags); - - IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (float display)"); - ImGui::Text("Color widget with Float Display:"); - ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | misc_flags); - - IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with Picker)"); - ImGui::Text("Color button with Picker:"); - ImGui::SameLine(); HelpMarker( - "With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\n" - "With the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only " - "be used for the tooltip and picker popup."); - ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags); - - IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with custom Picker popup)"); - ImGui::Text("Color button with Custom Picker Popup:"); - - // Generate a default palette. The palette will persist and can be edited. - static bool saved_palette_init = true; - static ImVec4 saved_palette[32] = {}; - if (saved_palette_init) - { - for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) - { - ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f, - saved_palette[n].x, saved_palette[n].y, saved_palette[n].z); - saved_palette[n].w = 1.0f; // Alpha - } - saved_palette_init = false; - } - - static ImVec4 backup_color; - bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags); - ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x); - open_popup |= ImGui::Button("Palette"); - if (open_popup) - { - ImGui::OpenPopup("mypicker"); - backup_color = color; - } - if (ImGui::BeginPopup("mypicker")) - { - ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!"); - ImGui::Separator(); - ImGui::ColorPicker4("##picker", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview); - ImGui::SameLine(); - - ImGui::BeginGroup(); // Lock X position - ImGui::Text("Current"); - ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40)); - ImGui::Text("Previous"); - if (ImGui::ColorButton("##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40))) - color = backup_color; - ImGui::Separator(); - ImGui::Text("Palette"); - for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) - { - ImGui::PushID(n); - if ((n % 8) != 0) - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y); - - ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip; - if (ImGui::ColorButton("##palette", saved_palette[n], palette_button_flags, ImVec2(20, 20))) - color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha! - - // Allow user to drop colors into each palette entry. Note that ColorButton() is already a - // drag source by default, unless specifying the ImGuiColorEditFlags_NoDragDrop flag. - if (ImGui::BeginDragDropTarget()) - { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) - memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 3); - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) - memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 4); - ImGui::EndDragDropTarget(); - } - - ImGui::PopID(); - } - ImGui::EndGroup(); - ImGui::EndPopup(); - } - - IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (simple)"); - ImGui::Text("Color button only:"); - static bool no_border = false; - ImGui::Checkbox("ImGuiColorEditFlags_NoBorder", &no_border); - ImGui::ColorButton("MyColor##3c", *(ImVec4*)&color, misc_flags | (no_border ? ImGuiColorEditFlags_NoBorder : 0), ImVec2(80, 80)); - - IMGUI_DEMO_MARKER("Widgets/Color/ColorPicker"); - ImGui::Text("Color picker:"); - static bool alpha = true; - static bool alpha_bar = true; - static bool side_preview = true; - static bool ref_color = false; - static ImVec4 ref_color_v(1.0f, 0.0f, 1.0f, 0.5f); - static int display_mode = 0; - static int picker_mode = 0; - ImGui::Checkbox("With Alpha", &alpha); - ImGui::Checkbox("With Alpha Bar", &alpha_bar); - ImGui::Checkbox("With Side Preview", &side_preview); - if (side_preview) - { - ImGui::SameLine(); - ImGui::Checkbox("With Ref Color", &ref_color); - if (ref_color) - { - ImGui::SameLine(); - ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags); - } - } - ImGui::Combo("Display Mode", &display_mode, "Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0"); - ImGui::SameLine(); HelpMarker( - "ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, " - "but the user can change it with a right-click on those inputs.\n\nColorPicker defaults to displaying RGB+HSV+Hex " - "if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions()."); - ImGui::SameLine(); HelpMarker("When not specified explicitly (Auto/Current mode), user can right-click the picker to change mode."); - ImGuiColorEditFlags flags = misc_flags; - if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4() - if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar; - if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview; - if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar; - if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel; - if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; // Disable all RGB/HSV/Hex displays - if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB; // Override display mode - if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV; - if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex; - ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL); - - ImGui::Text("Set defaults in code:"); - ImGui::SameLine(); HelpMarker( - "SetColorEditOptions() is designed to allow you to set boot-time default.\n" - "We don't have Push/Pop functions because you can force options on a per-widget basis if needed," - "and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid" - "encouraging you to persistently save values that aren't forward-compatible."); - if (ImGui::Button("Default: Uint8 + HSV + Hue Bar")) - ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar); - if (ImGui::Button("Default: Float + HDR + Hue Wheel")) - ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel); - - // Always both a small version of both types of pickers (to make it more visible in the demo to people who are skimming quickly through it) - ImGui::Text("Both types:"); - float w = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.y) * 0.40f; - ImGui::SetNextItemWidth(w); - ImGui::ColorPicker3("##MyColor##5", (float*)&color, ImGuiColorEditFlags_PickerHueBar | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha); - ImGui::SameLine(); - ImGui::SetNextItemWidth(w); - ImGui::ColorPicker3("##MyColor##6", (float*)&color, ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha); - - // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0) - static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f); // Stored as HSV! - ImGui::Spacing(); - ImGui::Text("HSV encoded colors"); - ImGui::SameLine(); HelpMarker( - "By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV" - "allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the" - "added benefit that you can manipulate hue values with the picker even when saturation or value are zero."); - ImGui::Text("Color widget with InputHSV:"); - ImGui::ColorEdit4("HSV shown as RGB##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); - ImGui::ColorEdit4("HSV shown as HSV##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); - ImGui::DragFloat4("Raw HSV values", (float*)&color_hsv, 0.01f, 0.0f, 1.0f); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Drag and Slider Flags"); - if (ImGui::TreeNode("Drag/Slider Flags")) - { - // Demonstrate using advanced flags for DragXXX and SliderXXX functions. Note that the flags are the same! - static ImGuiSliderFlags flags = ImGuiSliderFlags_None; - ImGui::CheckboxFlags("ImGuiSliderFlags_AlwaysClamp", &flags, ImGuiSliderFlags_AlwaysClamp); - ImGui::SameLine(); HelpMarker("Always clamp value to min/max bounds (if any) when input manually with CTRL+Click."); - ImGui::CheckboxFlags("ImGuiSliderFlags_Logarithmic", &flags, ImGuiSliderFlags_Logarithmic); - ImGui::SameLine(); HelpMarker("Enable logarithmic editing (more precision for small values)."); - ImGui::CheckboxFlags("ImGuiSliderFlags_NoRoundToFormat", &flags, ImGuiSliderFlags_NoRoundToFormat); - ImGui::SameLine(); HelpMarker("Disable rounding underlying value to match precision of the format string (e.g. %.3f values are rounded to those 3 digits)."); - ImGui::CheckboxFlags("ImGuiSliderFlags_NoInput", &flags, ImGuiSliderFlags_NoInput); - ImGui::SameLine(); HelpMarker("Disable CTRL+Click or Enter key allowing to input text directly into the widget."); - - // Drags - static float drag_f = 0.5f; - static int drag_i = 50; - ImGui::Text("Underlying float value: %f", drag_f); - ImGui::DragFloat("DragFloat (0 -> 1)", &drag_f, 0.005f, 0.0f, 1.0f, "%.3f", flags); - ImGui::DragFloat("DragFloat (0 -> +inf)", &drag_f, 0.005f, 0.0f, FLT_MAX, "%.3f", flags); - ImGui::DragFloat("DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f, "%.3f", flags); - ImGui::DragFloat("DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX, "%.3f", flags); - ImGui::DragInt("DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100, "%d", flags); - - // Sliders - static float slider_f = 0.5f; - static int slider_i = 50; - ImGui::Text("Underlying float value: %f", slider_f); - ImGui::SliderFloat("SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f, "%.3f", flags); - ImGui::SliderInt("SliderInt (0 -> 100)", &slider_i, 0, 100, "%d", flags); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Range Widgets"); - if (ImGui::TreeNode("Range Widgets")) - { - static float begin = 10, end = 90; - static int begin_i = 100, end_i = 1000; - ImGui::DragFloatRange2("range float", &begin, &end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%", ImGuiSliderFlags_AlwaysClamp); - ImGui::DragIntRange2("range int", &begin_i, &end_i, 5, 0, 1000, "Min: %d units", "Max: %d units"); - ImGui::DragIntRange2("range int (no bounds)", &begin_i, &end_i, 5, 0, 0, "Min: %d units", "Max: %d units"); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Data Types"); - if (ImGui::TreeNode("Data Types")) - { - // DragScalar/InputScalar/SliderScalar functions allow various data types - // - signed/unsigned - // - 8/16/32/64-bits - // - integer/float/double - // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum - // to pass the type, and passing all arguments by pointer. - // This is the reason the test code below creates local variables to hold "zero" "one" etc. for each types. - // In practice, if you frequently use a given type that is not covered by the normal API entry points, - // you can wrap it yourself inside a 1 line function which can take typed argument as value instead of void*, - // and then pass their address to the generic function. For example: - // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld") - // { - // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format); - // } - - // Setup limits (as helper variables so we can take their address, as explained above) - // Note: SliderScalar() functions have a maximum usable range of half the natural type maximum, hence the /2. - #ifndef LLONG_MIN - ImS64 LLONG_MIN = -9223372036854775807LL - 1; - ImS64 LLONG_MAX = 9223372036854775807LL; - ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1); - #endif - const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127; - const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255; - const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767; - const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535; - const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2; - const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2; - const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2; - const ImU64 u64_zero = 0, u64_one = 1, u64_fifty = 50, u64_min = 0, u64_max = ULLONG_MAX/2, u64_hi_a = ULLONG_MAX/2 - 100, u64_hi_b = ULLONG_MAX/2; - const float f32_zero = 0.f, f32_one = 1.f, f32_lo_a = -10000000000.0f, f32_hi_a = +10000000000.0f; - const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0; - - // State - static char s8_v = 127; - static ImU8 u8_v = 255; - static short s16_v = 32767; - static ImU16 u16_v = 65535; - static ImS32 s32_v = -1; - static ImU32 u32_v = (ImU32)-1; - static ImS64 s64_v = -1; - static ImU64 u64_v = (ImU64)-1; - static float f32_v = 0.123f; - static double f64_v = 90000.01234567890123456789; - - const float drag_speed = 0.2f; - static bool drag_clamp = false; - IMGUI_DEMO_MARKER("Widgets/Data Types/Drags"); - ImGui::Text("Drags:"); - ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp); - ImGui::SameLine(); HelpMarker( - "As with every widgets in dear imgui, we never modify values unless there is a user interaction.\n" - "You can override the clamping limits by using CTRL+Click to input a value."); - ImGui::DragScalar("drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL); - ImGui::DragScalar("drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL, "%u ms"); - ImGui::DragScalar("drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL); - ImGui::DragScalar("drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL, "%u ms"); - ImGui::DragScalar("drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL); - ImGui::DragScalar("drag s32 hex", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL, "0x%08X"); - ImGui::DragScalar("drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL, "%u ms"); - ImGui::DragScalar("drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL); - ImGui::DragScalar("drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL); - ImGui::DragScalar("drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f"); - ImGui::DragScalar("drag float log", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", ImGuiSliderFlags_Logarithmic); - ImGui::DragScalar("drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL, "%.10f grams"); - ImGui::DragScalar("drag double log",ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one, "0 < %.10f < 1", ImGuiSliderFlags_Logarithmic); - - IMGUI_DEMO_MARKER("Widgets/Data Types/Sliders"); - ImGui::Text("Sliders"); - ImGui::SliderScalar("slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max, "%d"); - ImGui::SliderScalar("slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max, "%u"); - ImGui::SliderScalar("slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max, "%d"); - ImGui::SliderScalar("slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max, "%u"); - ImGui::SliderScalar("slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,"%d"); - ImGui::SliderScalar("slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b, "%d"); - ImGui::SliderScalar("slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max, "%d"); - ImGui::SliderScalar("slider s32 hex", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty, "0x%04X"); - ImGui::SliderScalar("slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,"%u"); - ImGui::SliderScalar("slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b, "%u"); - ImGui::SliderScalar("slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max, "%u"); - ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%" IM_PRId64); - ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%" IM_PRId64); - ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%" IM_PRId64); - ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%" IM_PRIu64 " ms"); - ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%" IM_PRIu64 " ms"); - ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%" IM_PRIu64 " ms"); - ImGui::SliderScalar("slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one); - ImGui::SliderScalar("slider float low log", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one, "%.10f", ImGuiSliderFlags_Logarithmic); - ImGui::SliderScalar("slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a, "%e"); - ImGui::SliderScalar("slider double low", ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f grams"); - ImGui::SliderScalar("slider double low log",ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f", ImGuiSliderFlags_Logarithmic); - ImGui::SliderScalar("slider double high", ImGuiDataType_Double, &f64_v, &f64_lo_a, &f64_hi_a, "%e grams"); - - ImGui::Text("Sliders (reverse)"); - ImGui::SliderScalar("slider s8 reverse", ImGuiDataType_S8, &s8_v, &s8_max, &s8_min, "%d"); - ImGui::SliderScalar("slider u8 reverse", ImGuiDataType_U8, &u8_v, &u8_max, &u8_min, "%u"); - ImGui::SliderScalar("slider s32 reverse", ImGuiDataType_S32, &s32_v, &s32_fifty, &s32_zero, "%d"); - ImGui::SliderScalar("slider u32 reverse", ImGuiDataType_U32, &u32_v, &u32_fifty, &u32_zero, "%u"); - ImGui::SliderScalar("slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero, "%" IM_PRId64); - ImGui::SliderScalar("slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero, "%" IM_PRIu64 " ms"); - - IMGUI_DEMO_MARKER("Widgets/Data Types/Inputs"); - static bool inputs_step = true; - ImGui::Text("Inputs"); - ImGui::Checkbox("Show step buttons", &inputs_step); - ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d"); - ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u"); - ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d"); - ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u"); - ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d"); - ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%04X"); - ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u"); - ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X"); - ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL); - ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL); - ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL); - ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Multi-component Widgets"); - if (ImGui::TreeNode("Multi-component Widgets")) - { - static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; - static int vec4i[4] = { 1, 5, 100, 255 }; - - ImGui::InputFloat2("input float2", vec4f); - ImGui::DragFloat2("drag float2", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat2("slider float2", vec4f, 0.0f, 1.0f); - ImGui::InputInt2("input int2", vec4i); - ImGui::DragInt2("drag int2", vec4i, 1, 0, 255); - ImGui::SliderInt2("slider int2", vec4i, 0, 255); - ImGui::Spacing(); - - ImGui::InputFloat3("input float3", vec4f); - ImGui::DragFloat3("drag float3", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat3("slider float3", vec4f, 0.0f, 1.0f); - ImGui::InputInt3("input int3", vec4i); - ImGui::DragInt3("drag int3", vec4i, 1, 0, 255); - ImGui::SliderInt3("slider int3", vec4i, 0, 255); - ImGui::Spacing(); - - ImGui::InputFloat4("input float4", vec4f); - ImGui::DragFloat4("drag float4", vec4f, 0.01f, 0.0f, 1.0f); - ImGui::SliderFloat4("slider float4", vec4f, 0.0f, 1.0f); - ImGui::InputInt4("input int4", vec4i); - ImGui::DragInt4("drag int4", vec4i, 1, 0, 255); - ImGui::SliderInt4("slider int4", vec4i, 0, 255); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Vertical Sliders"); - if (ImGui::TreeNode("Vertical Sliders")) - { - const float spacing = 4; - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, spacing)); - - static int int_value = 0; - ImGui::VSliderInt("##int", ImVec2(18, 160), &int_value, 0, 5); - ImGui::SameLine(); - - static float values[7] = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f }; - ImGui::PushID("set1"); - for (int i = 0; i < 7; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_FrameBg, (ImVec4)ImColor::HSV(i / 7.0f, 0.5f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_FrameBgActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_SliderGrab, (ImVec4)ImColor::HSV(i / 7.0f, 0.9f, 0.9f)); - ImGui::VSliderFloat("##v", ImVec2(18, 160), &values[i], 0.0f, 1.0f, ""); - if (ImGui::IsItemActive() || ImGui::IsItemHovered()) - ImGui::SetTooltip("%.3f", values[i]); - ImGui::PopStyleColor(4); - ImGui::PopID(); - } - ImGui::PopID(); - - ImGui::SameLine(); - ImGui::PushID("set2"); - static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f }; - const int rows = 3; - const ImVec2 small_slider_size(18, (float)(int)((160.0f - (rows - 1) * spacing) / rows)); - for (int nx = 0; nx < 4; nx++) - { - if (nx > 0) ImGui::SameLine(); - ImGui::BeginGroup(); - for (int ny = 0; ny < rows; ny++) - { - ImGui::PushID(nx * rows + ny); - ImGui::VSliderFloat("##v", small_slider_size, &values2[nx], 0.0f, 1.0f, ""); - if (ImGui::IsItemActive() || ImGui::IsItemHovered()) - ImGui::SetTooltip("%.3f", values2[nx]); - ImGui::PopID(); - } - ImGui::EndGroup(); - } - ImGui::PopID(); - - ImGui::SameLine(); - ImGui::PushID("set3"); - for (int i = 0; i < 4; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, 40); - ImGui::VSliderFloat("##v", ImVec2(40, 160), &values[i], 0.0f, 1.0f, "%.2f\nsec"); - ImGui::PopStyleVar(); - ImGui::PopID(); - } - ImGui::PopID(); - ImGui::PopStyleVar(); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Drag and drop"); - if (ImGui::TreeNode("Drag and Drop")) - { - IMGUI_DEMO_MARKER("Widgets/Drag and drop/Standard widgets"); - if (ImGui::TreeNode("Drag and drop in standard widgets")) - { - // ColorEdit widgets automatically act as drag source and drag target. - // They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F - // to allow your own widgets to use colors in their drag and drop interaction. - // Also see 'Demo->Widgets->Color/Picker Widgets->Palette' demo. - HelpMarker("You can drag from the color squares."); - static float col1[3] = { 1.0f, 0.0f, 0.2f }; - static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; - ImGui::ColorEdit3("color 1", col1); - ImGui::ColorEdit4("color 2", col2); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Drag and drop/Copy-swap items"); - if (ImGui::TreeNode("Drag and drop to copy/swap items")) - { - enum Mode - { - Mode_Copy, - Mode_Move, - Mode_Swap - }; - static int mode = 0; - if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine(); - if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine(); - if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; } - static const char* names[9] = - { - "Bobby", "Beatrice", "Betty", - "Brianna", "Barry", "Bernard", - "Bibi", "Blaine", "Bryn" - }; - for (int n = 0; n < IM_ARRAYSIZE(names); n++) - { - ImGui::PushID(n); - if ((n % 3) != 0) - ImGui::SameLine(); - ImGui::Button(names[n], ImVec2(60, 60)); - - // Our buttons are both drag sources and drag targets here! - if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) - { - // Set payload to carry the index of our item (could be anything) - ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int)); - - // Display preview (could be anything, e.g. when dragging an image we could decide to display - // the filename and a small preview of the image, etc.) - if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); } - if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); } - if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); } - ImGui::EndDragDropSource(); - } - if (ImGui::BeginDragDropTarget()) - { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL")) - { - IM_ASSERT(payload->DataSize == sizeof(int)); - int payload_n = *(const int*)payload->Data; - if (mode == Mode_Copy) - { - names[n] = names[payload_n]; - } - if (mode == Mode_Move) - { - names[n] = names[payload_n]; - names[payload_n] = ""; - } - if (mode == Mode_Swap) - { - const char* tmp = names[n]; - names[n] = names[payload_n]; - names[payload_n] = tmp; - } - } - ImGui::EndDragDropTarget(); - } - ImGui::PopID(); - } - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Drag to reorder items (simple)"); - if (ImGui::TreeNode("Drag to reorder items (simple)")) - { - // Simple reordering - HelpMarker( - "We don't use the drag and drop api at all here! " - "Instead we query when the item is held but not hovered, and order items accordingly."); - static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" }; - for (int n = 0; n < IM_ARRAYSIZE(item_names); n++) - { - const char* item = item_names[n]; - ImGui::Selectable(item); - - if (ImGui::IsItemActive() && !ImGui::IsItemHovered()) - { - int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1); - if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names)) - { - item_names[n] = item_names[n_next]; - item_names[n_next] = item; - ImGui::ResetMouseDragDelta(); - } - } - } - ImGui::TreePop(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Querying Item Status (Edited,Active,Hovered etc.)"); - if (ImGui::TreeNode("Querying Item Status (Edited/Active/Hovered etc.)")) - { - // Select an item type - const char* item_names[] = - { - "Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputTextMultiline", "InputFloat", - "InputFloat3", "ColorEdit4", "Selectable", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox" - }; - static int item_type = 4; - static bool item_disabled = false; - ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names)); - ImGui::SameLine(); - HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions. Note that the bool return value of most ImGui function is generally equivalent to calling ImGui::IsItemHovered()."); - ImGui::Checkbox("Item Disabled", &item_disabled); - - // Submit selected item item so we can query their status in the code following it. - bool ret = false; - static bool b = false; - static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f }; - static char str[16] = {}; - if (item_disabled) - ImGui::BeginDisabled(true); - if (item_type == 0) { ImGui::Text("ITEM: Text"); } // Testing text items with no identifier/interaction - if (item_type == 1) { ret = ImGui::Button("ITEM: Button"); } // Testing button - if (item_type == 2) { ImGui::PushButtonRepeat(true); ret = ImGui::Button("ITEM: Button"); ImGui::PopButtonRepeat(); } // Testing button (with repeater) - if (item_type == 3) { ret = ImGui::Checkbox("ITEM: Checkbox", &b); } // Testing checkbox - if (item_type == 4) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item - if (item_type == 5) { ret = ImGui::InputText("ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which handles tabbing) - if (item_type == 6) { ret = ImGui::InputTextMultiline("ITEM: InputTextMultiline", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which uses a child window) - if (item_type == 7) { ret = ImGui::InputFloat("ITEM: InputFloat", col4f, 1.0f); } // Testing +/- buttons on scalar input - if (item_type == 8) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) - if (item_type == 9) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) - if (item_type == 10){ ret = ImGui::Selectable("ITEM: Selectable"); } // Testing selectable item - if (item_type == 11){ ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy) - if (item_type == 12){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node - if (item_type == 13){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy. - if (item_type == 14){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", ¤t, items, IM_ARRAYSIZE(items)); } - if (item_type == 15){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); } - - // Display the values of IsItemHovered() and other common item state functions. - // Note that the ImGuiHoveredFlags_XXX flags can be combined. - // Because BulletText is an item itself and that would affect the output of IsItemXXX functions, - // we query every state in a single call to avoid storing them and to simplify the code. - ImGui::BulletText( - "Return value = %d\n" - "IsItemFocused() = %d\n" - "IsItemHovered() = %d\n" - "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n" - "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n" - "IsItemHovered(_AllowWhenOverlapped) = %d\n" - "IsItemHovered(_AllowWhenDisabled) = %d\n" - "IsItemHovered(_RectOnly) = %d\n" - "IsItemActive() = %d\n" - "IsItemEdited() = %d\n" - "IsItemActivated() = %d\n" - "IsItemDeactivated() = %d\n" - "IsItemDeactivatedAfterEdit() = %d\n" - "IsItemVisible() = %d\n" - "IsItemClicked() = %d\n" - "IsItemToggledOpen() = %d\n" - "GetItemRectMin() = (%.1f, %.1f)\n" - "GetItemRectMax() = (%.1f, %.1f)\n" - "GetItemRectSize() = (%.1f, %.1f)", - ret, - ImGui::IsItemFocused(), - ImGui::IsItemHovered(), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled), - ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly), - ImGui::IsItemActive(), - ImGui::IsItemEdited(), - ImGui::IsItemActivated(), - ImGui::IsItemDeactivated(), - ImGui::IsItemDeactivatedAfterEdit(), - ImGui::IsItemVisible(), - ImGui::IsItemClicked(), - ImGui::IsItemToggledOpen(), - ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y, - ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y, - ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y - ); - - if (item_disabled) - ImGui::EndDisabled(); - - char buf[1] = ""; - ImGui::InputText("unused", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_ReadOnly); - ImGui::SameLine(); - HelpMarker("This widget is only here to be able to tab-out of the widgets above and see e.g. Deactivated() status."); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Widgets/Querying Window Status (Focused,Hovered etc.)"); - if (ImGui::TreeNode("Querying Window Status (Focused/Hovered etc.)")) - { - static bool embed_all_inside_a_child_window = false; - ImGui::Checkbox("Embed everything inside a child window for testing _RootWindow flag.", &embed_all_inside_a_child_window); - if (embed_all_inside_a_child_window) - ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), true); - - // Testing IsWindowFocused() function with its various flags. - ImGui::BulletText( - "IsWindowFocused() = %d\n" - "IsWindowFocused(_ChildWindows) = %d\n" - "IsWindowFocused(_ChildWindows|_NoPopupHierarchy) = %d\n" - "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n" - "IsWindowFocused(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n" - "IsWindowFocused(_RootWindow) = %d\n" - "IsWindowFocused(_RootWindow|_NoPopupHierarchy) = %d\n" - "IsWindowFocused(_AnyWindow) = %d\n", - ImGui::IsWindowFocused(), - ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows), - ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_NoPopupHierarchy), - ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow), - ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy), - ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow), - ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy), - ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow)); - - // Testing IsWindowHovered() function with its various flags. - ImGui::BulletText( - "IsWindowHovered() = %d\n" - "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n" - "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n" - "IsWindowHovered(_ChildWindows) = %d\n" - "IsWindowHovered(_ChildWindows|_NoPopupHierarchy) = %d\n" - "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n" - "IsWindowHovered(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n" - "IsWindowHovered(_RootWindow) = %d\n" - "IsWindowHovered(_RootWindow|_NoPopupHierarchy) = %d\n" - "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n" - "IsWindowHovered(_AnyWindow) = %d\n", - ImGui::IsWindowHovered(), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy), - ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow), - ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy), - ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow)); - - ImGui::BeginChild("child", ImVec2(0, 50), true); - ImGui::Text("This is another child window for testing the _ChildWindows flag."); - ImGui::EndChild(); - if (embed_all_inside_a_child_window) - ImGui::EndChild(); - - // Calling IsItemHovered() after begin returns the hovered status of the title bar. - // This is useful in particular if you want to create a context menu associated to the title bar of a window. - static bool test_window = false; - ImGui::Checkbox("Hovered/Active tests after Begin() for title bar testing", &test_window); - if (test_window) - { - ImGui::Begin("Title bar Hovered/Active tests", &test_window); - if (ImGui::BeginPopupContextItem()) // <-- This is using IsItemHovered() - { - if (ImGui::MenuItem("Close")) { test_window = false; } - ImGui::EndPopup(); - } - ImGui::Text( - "IsItemHovered() after begin = %d (== is title bar hovered)\n" - "IsItemActive() after begin = %d (== is window being clicked/moved)\n", - ImGui::IsItemHovered(), ImGui::IsItemActive()); - ImGui::End(); - } - - ImGui::TreePop(); - } - - // Demonstrate BeginDisabled/EndDisabled using a checkbox located at the bottom of the section (which is a bit odd: - // logically we'd have this checkbox at the top of the section, but we don't want this feature to steal that space) - if (disable_all) - ImGui::EndDisabled(); - - IMGUI_DEMO_MARKER("Widgets/Disable Block"); - if (ImGui::TreeNode("Disable block")) - { - ImGui::Checkbox("Disable entire section above", &disable_all); - ImGui::SameLine(); HelpMarker("Demonstrate using BeginDisabled()/EndDisabled() across this section."); - ImGui::TreePop(); - } -} - -static void ShowDemoWindowLayout() -{ - IMGUI_DEMO_MARKER("Layout"); - if (!ImGui::CollapsingHeader("Layout & Scrolling")) - return; - - IMGUI_DEMO_MARKER("Layout/Child windows"); - if (ImGui::TreeNode("Child windows")) - { - HelpMarker("Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window."); - static bool disable_mouse_wheel = false; - static bool disable_menu = false; - ImGui::Checkbox("Disable Mouse Wheel", &disable_mouse_wheel); - ImGui::Checkbox("Disable Menu", &disable_menu); - - // Child 1: no border, enable horizontal scrollbar - { - ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; - if (disable_mouse_wheel) - window_flags |= ImGuiWindowFlags_NoScrollWithMouse; - ImGui::BeginChild("ChildL", ImVec2(ImGui::GetContentRegionAvail().x * 0.5f, 260), false, window_flags); - for (int i = 0; i < 100; i++) - ImGui::Text("%04d: scrollable region", i); - ImGui::EndChild(); - } - - ImGui::SameLine(); - - // Child 2: rounded border - { - ImGuiWindowFlags window_flags = ImGuiWindowFlags_None; - if (disable_mouse_wheel) - window_flags |= ImGuiWindowFlags_NoScrollWithMouse; - if (!disable_menu) - window_flags |= ImGuiWindowFlags_MenuBar; - ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); - ImGui::BeginChild("ChildR", ImVec2(0, 260), true, window_flags); - if (!disable_menu && ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("Menu")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - if (ImGui::BeginTable("split", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings)) - { - for (int i = 0; i < 100; i++) - { - char buf[32]; - sprintf(buf, "%03d", i); - ImGui::TableNextColumn(); - ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); - } - ImGui::EndTable(); - } - ImGui::EndChild(); - ImGui::PopStyleVar(); - } - - ImGui::Separator(); - - // Demonstrate a few extra things - // - Changing ImGuiCol_ChildBg (which is transparent black in default styles) - // - Using SetCursorPos() to position child window (the child window is an item from the POV of parent window) - // You can also call SetNextWindowPos() to position the child window. The parent window will effectively - // layout from this position. - // - Using ImGui::GetItemRectMin/Max() to query the "item" state (because the child window is an item from - // the POV of the parent window). See 'Demo->Querying Status (Edited/Active/Hovered etc.)' for details. - { - static int offset_x = 0; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); - ImGui::DragInt("Offset X", &offset_x, 1.0f, -1000, 1000); - - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (float)offset_x); - ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); - ImGui::BeginChild("Red", ImVec2(200, 100), true, ImGuiWindowFlags_None); - for (int n = 0; n < 50; n++) - ImGui::Text("Some test %d", n); - ImGui::EndChild(); - bool child_is_hovered = ImGui::IsItemHovered(); - ImVec2 child_rect_min = ImGui::GetItemRectMin(); - ImVec2 child_rect_max = ImGui::GetItemRectMax(); - ImGui::PopStyleColor(); - ImGui::Text("Hovered: %d", child_is_hovered); - ImGui::Text("Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Layout/Widgets Width"); - if (ImGui::TreeNode("Widgets Width")) - { - static float f = 0.0f; - static bool show_indented_items = true; - ImGui::Checkbox("Show indented items", &show_indented_items); - - // Use SetNextItemWidth() to set the width of a single upcoming item. - // Use PushItemWidth()/PopItemWidth() to set the width of a group of items. - // In real code use you'll probably want to choose width values that are proportional to your font size - // e.g. Using '20.0f * GetFontSize()' as width instead of '200.0f', etc. - - ImGui::Text("SetNextItemWidth/PushItemWidth(100)"); - ImGui::SameLine(); HelpMarker("Fixed width."); - ImGui::PushItemWidth(100); - ImGui::DragFloat("float##1b", &f); - if (show_indented_items) - { - ImGui::Indent(); - ImGui::DragFloat("float (indented)##1b", &f); - ImGui::Unindent(); - } - ImGui::PopItemWidth(); - - ImGui::Text("SetNextItemWidth/PushItemWidth(-100)"); - ImGui::SameLine(); HelpMarker("Align to right edge minus 100"); - ImGui::PushItemWidth(-100); - ImGui::DragFloat("float##2a", &f); - if (show_indented_items) - { - ImGui::Indent(); - ImGui::DragFloat("float (indented)##2b", &f); - ImGui::Unindent(); - } - ImGui::PopItemWidth(); - - ImGui::Text("SetNextItemWidth/PushItemWidth(GetContentRegionAvail().x * 0.5f)"); - ImGui::SameLine(); HelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)"); - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x * 0.5f); - ImGui::DragFloat("float##3a", &f); - if (show_indented_items) - { - ImGui::Indent(); - ImGui::DragFloat("float (indented)##3b", &f); - ImGui::Unindent(); - } - ImGui::PopItemWidth(); - - ImGui::Text("SetNextItemWidth/PushItemWidth(-GetContentRegionAvail().x * 0.5f)"); - ImGui::SameLine(); HelpMarker("Align to right edge minus half"); - ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f); - ImGui::DragFloat("float##4a", &f); - if (show_indented_items) - { - ImGui::Indent(); - ImGui::DragFloat("float (indented)##4b", &f); - ImGui::Unindent(); - } - ImGui::PopItemWidth(); - - // Demonstrate using PushItemWidth to surround three items. - // Calling SetNextItemWidth() before each of them would have the same effect. - ImGui::Text("SetNextItemWidth/PushItemWidth(-FLT_MIN)"); - ImGui::SameLine(); HelpMarker("Align to right edge"); - ImGui::PushItemWidth(-FLT_MIN); - ImGui::DragFloat("##float5a", &f); - if (show_indented_items) - { - ImGui::Indent(); - ImGui::DragFloat("float (indented)##5b", &f); - ImGui::Unindent(); - } - ImGui::PopItemWidth(); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout"); - if (ImGui::TreeNode("Basic Horizontal Layout")) - { - ImGui::TextWrapped("(Use ImGui::SameLine() to keep adding items to the right of the preceding item)"); - - // Text - IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine"); - ImGui::Text("Two items: Hello"); ImGui::SameLine(); - ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); - - // Adjust spacing - ImGui::Text("More spacing: Hello"); ImGui::SameLine(0, 20); - ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); - - // Button - ImGui::AlignTextToFramePadding(); - ImGui::Text("Normal buttons"); ImGui::SameLine(); - ImGui::Button("Banana"); ImGui::SameLine(); - ImGui::Button("Apple"); ImGui::SameLine(); - ImGui::Button("Corniflower"); - - // Button - ImGui::Text("Small buttons"); ImGui::SameLine(); - ImGui::SmallButton("Like this one"); ImGui::SameLine(); - ImGui::Text("can fit within a text block."); - - // Aligned to arbitrary position. Easy/cheap column. - IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine (with offset)"); - ImGui::Text("Aligned"); - ImGui::SameLine(150); ImGui::Text("x=150"); - ImGui::SameLine(300); ImGui::Text("x=300"); - ImGui::Text("Aligned"); - ImGui::SameLine(150); ImGui::SmallButton("x=150"); - ImGui::SameLine(300); ImGui::SmallButton("x=300"); - - // Checkbox - IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine (more)"); - static bool c1 = false, c2 = false, c3 = false, c4 = false; - ImGui::Checkbox("My", &c1); ImGui::SameLine(); - ImGui::Checkbox("Tailor", &c2); ImGui::SameLine(); - ImGui::Checkbox("Is", &c3); ImGui::SameLine(); - ImGui::Checkbox("Rich", &c4); - - // Various - static float f0 = 1.0f, f1 = 2.0f, f2 = 3.0f; - ImGui::PushItemWidth(80); - const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD" }; - static int item = -1; - ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine(); - ImGui::SliderFloat("X", &f0, 0.0f, 5.0f); ImGui::SameLine(); - ImGui::SliderFloat("Y", &f1, 0.0f, 5.0f); ImGui::SameLine(); - ImGui::SliderFloat("Z", &f2, 0.0f, 5.0f); - ImGui::PopItemWidth(); - - ImGui::PushItemWidth(80); - ImGui::Text("Lists:"); - static int selection[4] = { 0, 1, 2, 3 }; - for (int i = 0; i < 4; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::PushID(i); - ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items)); - ImGui::PopID(); - //if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i); - } - ImGui::PopItemWidth(); - - // Dummy - IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/Dummy"); - ImVec2 button_sz(40, 40); - ImGui::Button("A", button_sz); ImGui::SameLine(); - ImGui::Dummy(button_sz); ImGui::SameLine(); - ImGui::Button("B", button_sz); - - // Manually wrapping - // (we should eventually provide this as an automatic layout feature, but for now you can do it manually) - IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/Manual wrapping"); - ImGui::Text("Manual wrapping:"); - ImGuiStyle& style = ImGui::GetStyle(); - int buttons_count = 20; - float window_visible_x2 = ImGui::GetWindowPos().x + ImGui::GetWindowContentRegionMax().x; - for (int n = 0; n < buttons_count; n++) - { - ImGui::PushID(n); - ImGui::Button("Box", button_sz); - float last_button_x2 = ImGui::GetItemRectMax().x; - float next_button_x2 = last_button_x2 + style.ItemSpacing.x + button_sz.x; // Expected position if next button was on same line - if (n + 1 < buttons_count && next_button_x2 < window_visible_x2) - ImGui::SameLine(); - ImGui::PopID(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Layout/Groups"); - if (ImGui::TreeNode("Groups")) - { - HelpMarker( - "BeginGroup() basically locks the horizontal position for new line. " - "EndGroup() bundles the whole group so that you can use \"item\" functions such as " - "IsItemHovered()/IsItemActive() or SameLine() etc. on the whole group."); - ImGui::BeginGroup(); - { - ImGui::BeginGroup(); - ImGui::Button("AAA"); - ImGui::SameLine(); - ImGui::Button("BBB"); - ImGui::SameLine(); - ImGui::BeginGroup(); - ImGui::Button("CCC"); - ImGui::Button("DDD"); - ImGui::EndGroup(); - ImGui::SameLine(); - ImGui::Button("EEE"); - ImGui::EndGroup(); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("First group hovered"); - } - // Capture the group size and create widgets using the same size - ImVec2 size = ImGui::GetItemRectSize(); - const float values[5] = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f }; - ImGui::PlotHistogram("##values", values, IM_ARRAYSIZE(values), 0, NULL, 0.0f, 1.0f, size); - - ImGui::Button("ACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f, size.y)); - ImGui::SameLine(); - ImGui::Button("REACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f, size.y)); - ImGui::EndGroup(); - ImGui::SameLine(); - - ImGui::Button("LEVERAGE\nBUZZWORD", size); - ImGui::SameLine(); - - if (ImGui::BeginListBox("List", size)) - { - ImGui::Selectable("Selected", true); - ImGui::Selectable("Not Selected", false); - ImGui::EndListBox(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Layout/Text Baseline Alignment"); - if (ImGui::TreeNode("Text Baseline Alignment")) - { - { - ImGui::BulletText("Text baseline:"); - ImGui::SameLine(); HelpMarker( - "This is testing the vertical alignment that gets applied on text to keep it aligned with widgets. " - "Lines only composed of text or \"small\" widgets use less vertical space than lines with framed widgets."); - ImGui::Indent(); - - ImGui::Text("KO Blahblah"); ImGui::SameLine(); - ImGui::Button("Some framed item"); ImGui::SameLine(); - HelpMarker("Baseline of button will look misaligned with text.."); - - // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets. - // (because we don't know what's coming after the Text() statement, we need to move the text baseline - // down by FramePadding.y ahead of time) - ImGui::AlignTextToFramePadding(); - ImGui::Text("OK Blahblah"); ImGui::SameLine(); - ImGui::Button("Some framed item"); ImGui::SameLine(); - HelpMarker("We call AlignTextToFramePadding() to vertically align the text baseline by +FramePadding.y"); - - // SmallButton() uses the same vertical padding as Text - ImGui::Button("TEST##1"); ImGui::SameLine(); - ImGui::Text("TEST"); ImGui::SameLine(); - ImGui::SmallButton("TEST##2"); - - // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets. - ImGui::AlignTextToFramePadding(); - ImGui::Text("Text aligned to framed item"); ImGui::SameLine(); - ImGui::Button("Item##1"); ImGui::SameLine(); - ImGui::Text("Item"); ImGui::SameLine(); - ImGui::SmallButton("Item##2"); ImGui::SameLine(); - ImGui::Button("Item##3"); - - ImGui::Unindent(); - } - - ImGui::Spacing(); - - { - ImGui::BulletText("Multi-line text:"); - ImGui::Indent(); - ImGui::Text("One\nTwo\nThree"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - - ImGui::Text("Banana"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("One\nTwo\nThree"); - - ImGui::Button("HOP##1"); ImGui::SameLine(); - ImGui::Text("Banana"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - - ImGui::Button("HOP##2"); ImGui::SameLine(); - ImGui::Text("Hello\nWorld"); ImGui::SameLine(); - ImGui::Text("Banana"); - ImGui::Unindent(); - } - - ImGui::Spacing(); - - { - ImGui::BulletText("Misc items:"); - ImGui::Indent(); - - // SmallButton() sets FramePadding to zero. Text baseline is aligned to match baseline of previous Button. - ImGui::Button("80x80", ImVec2(80, 80)); - ImGui::SameLine(); - ImGui::Button("50x50", ImVec2(50, 50)); - ImGui::SameLine(); - ImGui::Button("Button()"); - ImGui::SameLine(); - ImGui::SmallButton("SmallButton()"); - - // Tree - const float spacing = ImGui::GetStyle().ItemInnerSpacing.x; - ImGui::Button("Button##1"); - ImGui::SameLine(0.0f, spacing); - if (ImGui::TreeNode("Node##1")) - { - // Placeholder tree data - for (int i = 0; i < 6; i++) - ImGui::BulletText("Item %d..", i); - ImGui::TreePop(); - } - - // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. - // Otherwise you can use SmallButton() (smaller fit). - ImGui::AlignTextToFramePadding(); - - // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add - // other contents below the node. - bool node_open = ImGui::TreeNode("Node##2"); - ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2"); - if (node_open) - { - // Placeholder tree data - for (int i = 0; i < 6; i++) - ImGui::BulletText("Item %d..", i); - ImGui::TreePop(); - } - - // Bullet - ImGui::Button("Button##3"); - ImGui::SameLine(0.0f, spacing); - ImGui::BulletText("Bullet text"); - - ImGui::AlignTextToFramePadding(); - ImGui::BulletText("Node"); - ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4"); - ImGui::Unindent(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Layout/Scrolling"); - if (ImGui::TreeNode("Scrolling")) - { - // Vertical scroll functions - IMGUI_DEMO_MARKER("Layout/Scrolling/Vertical"); - HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given vertical position."); - - static int track_item = 50; - static bool enable_track = true; - static bool enable_extra_decorations = false; - static float scroll_to_off_px = 0.0f; - static float scroll_to_pos_px = 200.0f; - - ImGui::Checkbox("Decoration", &enable_extra_decorations); - - ImGui::Checkbox("Track", &enable_track); - ImGui::PushItemWidth(100); - ImGui::SameLine(140); enable_track |= ImGui::DragInt("##item", &track_item, 0.25f, 0, 99, "Item = %d"); - - bool scroll_to_off = ImGui::Button("Scroll Offset"); - ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat("##off", &scroll_to_off_px, 1.00f, 0, FLT_MAX, "+%.0f px"); - - bool scroll_to_pos = ImGui::Button("Scroll To Pos"); - ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat("##pos", &scroll_to_pos_px, 1.00f, -10, FLT_MAX, "X/Y = %.0f px"); - ImGui::PopItemWidth(); - - if (scroll_to_off || scroll_to_pos) - enable_track = false; - - ImGuiStyle& style = ImGui::GetStyle(); - float child_w = (ImGui::GetContentRegionAvail().x - 4 * style.ItemSpacing.x) / 5; - if (child_w < 1.0f) - child_w = 1.0f; - ImGui::PushID("##VerticalScrolling"); - for (int i = 0; i < 5; i++) - { - if (i > 0) ImGui::SameLine(); - ImGui::BeginGroup(); - const char* names[] = { "Top", "25%", "Center", "75%", "Bottom" }; - ImGui::TextUnformatted(names[i]); - - const ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0; - const ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); - const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), true, child_flags); - if (ImGui::BeginMenuBar()) - { - ImGui::TextUnformatted("abc"); - ImGui::EndMenuBar(); - } - if (scroll_to_off) - ImGui::SetScrollY(scroll_to_off_px); - if (scroll_to_pos) - ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f); - if (child_is_visible) // Avoid calling SetScrollHereY when running with culled items - { - for (int item = 0; item < 100; item++) - { - if (enable_track && item == track_item) - { - ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item); - ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom - } - else - { - ImGui::Text("Item %d", item); - } - } - } - float scroll_y = ImGui::GetScrollY(); - float scroll_max_y = ImGui::GetScrollMaxY(); - ImGui::EndChild(); - ImGui::Text("%.0f/%.0f", scroll_y, scroll_max_y); - ImGui::EndGroup(); - } - ImGui::PopID(); - - // Horizontal scroll functions - IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal"); - ImGui::Spacing(); - HelpMarker( - "Use SetScrollHereX() or SetScrollFromPosX() to scroll to a given horizontal position.\n\n" - "Because the clipping rectangle of most window hides half worth of WindowPadding on the " - "left/right, using SetScrollFromPosX(+1) will usually result in clipped text whereas the " - "equivalent SetScrollFromPosY(+1) wouldn't."); - ImGui::PushID("##HorizontalScrolling"); - for (int i = 0; i < 5; i++) - { - float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f; - ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0); - ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); - bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), true, child_flags); - if (scroll_to_off) - ImGui::SetScrollX(scroll_to_off_px); - if (scroll_to_pos) - ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f); - if (child_is_visible) // Avoid calling SetScrollHereY when running with culled items - { - for (int item = 0; item < 100; item++) - { - if (item > 0) - ImGui::SameLine(); - if (enable_track && item == track_item) - { - ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item); - ImGui::SetScrollHereX(i * 0.25f); // 0.0f:left, 0.5f:center, 1.0f:right - } - else - { - ImGui::Text("Item %d", item); - } - } - } - float scroll_x = ImGui::GetScrollX(); - float scroll_max_x = ImGui::GetScrollMaxX(); - ImGui::EndChild(); - ImGui::SameLine(); - const char* names[] = { "Left", "25%", "Center", "75%", "Right" }; - ImGui::Text("%s\n%.0f/%.0f", names[i], scroll_x, scroll_max_x); - ImGui::Spacing(); - } - ImGui::PopID(); - - // Miscellaneous Horizontal Scrolling Demo - IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal (more)"); - HelpMarker( - "Horizontal scrolling for a window is enabled via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\n" - "You may want to also explicitly specify content width by using SetNextWindowContentWidth() before Begin()."); - static int lines = 7; - ImGui::SliderInt("Lines", &lines, 1, 15); - ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f)); - ImVec2 scrolling_child_size = ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 7 + 30); - ImGui::BeginChild("scrolling", scrolling_child_size, true, ImGuiWindowFlags_HorizontalScrollbar); - for (int line = 0; line < lines; line++) - { - // Display random stuff. For the sake of this trivial demo we are using basic Button() + SameLine() - // If you want to create your own time line for a real application you may be better off manipulating - // the cursor position yourself, aka using SetCursorPos/SetCursorScreenPos to position the widgets - // yourself. You may also want to use the lower-level ImDrawList API. - int num_buttons = 10 + ((line & 1) ? line * 9 : line * 3); - for (int n = 0; n < num_buttons; n++) - { - if (n > 0) ImGui::SameLine(); - ImGui::PushID(n + line * 1000); - char num_buf[16]; - sprintf(num_buf, "%d", n); - const char* label = (!(n % 15)) ? "FizzBuzz" : (!(n % 3)) ? "Fizz" : (!(n % 5)) ? "Buzz" : num_buf; - float hue = n * 0.05f; - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue, 0.8f, 0.8f)); - ImGui::Button(label, ImVec2(40.0f + sinf((float)(line + n)) * 20.0f, 0.0f)); - ImGui::PopStyleColor(3); - ImGui::PopID(); - } - } - float scroll_x = ImGui::GetScrollX(); - float scroll_max_x = ImGui::GetScrollMaxX(); - ImGui::EndChild(); - ImGui::PopStyleVar(2); - float scroll_x_delta = 0.0f; - ImGui::SmallButton("<<"); - if (ImGui::IsItemActive()) - scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; - ImGui::SameLine(); - ImGui::Text("Scroll from code"); ImGui::SameLine(); - ImGui::SmallButton(">>"); - if (ImGui::IsItemActive()) - scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; - ImGui::SameLine(); - ImGui::Text("%.0f/%.0f", scroll_x, scroll_max_x); - if (scroll_x_delta != 0.0f) - { - // Demonstrate a trick: you can use Begin to set yourself in the context of another window - // (here we are already out of your child window) - ImGui::BeginChild("scrolling"); - ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta); - ImGui::EndChild(); - } - ImGui::Spacing(); - - static bool show_horizontal_contents_size_demo_window = false; - ImGui::Checkbox("Show Horizontal contents size demo window", &show_horizontal_contents_size_demo_window); - - if (show_horizontal_contents_size_demo_window) - { - static bool show_h_scrollbar = true; - static bool show_button = true; - static bool show_tree_nodes = true; - static bool show_text_wrapped = false; - static bool show_columns = true; - static bool show_tab_bar = true; - static bool show_child = false; - static bool explicit_content_size = false; - static float contents_size_x = 300.0f; - if (explicit_content_size) - ImGui::SetNextWindowContentSize(ImVec2(contents_size_x, 0.0f)); - ImGui::Begin("Horizontal contents size demo window", &show_horizontal_contents_size_demo_window, show_h_scrollbar ? ImGuiWindowFlags_HorizontalScrollbar : 0); - IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal contents size demo window"); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0)); - HelpMarker("Test of different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\nUse 'Metrics->Tools->Show windows rectangles' to visualize rectangles."); - ImGui::Checkbox("H-scrollbar", &show_h_scrollbar); - ImGui::Checkbox("Button", &show_button); // Will grow contents size (unless explicitly overwritten) - ImGui::Checkbox("Tree nodes", &show_tree_nodes); // Will grow contents size and display highlight over full width - ImGui::Checkbox("Text wrapped", &show_text_wrapped);// Will grow and use contents size - ImGui::Checkbox("Columns", &show_columns); // Will use contents size - ImGui::Checkbox("Tab bar", &show_tab_bar); // Will use contents size - ImGui::Checkbox("Child", &show_child); // Will grow and use contents size - ImGui::Checkbox("Explicit content size", &explicit_content_size); - ImGui::Text("Scroll %.1f/%.1f %.1f/%.1f", ImGui::GetScrollX(), ImGui::GetScrollMaxX(), ImGui::GetScrollY(), ImGui::GetScrollMaxY()); - if (explicit_content_size) - { - ImGui::SameLine(); - ImGui::SetNextItemWidth(100); - ImGui::DragFloat("##csx", &contents_size_x); - ImVec2 p = ImGui::GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + 10, p.y + 10), IM_COL32_WHITE); - ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(p.x + contents_size_x - 10, p.y), ImVec2(p.x + contents_size_x, p.y + 10), IM_COL32_WHITE); - ImGui::Dummy(ImVec2(0, 10)); - } - ImGui::PopStyleVar(2); - ImGui::Separator(); - if (show_button) - { - ImGui::Button("this is a 300-wide button", ImVec2(300, 0)); - } - if (show_tree_nodes) - { - bool open = true; - if (ImGui::TreeNode("this is a tree node")) - { - if (ImGui::TreeNode("another one of those tree node...")) - { - ImGui::Text("Some tree contents"); - ImGui::TreePop(); - } - ImGui::TreePop(); - } - ImGui::CollapsingHeader("CollapsingHeader", &open); - } - if (show_text_wrapped) - { - ImGui::TextWrapped("This text should automatically wrap on the edge of the work rectangle."); - } - if (show_columns) - { - ImGui::Text("Tables:"); - if (ImGui::BeginTable("table", 4, ImGuiTableFlags_Borders)) - { - for (int n = 0; n < 4; n++) - { - ImGui::TableNextColumn(); - ImGui::Text("Width %.2f", ImGui::GetContentRegionAvail().x); - } - ImGui::EndTable(); - } - ImGui::Text("Columns:"); - ImGui::Columns(4); - for (int n = 0; n < 4; n++) - { - ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); - ImGui::NextColumn(); - } - ImGui::Columns(1); - } - if (show_tab_bar && ImGui::BeginTabBar("Hello")) - { - if (ImGui::BeginTabItem("OneOneOne")) { ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("TwoTwoTwo")) { ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("ThreeThreeThree")) { ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("FourFourFour")) { ImGui::EndTabItem(); } - ImGui::EndTabBar(); - } - if (show_child) - { - ImGui::BeginChild("child", ImVec2(0, 0), true); - ImGui::EndChild(); - } - ImGui::End(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Layout/Clipping"); - if (ImGui::TreeNode("Clipping")) - { - static ImVec2 size(100.0f, 100.0f); - static ImVec2 offset(30.0f, 30.0f); - ImGui::DragFloat2("size", (float*)&size, 0.5f, 1.0f, 200.0f, "%.0f"); - ImGui::TextWrapped("(Click and drag to scroll)"); - - HelpMarker( - "(Left) Using ImGui::PushClipRect():\n" - "Will alter ImGui hit-testing logic + ImDrawList rendering.\n" - "(use this if you want your clipping rectangle to affect interactions)\n\n" - "(Center) Using ImDrawList::PushClipRect():\n" - "Will alter ImDrawList rendering only.\n" - "(use this as a shortcut if you are only using ImDrawList calls)\n\n" - "(Right) Using ImDrawList::AddText() with a fine ClipRect:\n" - "Will alter only this specific ImDrawList::AddText() rendering.\n" - "This is often used internally to avoid altering the clipping rectangle and minimize draw calls."); - - for (int n = 0; n < 3; n++) - { - if (n > 0) - ImGui::SameLine(); - - ImGui::PushID(n); - ImGui::InvisibleButton("##canvas", size); - if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) - { - offset.x += ImGui::GetIO().MouseDelta.x; - offset.y += ImGui::GetIO().MouseDelta.y; - } - ImGui::PopID(); - if (!ImGui::IsItemVisible()) // Skip rendering as ImDrawList elements are not clipped. - continue; - - const ImVec2 p0 = ImGui::GetItemRectMin(); - const ImVec2 p1 = ImGui::GetItemRectMax(); - const char* text_str = "Line 1 hello\nLine 2 clip me!"; - const ImVec2 text_pos = ImVec2(p0.x + offset.x, p0.y + offset.y); - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - switch (n) - { - case 0: - ImGui::PushClipRect(p0, p1, true); - draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); - draw_list->AddText(text_pos, IM_COL32_WHITE, text_str); - ImGui::PopClipRect(); - break; - case 1: - draw_list->PushClipRect(p0, p1, true); - draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); - draw_list->AddText(text_pos, IM_COL32_WHITE, text_str); - draw_list->PopClipRect(); - break; - case 2: - ImVec4 clip_rect(p0.x, p0.y, p1.x, p1.y); // AddText() takes a ImVec4* here so let's convert. - draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); - draw_list->AddText(ImGui::GetFont(), ImGui::GetFontSize(), text_pos, IM_COL32_WHITE, text_str, NULL, 0.0f, &clip_rect); - break; - } - } - - ImGui::TreePop(); - } -} - -static void ShowDemoWindowPopups() -{ - IMGUI_DEMO_MARKER("Popups"); - if (!ImGui::CollapsingHeader("Popups & Modal windows")) - return; - - // The properties of popups windows are: - // - They block normal mouse hovering detection outside them. (*) - // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE. - // - Their visibility state (~bool) is held internally by Dear ImGui instead of being held by the programmer as - // we are used to with regular Begin() calls. User can manipulate the visibility state by calling OpenPopup(). - // (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even - // when normally blocked by a popup. - // Those three properties are connected. The library needs to hold their visibility state BECAUSE it can close - // popups at any time. - - // Typical use for regular windows: - // bool my_tool_is_active = false; if (ImGui::Button("Open")) my_tool_is_active = true; [...] if (my_tool_is_active) Begin("My Tool", &my_tool_is_active) { [...] } End(); - // Typical use for popups: - // if (ImGui::Button("Open")) ImGui::OpenPopup("MyPopup"); if (ImGui::BeginPopup("MyPopup") { [...] EndPopup(); } - - // With popups we have to go through a library call (here OpenPopup) to manipulate the visibility state. - // This may be a bit confusing at first but it should quickly make sense. Follow on the examples below. - - IMGUI_DEMO_MARKER("Popups/Popups"); - if (ImGui::TreeNode("Popups")) - { - ImGui::TextWrapped( - "When a popup is active, it inhibits interacting with windows that are behind the popup. " - "Clicking outside the popup closes it."); - - static int selected_fish = -1; - const char* names[] = { "Bream", "Haddock", "Mackerel", "Pollock", "Tilefish" }; - static bool toggles[] = { true, false, false, false, false }; - - // Simple selection popup (if you want to show the current selection inside the Button itself, - // you may want to build a string using the "###" operator to preserve a constant ID with a variable label) - if (ImGui::Button("Select..")) - ImGui::OpenPopup("my_select_popup"); - ImGui::SameLine(); - ImGui::TextUnformatted(selected_fish == -1 ? "" : names[selected_fish]); - if (ImGui::BeginPopup("my_select_popup")) - { - ImGui::Text("Aquarium"); - ImGui::Separator(); - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - if (ImGui::Selectable(names[i])) - selected_fish = i; - ImGui::EndPopup(); - } - - // Showing a menu with toggles - if (ImGui::Button("Toggle..")) - ImGui::OpenPopup("my_toggle_popup"); - if (ImGui::BeginPopup("my_toggle_popup")) - { - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - ImGui::MenuItem(names[i], "", &toggles[i]); - if (ImGui::BeginMenu("Sub-menu")) - { - ImGui::MenuItem("Click me"); - ImGui::EndMenu(); - } - - ImGui::Separator(); - ImGui::Text("Tooltip here"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("I am a tooltip over a popup"); - - if (ImGui::Button("Stacked Popup")) - ImGui::OpenPopup("another popup"); - if (ImGui::BeginPopup("another popup")) - { - for (int i = 0; i < IM_ARRAYSIZE(names); i++) - ImGui::MenuItem(names[i], "", &toggles[i]); - if (ImGui::BeginMenu("Sub-menu")) - { - ImGui::MenuItem("Click me"); - if (ImGui::Button("Stacked Popup")) - ImGui::OpenPopup("another popup"); - if (ImGui::BeginPopup("another popup")) - { - ImGui::Text("I am the last one here."); - ImGui::EndPopup(); - } - ImGui::EndMenu(); - } - ImGui::EndPopup(); - } - ImGui::EndPopup(); - } - - // Call the more complete ShowExampleMenuFile which we use in various places of this demo - if (ImGui::Button("With a menu..")) - ImGui::OpenPopup("my_file_popup"); - if (ImGui::BeginPopup("my_file_popup", ImGuiWindowFlags_MenuBar)) - { - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Edit")) - { - ImGui::MenuItem("Dummy"); - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - ImGui::Text("Hello from popup!"); - ImGui::Button("This is a dummy button.."); - ImGui::EndPopup(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Popups/Context menus"); - if (ImGui::TreeNode("Context menus")) - { - HelpMarker("\"Context\" functions are simple helpers to associate a Popup to a given Item or Window identifier."); - - // BeginPopupContextItem() is a helper to provide common/simple popup behavior of essentially doing: - // if (id == 0) - // id = GetItemID(); // Use last item id - // if (IsItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) - // OpenPopup(id); - // return BeginPopup(id); - // For advanced advanced uses you may want to replicate and customize this code. - // See more details in BeginPopupContextItem(). - - // Example 1 - // When used after an item that has an ID (e.g. Button), we can skip providing an ID to BeginPopupContextItem(), - // and BeginPopupContextItem() will use the last item ID as the popup ID. - { - const char* names[5] = { "Label1", "Label2", "Label3", "Label4", "Label5" }; - for (int n = 0; n < 5; n++) - { - ImGui::Selectable(names[n]); - if (ImGui::BeginPopupContextItem()) // <-- use last item id as popup id - { - ImGui::Text("This a popup for \"%s\"!", names[n]); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("Right-click to open popup"); - } - } - - // Example 2 - // Popup on a Text() element which doesn't have an identifier: we need to provide an identifier to BeginPopupContextItem(). - // Using an explicit identifier is also convenient if you want to activate the popups from different locations. - { - HelpMarker("Text() elements don't have stable identifiers so we need to provide one."); - static float value = 0.5f; - ImGui::Text("Value = %.3f <-- (1) right-click this text", value); - if (ImGui::BeginPopupContextItem("my popup")) - { - if (ImGui::Selectable("Set to zero")) value = 0.0f; - if (ImGui::Selectable("Set to PI")) value = 3.1415f; - ImGui::SetNextItemWidth(-FLT_MIN); - ImGui::DragFloat("##Value", &value, 0.1f, 0.0f, 0.0f); - ImGui::EndPopup(); - } - - // We can also use OpenPopupOnItemClick() to toggle the visibility of a given popup. - // Here we make it that right-clicking this other text element opens the same popup as above. - // The popup itself will be submitted by the code above. - ImGui::Text("(2) Or right-click this text"); - ImGui::OpenPopupOnItemClick("my popup", ImGuiPopupFlags_MouseButtonRight); - - // Back to square one: manually open the same popup. - if (ImGui::Button("(3) Or click this button")) - ImGui::OpenPopup("my popup"); - } - - // Example 3 - // When using BeginPopupContextItem() with an implicit identifier (NULL == use last item ID), - // we need to make sure your item identifier is stable. - // In this example we showcase altering the item label while preserving its identifier, using the ### operator (see FAQ). - { - HelpMarker("Showcase using a popup ID linked to item ID, with the item having a changing label + stable ID using the ### operator."); - static char name[32] = "Label1"; - char buf[64]; - sprintf(buf, "Button: %s###Button", name); // ### operator override ID ignoring the preceding label - ImGui::Button(buf); - if (ImGui::BeginPopupContextItem()) - { - ImGui::Text("Edit name:"); - ImGui::InputText("##edit", name, IM_ARRAYSIZE(name)); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - ImGui::SameLine(); ImGui::Text("(<-- right-click here)"); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Popups/Modals"); - if (ImGui::TreeNode("Modals")) - { - ImGui::TextWrapped("Modal windows are like popups but the user cannot close them by clicking outside."); - - if (ImGui::Button("Delete..")) - ImGui::OpenPopup("Delete?"); - - // Always center this window when appearing - ImVec2 center = ImGui::GetMainViewport()->GetCenter(); - ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); - - if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n"); - ImGui::Separator(); - - //static int unused_i = 0; - //ImGui::Combo("Combo", &unused_i, "Delete\0Delete harder\0"); - - static bool dont_ask_me_next_time = false; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - ImGui::Checkbox("Don't ask me next time", &dont_ask_me_next_time); - ImGui::PopStyleVar(); - - if (ImGui::Button("OK", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } - ImGui::SetItemDefaultFocus(); - ImGui::SameLine(); - if (ImGui::Button("Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } - ImGui::EndPopup(); - } - - if (ImGui::Button("Stacked modals..")) - ImGui::OpenPopup("Stacked 1"); - if (ImGui::BeginPopupModal("Stacked 1", NULL, ImGuiWindowFlags_MenuBar)) - { - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - if (ImGui::MenuItem("Some menu item")) {} - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - ImGui::Text("Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDimBg] behind it."); - - // Testing behavior of widgets stacking their own regular popups over the modal. - static int item = 1; - static float color[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; - ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); - ImGui::ColorEdit4("color", color); - - if (ImGui::Button("Add another modal..")) - ImGui::OpenPopup("Stacked 2"); - - // Also demonstrate passing a bool* to BeginPopupModal(), this will create a regular close button which - // will close the popup. Note that the visibility state of popups is owned by imgui, so the input value - // of the bool actually doesn't matter here. - bool unused_open = true; - if (ImGui::BeginPopupModal("Stacked 2", &unused_open)) - { - ImGui::Text("Hello from Stacked The Second!"); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Popups/Menus inside a regular window"); - if (ImGui::TreeNode("Menus inside a regular window")) - { - ImGui::TextWrapped("Below we are testing adding menu items to a regular window. It's rather unusual but should work!"); - ImGui::Separator(); - - ImGui::MenuItem("Menu item", "CTRL+M"); - if (ImGui::BeginMenu("Menu inside a regular window")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - ImGui::Separator(); - ImGui::TreePop(); - } -} - -// Dummy data structure that we use for the Table demo. -// (pre-C++11 doesn't allow us to instantiate ImVector template if this structure if defined inside the demo function) -namespace -{ -// We are passing our own identifier to TableSetupColumn() to facilitate identifying columns in the sorting code. -// This identifier will be passed down into ImGuiTableSortSpec::ColumnUserID. -// But it is possible to omit the user id parameter of TableSetupColumn() and just use the column index instead! (ImGuiTableSortSpec::ColumnIndex) -// If you don't use sorting, you will generally never care about giving column an ID! -enum MyItemColumnID -{ - MyItemColumnID_ID, - MyItemColumnID_Name, - MyItemColumnID_Action, - MyItemColumnID_Quantity, - MyItemColumnID_Description -}; - -struct MyItem -{ - int ID; - const char* Name; - int Quantity; - - // We have a problem which is affecting _only this demo_ and should not affect your code: - // As we don't rely on std:: or other third-party library to compile dear imgui, we only have reliable access to qsort(), - // however qsort doesn't allow passing user data to comparing function. - // As a workaround, we are storing the sort specs in a static/global for the comparing function to access. - // In your own use case you would probably pass the sort specs to your sorting/comparing functions directly and not use a global. - // We could technically call ImGui::TableGetSortSpecs() in CompareWithSortSpecs(), but considering that this function is called - // very often by the sorting algorithm it would be a little wasteful. - static const ImGuiTableSortSpecs* s_current_sort_specs; - - // Compare function to be used by qsort() - static int IMGUI_CDECL CompareWithSortSpecs(const void* lhs, const void* rhs) - { - const MyItem* a = (const MyItem*)lhs; - const MyItem* b = (const MyItem*)rhs; - for (int n = 0; n < s_current_sort_specs->SpecsCount; n++) - { - // Here we identify columns using the ColumnUserID value that we ourselves passed to TableSetupColumn() - // We could also choose to identify columns based on their index (sort_spec->ColumnIndex), which is simpler! - const ImGuiTableColumnSortSpecs* sort_spec = &s_current_sort_specs->Specs[n]; - int delta = 0; - switch (sort_spec->ColumnUserID) - { - case MyItemColumnID_ID: delta = (a->ID - b->ID); break; - case MyItemColumnID_Name: delta = (strcmp(a->Name, b->Name)); break; - case MyItemColumnID_Quantity: delta = (a->Quantity - b->Quantity); break; - case MyItemColumnID_Description: delta = (strcmp(a->Name, b->Name)); break; - default: IM_ASSERT(0); break; - } - if (delta > 0) - return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? +1 : -1; - if (delta < 0) - return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? -1 : +1; - } - - // qsort() is instable so always return a way to differenciate items. - // Your own compare function may want to avoid fallback on implicit sort specs e.g. a Name compare if it wasn't already part of the sort specs. - return (a->ID - b->ID); - } -}; -const ImGuiTableSortSpecs* MyItem::s_current_sort_specs = NULL; -} - -// Make the UI compact because there are so many fields -static void PushStyleCompact() -{ - ImGuiStyle& style = ImGui::GetStyle(); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(style.FramePadding.x, (float)(int)(style.FramePadding.y * 0.60f))); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x, (float)(int)(style.ItemSpacing.y * 0.60f))); -} - -static void PopStyleCompact() -{ - ImGui::PopStyleVar(2); -} - -// Show a combo box with a choice of sizing policies -static void EditTableSizingFlags(ImGuiTableFlags* p_flags) -{ - struct EnumDesc { ImGuiTableFlags Value; const char* Name; const char* Tooltip; }; - static const EnumDesc policies[] = - { - { ImGuiTableFlags_None, "Default", "Use default sizing policy:\n- ImGuiTableFlags_SizingFixedFit if ScrollX is on or if host window has ImGuiWindowFlags_AlwaysAutoResize.\n- ImGuiTableFlags_SizingStretchSame otherwise." }, - { ImGuiTableFlags_SizingFixedFit, "ImGuiTableFlags_SizingFixedFit", "Columns default to _WidthFixed (if resizable) or _WidthAuto (if not resizable), matching contents width." }, - { ImGuiTableFlags_SizingFixedSame, "ImGuiTableFlags_SizingFixedSame", "Columns are all the same width, matching the maximum contents width.\nImplicitly disable ImGuiTableFlags_Resizable and enable ImGuiTableFlags_NoKeepColumnsVisible." }, - { ImGuiTableFlags_SizingStretchProp, "ImGuiTableFlags_SizingStretchProp", "Columns default to _WidthStretch with weights proportional to their widths." }, - { ImGuiTableFlags_SizingStretchSame, "ImGuiTableFlags_SizingStretchSame", "Columns default to _WidthStretch with same weights." } - }; - int idx; - for (idx = 0; idx < IM_ARRAYSIZE(policies); idx++) - if (policies[idx].Value == (*p_flags & ImGuiTableFlags_SizingMask_)) - break; - const char* preview_text = (idx < IM_ARRAYSIZE(policies)) ? policies[idx].Name + (idx > 0 ? strlen("ImGuiTableFlags") : 0) : ""; - if (ImGui::BeginCombo("Sizing Policy", preview_text)) - { - for (int n = 0; n < IM_ARRAYSIZE(policies); n++) - if (ImGui::Selectable(policies[n].Name, idx == n)) - *p_flags = (*p_flags & ~ImGuiTableFlags_SizingMask_) | policies[n].Value; - ImGui::EndCombo(); - } - ImGui::SameLine(); - ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(ImGui::GetFontSize() * 50.0f); - for (int m = 0; m < IM_ARRAYSIZE(policies); m++) - { - ImGui::Separator(); - ImGui::Text("%s:", policies[m].Name); - ImGui::Separator(); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetStyle().IndentSpacing * 0.5f); - ImGui::TextUnformatted(policies[m].Tooltip); - } - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } -} - -static void EditTableColumnsFlags(ImGuiTableColumnFlags* p_flags) -{ - ImGui::CheckboxFlags("_Disabled", p_flags, ImGuiTableColumnFlags_Disabled); ImGui::SameLine(); HelpMarker("Master disable flag (also hide from context menu)"); - ImGui::CheckboxFlags("_DefaultHide", p_flags, ImGuiTableColumnFlags_DefaultHide); - ImGui::CheckboxFlags("_DefaultSort", p_flags, ImGuiTableColumnFlags_DefaultSort); - if (ImGui::CheckboxFlags("_WidthStretch", p_flags, ImGuiTableColumnFlags_WidthStretch)) - *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthStretch); - if (ImGui::CheckboxFlags("_WidthFixed", p_flags, ImGuiTableColumnFlags_WidthFixed)) - *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthFixed); - ImGui::CheckboxFlags("_NoResize", p_flags, ImGuiTableColumnFlags_NoResize); - ImGui::CheckboxFlags("_NoReorder", p_flags, ImGuiTableColumnFlags_NoReorder); - ImGui::CheckboxFlags("_NoHide", p_flags, ImGuiTableColumnFlags_NoHide); - ImGui::CheckboxFlags("_NoClip", p_flags, ImGuiTableColumnFlags_NoClip); - ImGui::CheckboxFlags("_NoSort", p_flags, ImGuiTableColumnFlags_NoSort); - ImGui::CheckboxFlags("_NoSortAscending", p_flags, ImGuiTableColumnFlags_NoSortAscending); - ImGui::CheckboxFlags("_NoSortDescending", p_flags, ImGuiTableColumnFlags_NoSortDescending); - ImGui::CheckboxFlags("_NoHeaderLabel", p_flags, ImGuiTableColumnFlags_NoHeaderLabel); - ImGui::CheckboxFlags("_NoHeaderWidth", p_flags, ImGuiTableColumnFlags_NoHeaderWidth); - ImGui::CheckboxFlags("_PreferSortAscending", p_flags, ImGuiTableColumnFlags_PreferSortAscending); - ImGui::CheckboxFlags("_PreferSortDescending", p_flags, ImGuiTableColumnFlags_PreferSortDescending); - ImGui::CheckboxFlags("_IndentEnable", p_flags, ImGuiTableColumnFlags_IndentEnable); ImGui::SameLine(); HelpMarker("Default for column 0"); - ImGui::CheckboxFlags("_IndentDisable", p_flags, ImGuiTableColumnFlags_IndentDisable); ImGui::SameLine(); HelpMarker("Default for column >0"); -} - -static void ShowTableColumnsStatusFlags(ImGuiTableColumnFlags flags) -{ - ImGui::CheckboxFlags("_IsEnabled", &flags, ImGuiTableColumnFlags_IsEnabled); - ImGui::CheckboxFlags("_IsVisible", &flags, ImGuiTableColumnFlags_IsVisible); - ImGui::CheckboxFlags("_IsSorted", &flags, ImGuiTableColumnFlags_IsSorted); - ImGui::CheckboxFlags("_IsHovered", &flags, ImGuiTableColumnFlags_IsHovered); -} - -static void ShowDemoWindowTables() -{ - //ImGui::SetNextItemOpen(true, ImGuiCond_Once); - IMGUI_DEMO_MARKER("Tables"); - if (!ImGui::CollapsingHeader("Tables & Columns")) - return; - - // Using those as a base value to create width/height that are factor of the size of our font - const float TEXT_BASE_WIDTH = ImGui::CalcTextSize("A").x; - const float TEXT_BASE_HEIGHT = ImGui::GetTextLineHeightWithSpacing(); - - ImGui::PushID("Tables"); - - int open_action = -1; - if (ImGui::Button("Open all")) - open_action = 1; - ImGui::SameLine(); - if (ImGui::Button("Close all")) - open_action = 0; - ImGui::SameLine(); - - // Options - static bool disable_indent = false; - ImGui::Checkbox("Disable tree indentation", &disable_indent); - ImGui::SameLine(); - HelpMarker("Disable the indenting of tree nodes so demo tables can use the full window width."); - ImGui::Separator(); - if (disable_indent) - ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0.0f); - - // About Styling of tables - // Most settings are configured on a per-table basis via the flags passed to BeginTable() and TableSetupColumns APIs. - // There are however a few settings that a shared and part of the ImGuiStyle structure: - // style.CellPadding // Padding within each cell - // style.Colors[ImGuiCol_TableHeaderBg] // Table header background - // style.Colors[ImGuiCol_TableBorderStrong] // Table outer and header borders - // style.Colors[ImGuiCol_TableBorderLight] // Table inner borders - // style.Colors[ImGuiCol_TableRowBg] // Table row background when ImGuiTableFlags_RowBg is enabled (even rows) - // style.Colors[ImGuiCol_TableRowBgAlt] // Table row background when ImGuiTableFlags_RowBg is enabled (odds rows) - - // Demos - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Basic"); - if (ImGui::TreeNode("Basic")) - { - // Here we will showcase three different ways to output a table. - // They are very simple variations of a same thing! - - // [Method 1] Using TableNextRow() to create a new row, and TableSetColumnIndex() to select the column. - // In many situations, this is the most flexible and easy to use pattern. - HelpMarker("Using TableNextRow() + calling TableSetColumnIndex() _before_ each cell, in a loop."); - if (ImGui::BeginTable("table1", 3)) - { - for (int row = 0; row < 4; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("Row %d Column %d", row, column); - } - } - ImGui::EndTable(); - } - - // [Method 2] Using TableNextColumn() called multiple times, instead of using a for loop + TableSetColumnIndex(). - // This is generally more convenient when you have code manually submitting the contents of each columns. - HelpMarker("Using TableNextRow() + calling TableNextColumn() _before_ each cell, manually."); - if (ImGui::BeginTable("table2", 3)) - { - for (int row = 0; row < 4; row++) - { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::Text("Row %d", row); - ImGui::TableNextColumn(); - ImGui::Text("Some contents"); - ImGui::TableNextColumn(); - ImGui::Text("123.456"); - } - ImGui::EndTable(); - } - - // [Method 3] We call TableNextColumn() _before_ each cell. We never call TableNextRow(), - // as TableNextColumn() will automatically wrap around and create new roes as needed. - // This is generally more convenient when your cells all contains the same type of data. - HelpMarker( - "Only using TableNextColumn(), which tends to be convenient for tables where every cells contains the same type of contents.\n" - "This is also more similar to the old NextColumn() function of the Columns API, and provided to facilitate the Columns->Tables API transition."); - if (ImGui::BeginTable("table3", 3)) - { - for (int item = 0; item < 14; item++) - { - ImGui::TableNextColumn(); - ImGui::Text("Item %d", item); - } - ImGui::EndTable(); - } - - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Borders, background"); - if (ImGui::TreeNode("Borders, background")) - { - // Expose a few Borders related flags interactively - enum ContentsType { CT_Text, CT_FillButton }; - static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg; - static bool display_headers = false; - static int contents_type = CT_Text; - - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); - ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders); - ImGui::SameLine(); HelpMarker("ImGuiTableFlags_Borders\n = ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterV\n | ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterH"); - ImGui::Indent(); - - ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH); - ImGui::Indent(); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH); - ImGui::Unindent(); - - ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); - ImGui::Indent(); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV); - ImGui::Unindent(); - - ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuter", &flags, ImGuiTableFlags_BordersOuter); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersInner", &flags, ImGuiTableFlags_BordersInner); - ImGui::Unindent(); - - ImGui::AlignTextToFramePadding(); ImGui::Text("Cell contents:"); - ImGui::SameLine(); ImGui::RadioButton("Text", &contents_type, CT_Text); - ImGui::SameLine(); ImGui::RadioButton("FillButton", &contents_type, CT_FillButton); - ImGui::Checkbox("Display headers", &display_headers); - ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appears in Headers"); - PopStyleCompact(); - - if (ImGui::BeginTable("table1", 3, flags)) - { - // Display headers so we can inspect their interaction with borders. - // (Headers are not the main purpose of this section of the demo, so we are not elaborating on them too much. See other sections for details) - if (display_headers) - { - ImGui::TableSetupColumn("One"); - ImGui::TableSetupColumn("Two"); - ImGui::TableSetupColumn("Three"); - ImGui::TableHeadersRow(); - } - - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - char buf[32]; - sprintf(buf, "Hello %d,%d", column, row); - if (contents_type == CT_Text) - ImGui::TextUnformatted(buf); - else if (contents_type == CT_FillButton) - ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Resizable, stretch"); - if (ImGui::TreeNode("Resizable, stretch")) - { - // By default, if we don't enable ScrollX the sizing policy for each columns is "Stretch" - // Each columns maintain a sizing weight, and they will occupy all available width. - static ImGuiTableFlags flags = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); - ImGui::SameLine(); HelpMarker("Using the _Resizable flag automatically enables the _BordersInnerV flag as well, this is why the resize borders are still showing when unchecking this."); - PopStyleCompact(); - - if (ImGui::BeginTable("table1", 3, flags)) - { - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("Hello %d,%d", column, row); - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Resizable, fixed"); - if (ImGui::TreeNode("Resizable, fixed")) - { - // Here we use ImGuiTableFlags_SizingFixedFit (even though _ScrollX is not set) - // So columns will adopt the "Fixed" policy and will maintain a fixed width regardless of the whole available width (unless table is small) - // If there is not enough available width to fit all columns, they will however be resized down. - // FIXME-TABLE: Providing a stretch-on-init would make sense especially for tables which don't have saved settings - HelpMarker( - "Using _Resizable + _SizingFixedFit flags.\n" - "Fixed-width columns generally makes more sense if you want to use horizontal scrolling.\n\n" - "Double-click a column border to auto-fit the column to its contents."); - PushStyleCompact(); - static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; - ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); - PopStyleCompact(); - - if (ImGui::BeginTable("table1", 3, flags)) - { - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("Hello %d,%d", column, row); - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Resizable, mixed"); - if (ImGui::TreeNode("Resizable, mixed")) - { - HelpMarker( - "Using TableSetupColumn() to alter resizing policy on a per-column basis.\n\n" - "When combining Fixed and Stretch columns, generally you only want one, maybe two trailing columns to use _WidthStretch."); - static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; - - if (ImGui::BeginTable("table1", 3, flags)) - { - ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableHeadersRow(); - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("%s %d,%d", (column == 2) ? "Stretch" : "Fixed", column, row); - } - } - ImGui::EndTable(); - } - if (ImGui::BeginTable("table2", 6, flags)) - { - ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_DefaultHide); - ImGui::TableSetupColumn("DDD", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("EEE", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("FFF", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_DefaultHide); - ImGui::TableHeadersRow(); - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 6; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("%s %d,%d", (column >= 3) ? "Stretch" : "Fixed", column, row); - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Reorderable, hideable, with headers"); - if (ImGui::TreeNode("Reorderable, hideable, with headers")) - { - HelpMarker( - "Click and drag column headers to reorder columns.\n\n" - "Right-click on a header to open a context menu."); - static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); - ImGui::CheckboxFlags("ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable); - ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); - ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); - ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers)"); - PopStyleCompact(); - - if (ImGui::BeginTable("table1", 3, flags)) - { - // Submit columns name with TableSetupColumn() and call TableHeadersRow() to create a row with a header in each column. - // (Later we will show how TableSetupColumn() has other uses, optional flags, sizing weight etc.) - ImGui::TableSetupColumn("One"); - ImGui::TableSetupColumn("Two"); - ImGui::TableSetupColumn("Three"); - ImGui::TableHeadersRow(); - for (int row = 0; row < 6; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("Hello %d,%d", column, row); - } - } - ImGui::EndTable(); - } - - // Use outer_size.x == 0.0f instead of default to make the table as tight as possible (only valid when no scrolling and no stretch column) - if (ImGui::BeginTable("table2", 3, flags | ImGuiTableFlags_SizingFixedFit, ImVec2(0.0f, 0.0f))) - { - ImGui::TableSetupColumn("One"); - ImGui::TableSetupColumn("Two"); - ImGui::TableSetupColumn("Three"); - ImGui::TableHeadersRow(); - for (int row = 0; row < 6; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("Fixed %d,%d", column, row); - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Padding"); - if (ImGui::TreeNode("Padding")) - { - // First example: showcase use of padding flags and effect of BorderOuterV/BorderInnerV on X padding. - // We don't expose BorderOuterH/BorderInnerH here because they have no effect on X padding. - HelpMarker( - "We often want outer padding activated when any using features which makes the edges of a column visible:\n" - "e.g.:\n" - "- BorderOuterV\n" - "- any form of row selection\n" - "Because of this, activating BorderOuterV sets the default to PadOuterX. Using PadOuterX or NoPadOuterX you can override the default.\n\n" - "Actual padding values are using style.CellPadding.\n\n" - "In this demo we don't show horizontal borders to emphasis how they don't affect default horizontal padding."); - - static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV; - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_PadOuterX", &flags1, ImGuiTableFlags_PadOuterX); - ImGui::SameLine(); HelpMarker("Enable outer-most padding (default if ImGuiTableFlags_BordersOuterV is set)"); - ImGui::CheckboxFlags("ImGuiTableFlags_NoPadOuterX", &flags1, ImGuiTableFlags_NoPadOuterX); - ImGui::SameLine(); HelpMarker("Disable outer-most padding (default if ImGuiTableFlags_BordersOuterV is not set)"); - ImGui::CheckboxFlags("ImGuiTableFlags_NoPadInnerX", &flags1, ImGuiTableFlags_NoPadInnerX); - ImGui::SameLine(); HelpMarker("Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off)"); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags1, ImGuiTableFlags_BordersOuterV); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags1, ImGuiTableFlags_BordersInnerV); - static bool show_headers = false; - ImGui::Checkbox("show_headers", &show_headers); - PopStyleCompact(); - - if (ImGui::BeginTable("table_padding", 3, flags1)) - { - if (show_headers) - { - ImGui::TableSetupColumn("One"); - ImGui::TableSetupColumn("Two"); - ImGui::TableSetupColumn("Three"); - ImGui::TableHeadersRow(); - } - - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - if (row == 0) - { - ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); - } - else - { - char buf[32]; - sprintf(buf, "Hello %d,%d", column, row); - ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); - } - //if (ImGui::TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) - // ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, IM_COL32(0, 100, 0, 255)); - } - } - ImGui::EndTable(); - } - - // Second example: set style.CellPadding to (0.0) or a custom value. - // FIXME-TABLE: Vertical border effectively not displayed the same way as horizontal one... - HelpMarker("Setting style.CellPadding to (0,0) or a custom value."); - static ImGuiTableFlags flags2 = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg; - static ImVec2 cell_padding(0.0f, 0.0f); - static bool show_widget_frame_bg = true; - - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags2, ImGuiTableFlags_Borders); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags2, ImGuiTableFlags_BordersH); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags2, ImGuiTableFlags_BordersV); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersInner", &flags2, ImGuiTableFlags_BordersInner); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuter", &flags2, ImGuiTableFlags_BordersOuter); - ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags2, ImGuiTableFlags_RowBg); - ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags2, ImGuiTableFlags_Resizable); - ImGui::Checkbox("show_widget_frame_bg", &show_widget_frame_bg); - ImGui::SliderFloat2("CellPadding", &cell_padding.x, 0.0f, 10.0f, "%.0f"); - PopStyleCompact(); - - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cell_padding); - if (ImGui::BeginTable("table_padding_2", 3, flags2)) - { - static char text_bufs[3 * 5][16]; // Mini text storage for 3x5 cells - static bool init = true; - if (!show_widget_frame_bg) - ImGui::PushStyleColor(ImGuiCol_FrameBg, 0); - for (int cell = 0; cell < 3 * 5; cell++) - { - ImGui::TableNextColumn(); - if (init) - strcpy(text_bufs[cell], "edit me"); - ImGui::SetNextItemWidth(-FLT_MIN); - ImGui::PushID(cell); - ImGui::InputText("##cell", text_bufs[cell], IM_ARRAYSIZE(text_bufs[cell])); - ImGui::PopID(); - } - if (!show_widget_frame_bg) - ImGui::PopStyleColor(); - init = false; - ImGui::EndTable(); - } - ImGui::PopStyleVar(); - - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Explicit widths"); - if (ImGui::TreeNode("Sizing policies")) - { - static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable); - ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags1, ImGuiTableFlags_NoHostExtendX); - PopStyleCompact(); - - static ImGuiTableFlags sizing_policy_flags[4] = { ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingFixedSame, ImGuiTableFlags_SizingStretchProp, ImGuiTableFlags_SizingStretchSame }; - for (int table_n = 0; table_n < 4; table_n++) - { - ImGui::PushID(table_n); - ImGui::SetNextItemWidth(TEXT_BASE_WIDTH * 30); - EditTableSizingFlags(&sizing_policy_flags[table_n]); - - // To make it easier to understand the different sizing policy, - // For each policy: we display one table where the columns have equal contents width, and one where the columns have different contents width. - if (ImGui::BeginTable("table1", 3, sizing_policy_flags[table_n] | flags1)) - { - for (int row = 0; row < 3; row++) - { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); ImGui::Text("Oh dear"); - ImGui::TableNextColumn(); ImGui::Text("Oh dear"); - ImGui::TableNextColumn(); ImGui::Text("Oh dear"); - } - ImGui::EndTable(); - } - if (ImGui::BeginTable("table2", 3, sizing_policy_flags[table_n] | flags1)) - { - for (int row = 0; row < 3; row++) - { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); ImGui::Text("AAAA"); - ImGui::TableNextColumn(); ImGui::Text("BBBBBBBB"); - ImGui::TableNextColumn(); ImGui::Text("CCCCCCCCCCCC"); - } - ImGui::EndTable(); - } - ImGui::PopID(); - } - - ImGui::Spacing(); - ImGui::TextUnformatted("Advanced"); - ImGui::SameLine(); - HelpMarker("This section allows you to interact and see the effect of various sizing policies depending on whether Scroll is enabled and the contents of your columns."); - - enum ContentsType { CT_ShowWidth, CT_ShortText, CT_LongText, CT_Button, CT_FillButton, CT_InputText }; - static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable; - static int contents_type = CT_ShowWidth; - static int column_count = 3; - - PushStyleCompact(); - ImGui::PushID("Advanced"); - ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30); - EditTableSizingFlags(&flags); - ImGui::Combo("Contents", &contents_type, "Show width\0Short Text\0Long Text\0Button\0Fill Button\0InputText\0"); - if (contents_type == CT_FillButton) - { - ImGui::SameLine(); - HelpMarker("Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width."); - } - ImGui::DragInt("Columns", &column_count, 0.1f, 1, 64, "%d", ImGuiSliderFlags_AlwaysClamp); - ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); - ImGui::CheckboxFlags("ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths); - ImGui::SameLine(); HelpMarker("Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth."); - ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); - ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); - ImGui::CheckboxFlags("ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip); - ImGui::PopItemWidth(); - ImGui::PopID(); - PopStyleCompact(); - - if (ImGui::BeginTable("table2", column_count, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 7))) - { - for (int cell = 0; cell < 10 * column_count; cell++) - { - ImGui::TableNextColumn(); - int column = ImGui::TableGetColumnIndex(); - int row = ImGui::TableGetRowIndex(); - - ImGui::PushID(cell); - char label[32]; - static char text_buf[32] = ""; - sprintf(label, "Hello %d,%d", column, row); - switch (contents_type) - { - case CT_ShortText: ImGui::TextUnformatted(label); break; - case CT_LongText: ImGui::Text("Some %s text %d,%d\nOver two lines..", column == 0 ? "long" : "longeeer", column, row); break; - case CT_ShowWidth: ImGui::Text("W: %.1f", ImGui::GetContentRegionAvail().x); break; - case CT_Button: ImGui::Button(label); break; - case CT_FillButton: ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); break; - case CT_InputText: ImGui::SetNextItemWidth(-FLT_MIN); ImGui::InputText("##", text_buf, IM_ARRAYSIZE(text_buf)); break; - } - ImGui::PopID(); - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Vertical scrolling, with clipping"); - if (ImGui::TreeNode("Vertical scrolling, with clipping")) - { - HelpMarker("Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\nWe also demonstrate using ImGuiListClipper to virtualize the submission of many items."); - static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; - - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); - PopStyleCompact(); - - // When using ScrollX or ScrollY we need to specify a size for our table container! - // Otherwise by default the table will fit all available space, like a BeginChild() call. - ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8); - if (ImGui::BeginTable("table_scrolly", 3, flags, outer_size)) - { - ImGui::TableSetupScrollFreeze(0, 1); // Make top row always visible - ImGui::TableSetupColumn("One", ImGuiTableColumnFlags_None); - ImGui::TableSetupColumn("Two", ImGuiTableColumnFlags_None); - ImGui::TableSetupColumn("Three", ImGuiTableColumnFlags_None); - ImGui::TableHeadersRow(); - - // Demonstrate using clipper for large vertical lists - ImGuiListClipper clipper; - clipper.Begin(1000); - while (clipper.Step()) - { - for (int row = clipper.DisplayStart; row < clipper.DisplayEnd; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("Hello %d,%d", column, row); - } - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Horizontal scrolling"); - if (ImGui::TreeNode("Horizontal scrolling")) - { - HelpMarker( - "When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, " - "as automatically stretching columns doesn't make much sense with horizontal scrolling.\n\n" - "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX," - "because the container window won't automatically extend vertically to fix contents (this may be improved in future versions)."); - static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; - static int freeze_cols = 1; - static int freeze_rows = 1; - - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); - ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); - ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); - ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); - ImGui::DragInt("freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); - ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); - ImGui::DragInt("freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); - PopStyleCompact(); - - // When using ScrollX or ScrollY we need to specify a size for our table container! - // Otherwise by default the table will fit all available space, like a BeginChild() call. - ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8); - if (ImGui::BeginTable("table_scrollx", 7, flags, outer_size)) - { - ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); - ImGui::TableSetupColumn("Line #", ImGuiTableColumnFlags_NoHide); // Make the first column not hideable to match our use of TableSetupScrollFreeze() - ImGui::TableSetupColumn("One"); - ImGui::TableSetupColumn("Two"); - ImGui::TableSetupColumn("Three"); - ImGui::TableSetupColumn("Four"); - ImGui::TableSetupColumn("Five"); - ImGui::TableSetupColumn("Six"); - ImGui::TableHeadersRow(); - for (int row = 0; row < 20; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 7; column++) - { - // Both TableNextColumn() and TableSetColumnIndex() return true when a column is visible or performing width measurement. - // Because here we know that: - // - A) all our columns are contributing the same to row height - // - B) column 0 is always visible, - // We only always submit this one column and can skip others. - // More advanced per-column clipping behaviors may benefit from polling the status flags via TableGetColumnFlags(). - if (!ImGui::TableSetColumnIndex(column) && column > 0) - continue; - if (column == 0) - ImGui::Text("Line %d", row); - else - ImGui::Text("Hello world %d,%d", column, row); - } - } - ImGui::EndTable(); - } - - ImGui::Spacing(); - ImGui::TextUnformatted("Stretch + ScrollX"); - ImGui::SameLine(); - HelpMarker( - "Showcase using Stretch columns + ScrollX together: " - "this is rather unusual and only makes sense when specifying an 'inner_width' for the table!\n" - "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense."); - static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; - static float inner_width = 1000.0f; - PushStyleCompact(); - ImGui::PushID("flags3"); - ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30); - ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags2, ImGuiTableFlags_ScrollX); - ImGui::DragFloat("inner_width", &inner_width, 1.0f, 0.0f, FLT_MAX, "%.1f"); - ImGui::PopItemWidth(); - ImGui::PopID(); - PopStyleCompact(); - if (ImGui::BeginTable("table2", 7, flags2, outer_size, inner_width)) - { - for (int cell = 0; cell < 20 * 7; cell++) - { - ImGui::TableNextColumn(); - ImGui::Text("Hello world %d,%d", ImGui::TableGetColumnIndex(), ImGui::TableGetRowIndex()); - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Columns flags"); - if (ImGui::TreeNode("Columns flags")) - { - // Create a first table just to show all the options/flags we want to make visible in our example! - const int column_count = 3; - const char* column_names[column_count] = { "One", "Two", "Three" }; - static ImGuiTableColumnFlags column_flags[column_count] = { ImGuiTableColumnFlags_DefaultSort, ImGuiTableColumnFlags_None, ImGuiTableColumnFlags_DefaultHide }; - static ImGuiTableColumnFlags column_flags_out[column_count] = { 0, 0, 0 }; // Output from TableGetColumnFlags() - - if (ImGui::BeginTable("table_columns_flags_checkboxes", column_count, ImGuiTableFlags_None)) - { - PushStyleCompact(); - for (int column = 0; column < column_count; column++) - { - ImGui::TableNextColumn(); - ImGui::PushID(column); - ImGui::AlignTextToFramePadding(); // FIXME-TABLE: Workaround for wrong text baseline propagation across columns - ImGui::Text("'%s'", column_names[column]); - ImGui::Spacing(); - ImGui::Text("Input flags:"); - EditTableColumnsFlags(&column_flags[column]); - ImGui::Spacing(); - ImGui::Text("Output flags:"); - ImGui::BeginDisabled(); - ShowTableColumnsStatusFlags(column_flags_out[column]); - ImGui::EndDisabled(); - ImGui::PopID(); - } - PopStyleCompact(); - ImGui::EndTable(); - } - - // Create the real table we care about for the example! - // We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above, otherwise in - // a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible + resizing the parent window down) - const ImGuiTableFlags flags - = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY - | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV - | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable; - ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 9); - if (ImGui::BeginTable("table_columns_flags", column_count, flags, outer_size)) - { - for (int column = 0; column < column_count; column++) - ImGui::TableSetupColumn(column_names[column], column_flags[column]); - ImGui::TableHeadersRow(); - for (int column = 0; column < column_count; column++) - column_flags_out[column] = ImGui::TableGetColumnFlags(column); - float indent_step = (float)((int)TEXT_BASE_WIDTH / 2); - for (int row = 0; row < 8; row++) - { - ImGui::Indent(indent_step); // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags. - ImGui::TableNextRow(); - for (int column = 0; column < column_count; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("%s %s", (column == 0) ? "Indented" : "Hello", ImGui::TableGetColumnName(column)); - } - } - ImGui::Unindent(indent_step * 8.0f); - - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Columns widths"); - if (ImGui::TreeNode("Columns widths")) - { - HelpMarker("Using TableSetupColumn() to setup default width."); - - static ImGuiTableFlags flags1 = ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBodyUntilResize; - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable); - ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags1, ImGuiTableFlags_NoBordersInBodyUntilResize); - PopStyleCompact(); - if (ImGui::BeginTable("table1", 3, flags1)) - { - // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. - ImGui::TableSetupColumn("one", ImGuiTableColumnFlags_WidthFixed, 100.0f); // Default to 100.0f - ImGui::TableSetupColumn("two", ImGuiTableColumnFlags_WidthFixed, 200.0f); // Default to 200.0f - ImGui::TableSetupColumn("three", ImGuiTableColumnFlags_WidthFixed); // Default to auto - ImGui::TableHeadersRow(); - for (int row = 0; row < 4; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableSetColumnIndex(column); - if (row == 0) - ImGui::Text("(w: %5.1f)", ImGui::GetContentRegionAvail().x); - else - ImGui::Text("Hello %d,%d", column, row); - } - } - ImGui::EndTable(); - } - - HelpMarker("Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, fixed columns with set width may still be shrunk down if there's not enough space in the host."); - - static ImGuiTableFlags flags2 = ImGuiTableFlags_None; - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_NoKeepColumnsVisible", &flags2, ImGuiTableFlags_NoKeepColumnsVisible); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags2, ImGuiTableFlags_BordersInnerV); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags2, ImGuiTableFlags_BordersOuterV); - PopStyleCompact(); - if (ImGui::BeginTable("table2", 4, flags2)) - { - // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 30.0f); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 4; column++) - { - ImGui::TableSetColumnIndex(column); - if (row == 0) - ImGui::Text("(w: %5.1f)", ImGui::GetContentRegionAvail().x); - else - ImGui::Text("Hello %d,%d", column, row); - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Nested tables"); - if (ImGui::TreeNode("Nested tables")) - { - HelpMarker("This demonstrate embedding a table into another table cell."); - - if (ImGui::BeginTable("table_nested1", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) - { - ImGui::TableSetupColumn("A0"); - ImGui::TableSetupColumn("A1"); - ImGui::TableHeadersRow(); - - ImGui::TableNextColumn(); - ImGui::Text("A0 Row 0"); - { - float rows_height = TEXT_BASE_HEIGHT * 2; - if (ImGui::BeginTable("table_nested2", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) - { - ImGui::TableSetupColumn("B0"); - ImGui::TableSetupColumn("B1"); - ImGui::TableHeadersRow(); - - ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); - ImGui::TableNextColumn(); - ImGui::Text("B0 Row 0"); - ImGui::TableNextColumn(); - ImGui::Text("B1 Row 0"); - ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); - ImGui::TableNextColumn(); - ImGui::Text("B0 Row 1"); - ImGui::TableNextColumn(); - ImGui::Text("B1 Row 1"); - - ImGui::EndTable(); - } - } - ImGui::TableNextColumn(); ImGui::Text("A1 Row 0"); - ImGui::TableNextColumn(); ImGui::Text("A0 Row 1"); - ImGui::TableNextColumn(); ImGui::Text("A1 Row 1"); - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Row height"); - if (ImGui::TreeNode("Row height")) - { - HelpMarker("You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\nWe cannot honor a _maximum_ row height as that would requires a unique clipping rectangle per row."); - if (ImGui::BeginTable("table_row_height", 1, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerV)) - { - for (int row = 0; row < 10; row++) - { - float min_row_height = (float)(int)(TEXT_BASE_HEIGHT * 0.30f * row); - ImGui::TableNextRow(ImGuiTableRowFlags_None, min_row_height); - ImGui::TableNextColumn(); - ImGui::Text("min_row_height = %.2f", min_row_height); - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Outer size"); - if (ImGui::TreeNode("Outer size")) - { - // Showcasing use of ImGuiTableFlags_NoHostExtendX and ImGuiTableFlags_NoHostExtendY - // Important to that note how the two flags have slightly different behaviors! - ImGui::Text("Using NoHostExtendX and NoHostExtendY:"); - PushStyleCompact(); - static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_ContextMenuInBody | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX; - ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); - ImGui::SameLine(); HelpMarker("Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used."); - ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY); - ImGui::SameLine(); HelpMarker("Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible."); - PopStyleCompact(); - - ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 5.5f); - if (ImGui::BeginTable("table1", 3, flags, outer_size)) - { - for (int row = 0; row < 10; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableNextColumn(); - ImGui::Text("Cell %d,%d", column, row); - } - } - ImGui::EndTable(); - } - ImGui::SameLine(); - ImGui::Text("Hello!"); - - ImGui::Spacing(); - - ImGui::Text("Using explicit size:"); - if (ImGui::BeginTable("table2", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f))) - { - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - ImGui::TableNextColumn(); - ImGui::Text("Cell %d,%d", column, row); - } - } - ImGui::EndTable(); - } - ImGui::SameLine(); - if (ImGui::BeginTable("table3", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f))) - { - for (int row = 0; row < 3; row++) - { - ImGui::TableNextRow(0, TEXT_BASE_HEIGHT * 1.5f); - for (int column = 0; column < 3; column++) - { - ImGui::TableNextColumn(); - ImGui::Text("Cell %d,%d", column, row); - } - } - ImGui::EndTable(); - } - - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Background color"); - if (ImGui::TreeNode("Background color")) - { - static ImGuiTableFlags flags = ImGuiTableFlags_RowBg; - static int row_bg_type = 1; - static int row_bg_target = 1; - static int cell_bg_type = 1; - - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders); - ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); - ImGui::SameLine(); HelpMarker("ImGuiTableFlags_RowBg automatically sets RowBg0 to alternative colors pulled from the Style."); - ImGui::Combo("row bg type", (int*)&row_bg_type, "None\0Red\0Gradient\0"); - ImGui::Combo("row bg target", (int*)&row_bg_target, "RowBg0\0RowBg1\0"); ImGui::SameLine(); HelpMarker("Target RowBg0 to override the alternating odd/even colors,\nTarget RowBg1 to blend with them."); - ImGui::Combo("cell bg type", (int*)&cell_bg_type, "None\0Blue\0"); ImGui::SameLine(); HelpMarker("We are colorizing cells to B1->C2 here."); - IM_ASSERT(row_bg_type >= 0 && row_bg_type <= 2); - IM_ASSERT(row_bg_target >= 0 && row_bg_target <= 1); - IM_ASSERT(cell_bg_type >= 0 && cell_bg_type <= 1); - PopStyleCompact(); - - if (ImGui::BeginTable("table1", 5, flags)) - { - for (int row = 0; row < 6; row++) - { - ImGui::TableNextRow(); - - // Demonstrate setting a row background color with 'ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBgX, ...)' - // We use a transparent color so we can see the one behind in case our target is RowBg1 and RowBg0 was already targeted by the ImGuiTableFlags_RowBg flag. - if (row_bg_type != 0) - { - ImU32 row_bg_color = ImGui::GetColorU32(row_bg_type == 1 ? ImVec4(0.7f, 0.3f, 0.3f, 0.65f) : ImVec4(0.2f + row * 0.1f, 0.2f, 0.2f, 0.65f)); // Flat or Gradient? - ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0 + row_bg_target, row_bg_color); - } - - // Fill cells - for (int column = 0; column < 5; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("%c%c", 'A' + row, '0' + column); - - // Change background of Cells B1->C2 - // Demonstrate setting a cell background color with 'ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ...)' - // (the CellBg color will be blended over the RowBg and ColumnBg colors) - // We can also pass a column number as a third parameter to TableSetBgColor() and do this outside the column loop. - if (row >= 1 && row <= 2 && column >= 1 && column <= 2 && cell_bg_type == 1) - { - ImU32 cell_bg_color = ImGui::GetColorU32(ImVec4(0.3f, 0.3f, 0.7f, 0.65f)); - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color); - } - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Tree view"); - if (ImGui::TreeNode("Tree view")) - { - static ImGuiTableFlags flags = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody; - - if (ImGui::BeginTable("3ways", 3, flags)) - { - // The first column will use the default _WidthStretch when ScrollX is Off and _WidthFixed when ScrollX is On - ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide); - ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); - ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); - ImGui::TableHeadersRow(); - - // Simple storage to output a dummy file-system. - struct MyTreeNode - { - const char* Name; - const char* Type; - int Size; - int ChildIdx; - int ChildCount; - static void DisplayNode(const MyTreeNode* node, const MyTreeNode* all_nodes) - { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - const bool is_folder = (node->ChildCount > 0); - if (is_folder) - { - bool open = ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_SpanFullWidth); - ImGui::TableNextColumn(); - ImGui::TextDisabled("--"); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(node->Type); - if (open) - { - for (int child_n = 0; child_n < node->ChildCount; child_n++) - DisplayNode(&all_nodes[node->ChildIdx + child_n], all_nodes); - ImGui::TreePop(); - } - } - else - { - ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_SpanFullWidth); - ImGui::TableNextColumn(); - ImGui::Text("%d", node->Size); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(node->Type); - } - } - }; - static const MyTreeNode nodes[] = - { - { "Root", "Folder", -1, 1, 3 }, // 0 - { "Music", "Folder", -1, 4, 2 }, // 1 - { "Textures", "Folder", -1, 6, 3 }, // 2 - { "desktop.ini", "System file", 1024, -1,-1 }, // 3 - { "File1_a.wav", "Audio file", 123000, -1,-1 }, // 4 - { "File1_b.wav", "Audio file", 456000, -1,-1 }, // 5 - { "Image001.png", "Image file", 203128, -1,-1 }, // 6 - { "Copy of Image001.png", "Image file", 203256, -1,-1 }, // 7 - { "Copy of Image001 (Final2).png","Image file", 203512, -1,-1 }, // 8 - }; - - MyTreeNode::DisplayNode(&nodes[0], nodes); - - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Item width"); - if (ImGui::TreeNode("Item width")) - { - HelpMarker( - "Showcase using PushItemWidth() and how it is preserved on a per-column basis.\n\n" - "Note that on auto-resizing non-resizable fixed columns, querying the content width for e.g. right-alignment doesn't make sense."); - if (ImGui::BeginTable("table_item_width", 3, ImGuiTableFlags_Borders)) - { - ImGui::TableSetupColumn("small"); - ImGui::TableSetupColumn("half"); - ImGui::TableSetupColumn("right-align"); - ImGui::TableHeadersRow(); - - for (int row = 0; row < 3; row++) - { - ImGui::TableNextRow(); - if (row == 0) - { - // Setup ItemWidth once (instead of setting up every time, which is also possible but less efficient) - ImGui::TableSetColumnIndex(0); - ImGui::PushItemWidth(TEXT_BASE_WIDTH * 3.0f); // Small - ImGui::TableSetColumnIndex(1); - ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f); - ImGui::TableSetColumnIndex(2); - ImGui::PushItemWidth(-FLT_MIN); // Right-aligned - } - - // Draw our contents - static float dummy_f = 0.0f; - ImGui::PushID(row); - ImGui::TableSetColumnIndex(0); - ImGui::SliderFloat("float0", &dummy_f, 0.0f, 1.0f); - ImGui::TableSetColumnIndex(1); - ImGui::SliderFloat("float1", &dummy_f, 0.0f, 1.0f); - ImGui::TableSetColumnIndex(2); - ImGui::SliderFloat("##float2", &dummy_f, 0.0f, 1.0f); // No visible label since right-aligned - ImGui::PopID(); - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - // Demonstrate using TableHeader() calls instead of TableHeadersRow() - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Custom headers"); - if (ImGui::TreeNode("Custom headers")) - { - const int COLUMNS_COUNT = 3; - if (ImGui::BeginTable("table_custom_headers", COLUMNS_COUNT, ImGuiTableFlags_Borders | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) - { - ImGui::TableSetupColumn("Apricot"); - ImGui::TableSetupColumn("Banana"); - ImGui::TableSetupColumn("Cherry"); - - // Dummy entire-column selection storage - // FIXME: It would be nice to actually demonstrate full-featured selection using those checkbox. - static bool column_selected[3] = {}; - - // Instead of calling TableHeadersRow() we'll submit custom headers ourselves - ImGui::TableNextRow(ImGuiTableRowFlags_Headers); - for (int column = 0; column < COLUMNS_COUNT; column++) - { - ImGui::TableSetColumnIndex(column); - const char* column_name = ImGui::TableGetColumnName(column); // Retrieve name passed to TableSetupColumn() - ImGui::PushID(column); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - ImGui::Checkbox("##checkall", &column_selected[column]); - ImGui::PopStyleVar(); - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); - ImGui::TableHeader(column_name); - ImGui::PopID(); - } - - for (int row = 0; row < 5; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < 3; column++) - { - char buf[32]; - sprintf(buf, "Cell %d,%d", column, row); - ImGui::TableSetColumnIndex(column); - ImGui::Selectable(buf, column_selected[column]); - } - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - // Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeadersRow()/TableHeader() - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Context menus"); - if (ImGui::TreeNode("Context menus")) - { - HelpMarker("By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\nUsing ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body."); - static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody; - - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_ContextMenuInBody", &flags1, ImGuiTableFlags_ContextMenuInBody); - PopStyleCompact(); - - // Context Menus: first example - // [1.1] Right-click on the TableHeadersRow() line to open the default table context menu. - // [1.2] Right-click in columns also open the default table context menu (if ImGuiTableFlags_ContextMenuInBody is set) - const int COLUMNS_COUNT = 3; - if (ImGui::BeginTable("table_context_menu", COLUMNS_COUNT, flags1)) - { - ImGui::TableSetupColumn("One"); - ImGui::TableSetupColumn("Two"); - ImGui::TableSetupColumn("Three"); - - // [1.1]] Right-click on the TableHeadersRow() line to open the default table context menu. - ImGui::TableHeadersRow(); - - // Submit dummy contents - for (int row = 0; row < 4; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < COLUMNS_COUNT; column++) - { - ImGui::TableSetColumnIndex(column); - ImGui::Text("Cell %d,%d", column, row); - } - } - ImGui::EndTable(); - } - - // Context Menus: second example - // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. - // [2.2] Right-click on the ".." to open a custom popup - // [2.3] Right-click in columns to open another custom popup - HelpMarker("Demonstrate mixing table context menu (over header), item context button (over button) and custom per-colum context menu (over column body)."); - ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders; - if (ImGui::BeginTable("table_context_menu_2", COLUMNS_COUNT, flags2)) - { - ImGui::TableSetupColumn("One"); - ImGui::TableSetupColumn("Two"); - ImGui::TableSetupColumn("Three"); - - // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. - ImGui::TableHeadersRow(); - for (int row = 0; row < 4; row++) - { - ImGui::TableNextRow(); - for (int column = 0; column < COLUMNS_COUNT; column++) - { - // Submit dummy contents - ImGui::TableSetColumnIndex(column); - ImGui::Text("Cell %d,%d", column, row); - ImGui::SameLine(); - - // [2.2] Right-click on the ".." to open a custom popup - ImGui::PushID(row * COLUMNS_COUNT + column); - ImGui::SmallButton(".."); - if (ImGui::BeginPopupContextItem()) - { - ImGui::Text("This is the popup for Button(\"..\") in Cell %d,%d", column, row); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - ImGui::PopID(); - } - } - - // [2.3] Right-click anywhere in columns to open another custom popup - // (instead of testing for !IsAnyItemHovered() we could also call OpenPopup() with ImGuiPopupFlags_NoOpenOverExistingPopup - // to manage popup priority as the popups triggers, here "are we hovering a column" are overlapping) - int hovered_column = -1; - for (int column = 0; column < COLUMNS_COUNT + 1; column++) - { - ImGui::PushID(column); - if (ImGui::TableGetColumnFlags(column) & ImGuiTableColumnFlags_IsHovered) - hovered_column = column; - if (hovered_column == column && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(1)) - ImGui::OpenPopup("MyPopup"); - if (ImGui::BeginPopup("MyPopup")) - { - if (column == COLUMNS_COUNT) - ImGui::Text("This is a custom popup for unused space after the last column."); - else - ImGui::Text("This is a custom popup for Column %d", column); - if (ImGui::Button("Close")) - ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); - } - ImGui::PopID(); - } - - ImGui::EndTable(); - ImGui::Text("Hovered column: %d", hovered_column); - } - ImGui::TreePop(); - } - - // Demonstrate creating multiple tables with the same ID - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Synced instances"); - if (ImGui::TreeNode("Synced instances")) - { - HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc."); - for (int n = 0; n < 3; n++) - { - char buf[32]; - sprintf(buf, "Synced Table %d", n); - bool open = ImGui::CollapsingHeader(buf, ImGuiTreeNodeFlags_DefaultOpen); - if (open && ImGui::BeginTable("Table", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings)) - { - ImGui::TableSetupColumn("One"); - ImGui::TableSetupColumn("Two"); - ImGui::TableSetupColumn("Three"); - ImGui::TableHeadersRow(); - for (int cell = 0; cell < 9; cell++) - { - ImGui::TableNextColumn(); - ImGui::Text("this cell %d", cell); - } - ImGui::EndTable(); - } - } - ImGui::TreePop(); - } - - // Demonstrate using Sorting facilities - // This is a simplified version of the "Advanced" example, where we mostly focus on the code necessary to handle sorting. - // Note that the "Advanced" example also showcase manually triggering a sort (e.g. if item quantities have been modified) - static const char* template_items_names[] = - { - "Banana", "Apple", "Cherry", "Watermelon", "Grapefruit", "Strawberry", "Mango", - "Kiwi", "Orange", "Pineapple", "Blueberry", "Plum", "Coconut", "Pear", "Apricot" - }; - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Sorting"); - if (ImGui::TreeNode("Sorting")) - { - // Create item list - static ImVector items; - if (items.Size == 0) - { - items.resize(50, MyItem()); - for (int n = 0; n < items.Size; n++) - { - const int template_n = n % IM_ARRAYSIZE(template_items_names); - MyItem& item = items[n]; - item.ID = n; - item.Name = template_items_names[template_n]; - item.Quantity = (n * n - n) % 20; // Assign default quantities - } - } - - // Options - static ImGuiTableFlags flags = - ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti - | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_NoBordersInBody - | ImGuiTableFlags_ScrollY; - PushStyleCompact(); - ImGui::CheckboxFlags("ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti); - ImGui::SameLine(); HelpMarker("When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1)."); - ImGui::CheckboxFlags("ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate); - ImGui::SameLine(); HelpMarker("When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0)."); - PopStyleCompact(); - - if (ImGui::BeginTable("table_sorting", 4, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 15), 0.0f)) - { - // Declare columns - // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. - // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! - // Demonstrate using a mixture of flags among available sort-related flags: - // - ImGuiTableColumnFlags_DefaultSort - // - ImGuiTableColumnFlags_NoSort / ImGuiTableColumnFlags_NoSortAscending / ImGuiTableColumnFlags_NoSortDescending - // - ImGuiTableColumnFlags_PreferSortAscending / ImGuiTableColumnFlags_PreferSortDescending - ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_ID); - ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); - ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); - ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending | ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Quantity); - ImGui::TableSetupScrollFreeze(0, 1); // Make row always visible - ImGui::TableHeadersRow(); - - // Sort our data if sort specs have been changed! - if (ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs()) - if (sorts_specs->SpecsDirty) - { - MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. - if (items.Size > 1) - qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); - MyItem::s_current_sort_specs = NULL; - sorts_specs->SpecsDirty = false; - } - - // Demonstrate using clipper for large vertical lists - ImGuiListClipper clipper; - clipper.Begin(items.Size); - while (clipper.Step()) - for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++) - { - // Display a data item - MyItem* item = &items[row_n]; - ImGui::PushID(item->ID); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::Text("%04d", item->ID); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(item->Name); - ImGui::TableNextColumn(); - ImGui::SmallButton("None"); - ImGui::TableNextColumn(); - ImGui::Text("%d", item->Quantity); - ImGui::PopID(); - } - ImGui::EndTable(); - } - ImGui::TreePop(); - } - - // In this example we'll expose most table flags and settings. - // For specific flags and settings refer to the corresponding section for more detailed explanation. - // This section is mostly useful to experiment with combining certain flags or settings with each others. - //ImGui::SetNextItemOpen(true, ImGuiCond_Once); // [DEBUG] - if (open_action != -1) - ImGui::SetNextItemOpen(open_action != 0); - IMGUI_DEMO_MARKER("Tables/Advanced"); - if (ImGui::TreeNode("Advanced")) - { - static ImGuiTableFlags flags = - ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable - | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti - | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBody - | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY - | ImGuiTableFlags_SizingFixedFit; - - enum ContentsType { CT_Text, CT_Button, CT_SmallButton, CT_FillButton, CT_Selectable, CT_SelectableSpanRow }; - static int contents_type = CT_SelectableSpanRow; - const char* contents_type_names[] = { "Text", "Button", "SmallButton", "FillButton", "Selectable", "Selectable (span row)" }; - static int freeze_cols = 1; - static int freeze_rows = 1; - static int items_count = IM_ARRAYSIZE(template_items_names) * 2; - static ImVec2 outer_size_value = ImVec2(0.0f, TEXT_BASE_HEIGHT * 12); - static float row_min_height = 0.0f; // Auto - static float inner_width_with_scroll = 0.0f; // Auto-extend - static bool outer_size_enabled = true; - static bool show_headers = true; - static bool show_wrapped_text = false; - //static ImGuiTextFilter filter; - //ImGui::SetNextItemOpen(true, ImGuiCond_Once); // FIXME-TABLE: Enabling this results in initial clipped first pass on table which tend to affects column sizing - if (ImGui::TreeNode("Options")) - { - // Make the UI compact because there are so many fields - PushStyleCompact(); - ImGui::PushItemWidth(TEXT_BASE_WIDTH * 28.0f); - - if (ImGui::TreeNodeEx("Features:", ImGuiTreeNodeFlags_DefaultOpen)) - { - ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); - ImGui::CheckboxFlags("ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable); - ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); - ImGui::CheckboxFlags("ImGuiTableFlags_Sortable", &flags, ImGuiTableFlags_Sortable); - ImGui::CheckboxFlags("ImGuiTableFlags_NoSavedSettings", &flags, ImGuiTableFlags_NoSavedSettings); - ImGui::CheckboxFlags("ImGuiTableFlags_ContextMenuInBody", &flags, ImGuiTableFlags_ContextMenuInBody); - ImGui::TreePop(); - } - - if (ImGui::TreeNodeEx("Decorations:", ImGuiTreeNodeFlags_DefaultOpen)) - { - ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH); - ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH); - ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appears in Headers"); - ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers)"); - ImGui::TreePop(); - } - - if (ImGui::TreeNodeEx("Sizing:", ImGuiTreeNodeFlags_DefaultOpen)) - { - EditTableSizingFlags(&flags); - ImGui::SameLine(); HelpMarker("In the Advanced demo we override the policy of each column so those table-wide settings have less effect that typical."); - ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); - ImGui::SameLine(); HelpMarker("Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used."); - ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY); - ImGui::SameLine(); HelpMarker("Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible."); - ImGui::CheckboxFlags("ImGuiTableFlags_NoKeepColumnsVisible", &flags, ImGuiTableFlags_NoKeepColumnsVisible); - ImGui::SameLine(); HelpMarker("Only available if ScrollX is disabled."); - ImGui::CheckboxFlags("ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths); - ImGui::SameLine(); HelpMarker("Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth."); - ImGui::CheckboxFlags("ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip); - ImGui::SameLine(); HelpMarker("Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with ScrollFreeze options."); - ImGui::TreePop(); - } - - if (ImGui::TreeNodeEx("Padding:", ImGuiTreeNodeFlags_DefaultOpen)) - { - ImGui::CheckboxFlags("ImGuiTableFlags_PadOuterX", &flags, ImGuiTableFlags_PadOuterX); - ImGui::CheckboxFlags("ImGuiTableFlags_NoPadOuterX", &flags, ImGuiTableFlags_NoPadOuterX); - ImGui::CheckboxFlags("ImGuiTableFlags_NoPadInnerX", &flags, ImGuiTableFlags_NoPadInnerX); - ImGui::TreePop(); - } - - if (ImGui::TreeNodeEx("Scrolling:", ImGuiTreeNodeFlags_DefaultOpen)) - { - ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); - ImGui::SameLine(); - ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); - ImGui::DragInt("freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); - ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); - ImGui::SameLine(); - ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); - ImGui::DragInt("freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); - ImGui::TreePop(); - } - - if (ImGui::TreeNodeEx("Sorting:", ImGuiTreeNodeFlags_DefaultOpen)) - { - ImGui::CheckboxFlags("ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti); - ImGui::SameLine(); HelpMarker("When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1)."); - ImGui::CheckboxFlags("ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate); - ImGui::SameLine(); HelpMarker("When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0)."); - ImGui::TreePop(); - } - - if (ImGui::TreeNodeEx("Other:", ImGuiTreeNodeFlags_DefaultOpen)) - { - ImGui::Checkbox("show_headers", &show_headers); - ImGui::Checkbox("show_wrapped_text", &show_wrapped_text); - - ImGui::DragFloat2("##OuterSize", &outer_size_value.x); - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); - ImGui::Checkbox("outer_size", &outer_size_enabled); - ImGui::SameLine(); - HelpMarker("If scrolling is disabled (ScrollX and ScrollY not set):\n" - "- The table is output directly in the parent window.\n" - "- OuterSize.x < 0.0f will right-align the table.\n" - "- OuterSize.x = 0.0f will narrow fit the table unless there are any Stretch column.\n" - "- OuterSize.y then becomes the minimum size for the table, which will extend vertically if there are more rows (unless NoHostExtendY is set)."); - - // From a user point of view we will tend to use 'inner_width' differently depending on whether our table is embedding scrolling. - // To facilitate toying with this demo we will actually pass 0.0f to the BeginTable() when ScrollX is disabled. - ImGui::DragFloat("inner_width (when ScrollX active)", &inner_width_with_scroll, 1.0f, 0.0f, FLT_MAX); - - ImGui::DragFloat("row_min_height", &row_min_height, 1.0f, 0.0f, FLT_MAX); - ImGui::SameLine(); HelpMarker("Specify height of the Selectable item."); - - ImGui::DragInt("items_count", &items_count, 0.1f, 0, 9999); - ImGui::Combo("items_type (first column)", &contents_type, contents_type_names, IM_ARRAYSIZE(contents_type_names)); - //filter.Draw("filter"); - ImGui::TreePop(); - } - - ImGui::PopItemWidth(); - PopStyleCompact(); - ImGui::Spacing(); - ImGui::TreePop(); - } - - // Update item list if we changed the number of items - static ImVector items; - static ImVector selection; - static bool items_need_sort = false; - if (items.Size != items_count) - { - items.resize(items_count, MyItem()); - for (int n = 0; n < items_count; n++) - { - const int template_n = n % IM_ARRAYSIZE(template_items_names); - MyItem& item = items[n]; - item.ID = n; - item.Name = template_items_names[template_n]; - item.Quantity = (template_n == 3) ? 10 : (template_n == 4) ? 20 : 0; // Assign default quantities - } - } - - const ImDrawList* parent_draw_list = ImGui::GetWindowDrawList(); - const int parent_draw_list_draw_cmd_count = parent_draw_list->CmdBuffer.Size; - ImVec2 table_scroll_cur, table_scroll_max; // For debug display - const ImDrawList* table_draw_list = NULL; // " - - // Submit table - const float inner_width_to_use = (flags & ImGuiTableFlags_ScrollX) ? inner_width_with_scroll : 0.0f; - if (ImGui::BeginTable("table_advanced", 6, flags, outer_size_enabled ? outer_size_value : ImVec2(0, 0), inner_width_to_use)) - { - // Declare columns - // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. - // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! - ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID); - ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); - ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); - ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity); - ImGui::TableSetupColumn("Description", (flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Description); - ImGui::TableSetupColumn("Hidden", ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort); - ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); - - // Sort our data if sort specs have been changed! - ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs(); - if (sorts_specs && sorts_specs->SpecsDirty) - items_need_sort = true; - if (sorts_specs && items_need_sort && items.Size > 1) - { - MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. - qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); - MyItem::s_current_sort_specs = NULL; - sorts_specs->SpecsDirty = false; - } - items_need_sort = false; - - // Take note of whether we are currently sorting based on the Quantity field, - // we will use this to trigger sorting when we know the data of this column has been modified. - const bool sorts_specs_using_quantity = (ImGui::TableGetColumnFlags(3) & ImGuiTableColumnFlags_IsSorted) != 0; - - // Show headers - if (show_headers) - ImGui::TableHeadersRow(); - - // Show data - // FIXME-TABLE FIXME-NAV: How we can get decent up/down even though we have the buttons here? - ImGui::PushButtonRepeat(true); -#if 1 - // Demonstrate using clipper for large vertical lists - ImGuiListClipper clipper; - clipper.Begin(items.Size); - while (clipper.Step()) - { - for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++) -#else - // Without clipper - { - for (int row_n = 0; row_n < items.Size; row_n++) -#endif - { - MyItem* item = &items[row_n]; - //if (!filter.PassFilter(item->Name)) - // continue; - - const bool item_is_selected = selection.contains(item->ID); - ImGui::PushID(item->ID); - ImGui::TableNextRow(ImGuiTableRowFlags_None, row_min_height); - - // For the demo purpose we can select among different type of items submitted in the first column - ImGui::TableSetColumnIndex(0); - char label[32]; - sprintf(label, "%04d", item->ID); - if (contents_type == CT_Text) - ImGui::TextUnformatted(label); - else if (contents_type == CT_Button) - ImGui::Button(label); - else if (contents_type == CT_SmallButton) - ImGui::SmallButton(label); - else if (contents_type == CT_FillButton) - ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); - else if (contents_type == CT_Selectable || contents_type == CT_SelectableSpanRow) - { - ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap : ImGuiSelectableFlags_None; - if (ImGui::Selectable(label, item_is_selected, selectable_flags, ImVec2(0, row_min_height))) - { - if (ImGui::GetIO().KeyCtrl) - { - if (item_is_selected) - selection.find_erase_unsorted(item->ID); - else - selection.push_back(item->ID); - } - else - { - selection.clear(); - selection.push_back(item->ID); - } - } - } - - if (ImGui::TableSetColumnIndex(1)) - ImGui::TextUnformatted(item->Name); - - // Here we demonstrate marking our data set as needing to be sorted again if we modified a quantity, - // and we are currently sorting on the column showing the Quantity. - // To avoid triggering a sort while holding the button, we only trigger it when the button has been released. - // You will probably need a more advanced system in your code if you want to automatically sort when a specific entry changes. - if (ImGui::TableSetColumnIndex(2)) - { - if (ImGui::SmallButton("Chop")) { item->Quantity += 1; } - if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort = true; } - ImGui::SameLine(); - if (ImGui::SmallButton("Eat")) { item->Quantity -= 1; } - if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort = true; } - } - - if (ImGui::TableSetColumnIndex(3)) - ImGui::Text("%d", item->Quantity); - - ImGui::TableSetColumnIndex(4); - if (show_wrapped_text) - ImGui::TextWrapped("Lorem ipsum dolor sit amet"); - else - ImGui::Text("Lorem ipsum dolor sit amet"); - - if (ImGui::TableSetColumnIndex(5)) - ImGui::Text("1234"); - - ImGui::PopID(); - } - } - ImGui::PopButtonRepeat(); - - // Store some info to display debug details below - table_scroll_cur = ImVec2(ImGui::GetScrollX(), ImGui::GetScrollY()); - table_scroll_max = ImVec2(ImGui::GetScrollMaxX(), ImGui::GetScrollMaxY()); - table_draw_list = ImGui::GetWindowDrawList(); - ImGui::EndTable(); - } - static bool show_debug_details = false; - ImGui::Checkbox("Debug details", &show_debug_details); - if (show_debug_details && table_draw_list) - { - ImGui::SameLine(0.0f, 0.0f); - const int table_draw_list_draw_cmd_count = table_draw_list->CmdBuffer.Size; - if (table_draw_list == parent_draw_list) - ImGui::Text(": DrawCmd: +%d (in same window)", - table_draw_list_draw_cmd_count - parent_draw_list_draw_cmd_count); - else - ImGui::Text(": DrawCmd: +%d (in child window), Scroll: (%.f/%.f) (%.f/%.f)", - table_draw_list_draw_cmd_count - 1, table_scroll_cur.x, table_scroll_max.x, table_scroll_cur.y, table_scroll_max.y); - } - ImGui::TreePop(); - } - - ImGui::PopID(); - - ShowDemoWindowColumns(); - - if (disable_indent) - ImGui::PopStyleVar(); -} - -// Demonstrate old/legacy Columns API! -// [2020: Columns are under-featured and not maintained. Prefer using the more flexible and powerful BeginTable() API!] -static void ShowDemoWindowColumns() -{ - IMGUI_DEMO_MARKER("Columns (legacy API)"); - bool open = ImGui::TreeNode("Legacy Columns API"); - ImGui::SameLine(); - HelpMarker("Columns() is an old API! Prefer using the more flexible and powerful BeginTable() API!"); - if (!open) - return; - - // Basic columns - IMGUI_DEMO_MARKER("Columns (legacy API)/Basic"); - if (ImGui::TreeNode("Basic")) - { - ImGui::Text("Without border:"); - ImGui::Columns(3, "mycolumns3", false); // 3-ways, no border - ImGui::Separator(); - for (int n = 0; n < 14; n++) - { - char label[32]; - sprintf(label, "Item %d", n); - if (ImGui::Selectable(label)) {} - //if (ImGui::Button(label, ImVec2(-FLT_MIN,0.0f))) {} - ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::Separator(); - - ImGui::Text("With border:"); - ImGui::Columns(4, "mycolumns"); // 4-ways, with border - ImGui::Separator(); - ImGui::Text("ID"); ImGui::NextColumn(); - ImGui::Text("Name"); ImGui::NextColumn(); - ImGui::Text("Path"); ImGui::NextColumn(); - ImGui::Text("Hovered"); ImGui::NextColumn(); - ImGui::Separator(); - const char* names[3] = { "One", "Two", "Three" }; - const char* paths[3] = { "/path/one", "/path/two", "/path/three" }; - static int selected = -1; - for (int i = 0; i < 3; i++) - { - char label[32]; - sprintf(label, "%04d", i); - if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns)) - selected = i; - bool hovered = ImGui::IsItemHovered(); - ImGui::NextColumn(); - ImGui::Text(names[i]); ImGui::NextColumn(); - ImGui::Text(paths[i]); ImGui::NextColumn(); - ImGui::Text("%d", hovered); ImGui::NextColumn(); - } - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Columns (legacy API)/Borders"); - if (ImGui::TreeNode("Borders")) - { - // NB: Future columns API should allow automatic horizontal borders. - static bool h_borders = true; - static bool v_borders = true; - static int columns_count = 4; - const int lines_count = 3; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); - ImGui::DragInt("##columns_count", &columns_count, 0.1f, 2, 10, "%d columns"); - if (columns_count < 2) - columns_count = 2; - ImGui::SameLine(); - ImGui::Checkbox("horizontal", &h_borders); - ImGui::SameLine(); - ImGui::Checkbox("vertical", &v_borders); - ImGui::Columns(columns_count, NULL, v_borders); - for (int i = 0; i < columns_count * lines_count; i++) - { - if (h_borders && ImGui::GetColumnIndex() == 0) - ImGui::Separator(); - ImGui::Text("%c%c%c", 'a' + i, 'a' + i, 'a' + i); - ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); - ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); - ImGui::Text("Offset %.2f", ImGui::GetColumnOffset()); - ImGui::Text("Long text that is likely to clip"); - ImGui::Button("Button", ImVec2(-FLT_MIN, 0.0f)); - ImGui::NextColumn(); - } - ImGui::Columns(1); - if (h_borders) - ImGui::Separator(); - ImGui::TreePop(); - } - - // Create multiple items in a same cell before switching to next column - IMGUI_DEMO_MARKER("Columns (legacy API)/Mixed items"); - if (ImGui::TreeNode("Mixed items")) - { - ImGui::Columns(3, "mixed"); - ImGui::Separator(); - - ImGui::Text("Hello"); - ImGui::Button("Banana"); - ImGui::NextColumn(); - - ImGui::Text("ImGui"); - ImGui::Button("Apple"); - static float foo = 1.0f; - ImGui::InputFloat("red", &foo, 0.05f, 0, "%.3f"); - ImGui::Text("An extra line here."); - ImGui::NextColumn(); - - ImGui::Text("Sailor"); - ImGui::Button("Corniflower"); - static float bar = 1.0f; - ImGui::InputFloat("blue", &bar, 0.05f, 0, "%.3f"); - ImGui::NextColumn(); - - if (ImGui::CollapsingHeader("Category A")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - if (ImGui::CollapsingHeader("Category B")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - if (ImGui::CollapsingHeader("Category C")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - // Word wrapping - IMGUI_DEMO_MARKER("Columns (legacy API)/Word-wrapping"); - if (ImGui::TreeNode("Word-wrapping")) - { - ImGui::Columns(2, "word-wrapping"); - ImGui::Separator(); - ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); - ImGui::TextWrapped("Hello Left"); - ImGui::NextColumn(); - ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); - ImGui::TextWrapped("Hello Right"); - ImGui::Columns(1); - ImGui::Separator(); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Columns (legacy API)/Horizontal Scrolling"); - if (ImGui::TreeNode("Horizontal Scrolling")) - { - ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f)); - ImVec2 child_size = ImVec2(0, ImGui::GetFontSize() * 20.0f); - ImGui::BeginChild("##ScrollingRegion", child_size, false, ImGuiWindowFlags_HorizontalScrollbar); - ImGui::Columns(10); - - // Also demonstrate using clipper for large vertical lists - int ITEMS_COUNT = 2000; - ImGuiListClipper clipper; - clipper.Begin(ITEMS_COUNT); - while (clipper.Step()) - { - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - for (int j = 0; j < 10; j++) - { - ImGui::Text("Line %d Column %d...", i, j); - ImGui::NextColumn(); - } - } - ImGui::Columns(1); - ImGui::EndChild(); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Columns (legacy API)/Tree"); - if (ImGui::TreeNode("Tree")) - { - ImGui::Columns(2, "tree", true); - for (int x = 0; x < 3; x++) - { - bool open1 = ImGui::TreeNode((void*)(intptr_t)x, "Node%d", x); - ImGui::NextColumn(); - ImGui::Text("Node contents"); - ImGui::NextColumn(); - if (open1) - { - for (int y = 0; y < 3; y++) - { - bool open2 = ImGui::TreeNode((void*)(intptr_t)y, "Node%d.%d", x, y); - ImGui::NextColumn(); - ImGui::Text("Node contents"); - if (open2) - { - ImGui::Text("Even more contents"); - if (ImGui::TreeNode("Tree in column")) - { - ImGui::Text("The quick brown fox jumps over the lazy dog"); - ImGui::TreePop(); - } - } - ImGui::NextColumn(); - if (open2) - ImGui::TreePop(); - } - ImGui::TreePop(); - } - } - ImGui::Columns(1); - ImGui::TreePop(); - } - - ImGui::TreePop(); -} - -namespace ImGui { extern ImGuiKeyData* GetKeyData(ImGuiKey key); } - -static void ShowDemoWindowMisc() -{ - IMGUI_DEMO_MARKER("Filtering"); - if (ImGui::CollapsingHeader("Filtering")) - { - // Helper class to easy setup a text filter. - // You may want to implement a more feature-full filtering scheme in your own application. - static ImGuiTextFilter filter; - ImGui::Text("Filter usage:\n" - " \"\" display all lines\n" - " \"xxx\" display lines containing \"xxx\"\n" - " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n" - " \"-xxx\" hide lines containing \"xxx\""); - filter.Draw(); - const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }; - for (int i = 0; i < IM_ARRAYSIZE(lines); i++) - if (filter.PassFilter(lines[i])) - ImGui::BulletText("%s", lines[i]); - } - - IMGUI_DEMO_MARKER("Inputs, Navigation & Focus"); - if (ImGui::CollapsingHeader("Inputs, Navigation & Focus")) - { - ImGuiIO& io = ImGui::GetIO(); - - // Display ImGuiIO output flags - IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Output"); - ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode("Output")) - { - ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse); - ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose); - ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard); - ImGui::Text("io.WantTextInput: %d", io.WantTextInput); - ImGui::Text("io.WantSetMousePos: %d", io.WantSetMousePos); - ImGui::Text("io.NavActive: %d, io.NavVisible: %d", io.NavActive, io.NavVisible); - ImGui::TreePop(); - } - - // Display Mouse state - IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Mouse State"); - if (ImGui::TreeNode("Mouse State")) - { - if (ImGui::IsMousePosValid()) - ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y); - else - ImGui::Text("Mouse pos: "); - ImGui::Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y); - - int count = IM_ARRAYSIZE(io.MouseDown); - ImGui::Text("Mouse down:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseDown(i)) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); } - ImGui::Text("Mouse clicked:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseClicked(i)) { ImGui::SameLine(); ImGui::Text("b%d (%d)", i, ImGui::GetMouseClickedCount(i)); } - ImGui::Text("Mouse released:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseReleased(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } - ImGui::Text("Mouse wheel: %.1f", io.MouseWheel); - ImGui::Text("Pen Pressure: %.1f", io.PenPressure); // Note: currently unused - ImGui::TreePop(); - } - - // Display Keyboard/Mouse state - IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Keyboard, Gamepad & Navigation State"); - if (ImGui::TreeNode("Keyboard, Gamepad & Navigation State")) - { - // We iterate both legacy native range and named ImGuiKey ranges, which is a little odd but this allow displaying the data for old/new backends. - // User code should never have to go through such hoops: old code may use native keycodes, new code may use ImGuiKey codes. -#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO - struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } }; - const ImGuiKey key_first = ImGuiKey_NamedKey_BEGIN; -#else - struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && ImGui::GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array - const ImGuiKey key_first = 0; - //ImGui::Text("Legacy raw:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (io.KeysDown[key]) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } } -#endif - ImGui::Text("Keys down:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyDown(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d (%.02f secs)", ImGui::GetKeyName(key), key, ImGui::GetKeyData(key)->DownDuration); } } - ImGui::Text("Keys pressed:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyPressed(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } } - ImGui::Text("Keys released:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyReleased(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } } - ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : ""); - ImGui::Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public. - - // Draw an arbitrary US keyboard layout to visualize translated keys - { - const ImVec2 key_size = ImVec2(35.0f, 35.0f); - const float key_rounding = 3.0f; - const ImVec2 key_face_size = ImVec2(25.0f, 25.0f); - const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f); - const float key_face_rounding = 2.0f; - const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f); - const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f); - const float key_row_offset = 9.0f; - - ImVec2 board_min = ImGui::GetCursorScreenPos(); - ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f); - ImVec2 start_pos = ImVec2(board_min.x + 5.0f - key_step.x, board_min.y); - - struct KeyLayoutData { int Row, Col; const char* Label; ImGuiKey Key; }; - const KeyLayoutData keys_to_display[] = - { - { 0, 0, "", ImGuiKey_Tab }, { 0, 1, "Q", ImGuiKey_Q }, { 0, 2, "W", ImGuiKey_W }, { 0, 3, "E", ImGuiKey_E }, { 0, 4, "R", ImGuiKey_R }, - { 1, 0, "", ImGuiKey_CapsLock }, { 1, 1, "A", ImGuiKey_A }, { 1, 2, "S", ImGuiKey_S }, { 1, 3, "D", ImGuiKey_D }, { 1, 4, "F", ImGuiKey_F }, - { 2, 0, "", ImGuiKey_LeftShift },{ 2, 1, "Z", ImGuiKey_Z }, { 2, 2, "X", ImGuiKey_X }, { 2, 3, "C", ImGuiKey_C }, { 2, 4, "V", ImGuiKey_V } - }; - - // Elements rendered manually via ImDrawList API are not clipped automatically. - // While not strictly necessary, here IsItemVisible() is used to avoid rendering these shapes when they are out of view. - ImGui::Dummy(ImVec2(board_max.x - board_min.x, board_max.y - board_min.y)); - if (ImGui::IsItemVisible()) - { - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - draw_list->PushClipRect(board_min, board_max, true); - for (int n = 0; n < IM_ARRAYSIZE(keys_to_display); n++) - { - const KeyLayoutData* key_data = &keys_to_display[n]; - ImVec2 key_min = ImVec2(start_pos.x + key_data->Col * key_step.x + key_data->Row * key_row_offset, start_pos.y + key_data->Row * key_step.y); - ImVec2 key_max = ImVec2(key_min.x + key_size.x, key_min.y + key_size.y); - draw_list->AddRectFilled(key_min, key_max, IM_COL32(204, 204, 204, 255), key_rounding); - draw_list->AddRect(key_min, key_max, IM_COL32(24, 24, 24, 255), key_rounding); - ImVec2 face_min = ImVec2(key_min.x + key_face_pos.x, key_min.y + key_face_pos.y); - ImVec2 face_max = ImVec2(face_min.x + key_face_size.x, face_min.y + key_face_size.y); - draw_list->AddRect(face_min, face_max, IM_COL32(193, 193, 193, 255), key_face_rounding, ImDrawFlags_None, 2.0f); - draw_list->AddRectFilled(face_min, face_max, IM_COL32(252, 252, 252, 255), key_face_rounding); - ImVec2 label_min = ImVec2(key_min.x + key_label_pos.x, key_min.y + key_label_pos.y); - draw_list->AddText(label_min, IM_COL32(64, 64, 64, 255), key_data->Label); - if (ImGui::IsKeyDown(key_data->Key)) - draw_list->AddRectFilled(key_min, key_max, IM_COL32(255, 0, 0, 128), key_rounding); - } - draw_list->PopClipRect(); - } - } - ImGui::TreePop(); - } - - if (ImGui::TreeNode("Capture override")) - { - HelpMarker( - "The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui " - "to instruct your application of how to route inputs. Typically, when a value is true, it means " - "Dear ImGui wants the corresponding inputs and we expect the underlying application to ignore them.\n\n" - "The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, " - "and underlying application should ignore mouse inputs (in practice there are many and more subtle " - "rules leading to how those flags are set)."); - - ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse); - ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose); - ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard); - - HelpMarker( - "Hovering the colored canvas will override io.WantCaptureXXX fields.\n" - "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering and true when clicking."); - static int capture_override_mouse = -1; - static int capture_override_keyboard = -1; - const char* capture_override_desc[] = { "None", "Set to false", "Set to true" }; - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderInt("SetNextFrameWantCaptureMouse()", &capture_override_mouse, -1, +1, capture_override_desc[capture_override_mouse + 1], ImGuiSliderFlags_AlwaysClamp); - ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); - ImGui::SliderInt("SetNextFrameWantCaptureKeyboard()", &capture_override_keyboard, -1, +1, capture_override_desc[capture_override_keyboard + 1], ImGuiSliderFlags_AlwaysClamp); - - ImGui::ColorButton("##panel", ImVec4(0.7f, 0.1f, 0.7f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, ImVec2(256.0f, 192.0f)); // Dummy item - if (ImGui::IsItemHovered() && capture_override_mouse != -1) - ImGui::SetNextFrameWantCaptureMouse(capture_override_mouse == 1); - if (ImGui::IsItemHovered() && capture_override_keyboard != -1) - ImGui::SetNextFrameWantCaptureKeyboard(capture_override_keyboard == 1); - - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Tabbing"); - if (ImGui::TreeNode("Tabbing")) - { - ImGui::Text("Use TAB/SHIFT+TAB to cycle through keyboard editable fields."); - static char buf[32] = "hello"; - ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); - ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); - ImGui::InputText("3", buf, IM_ARRAYSIZE(buf)); - ImGui::PushAllowKeyboardFocus(false); - ImGui::InputText("4 (tab skip)", buf, IM_ARRAYSIZE(buf)); - ImGui::SameLine(); HelpMarker("Item won't be cycled through when using TAB or Shift+Tab."); - ImGui::PopAllowKeyboardFocus(); - ImGui::InputText("5", buf, IM_ARRAYSIZE(buf)); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Focus from code"); - if (ImGui::TreeNode("Focus from code")) - { - bool focus_1 = ImGui::Button("Focus on 1"); ImGui::SameLine(); - bool focus_2 = ImGui::Button("Focus on 2"); ImGui::SameLine(); - bool focus_3 = ImGui::Button("Focus on 3"); - int has_focus = 0; - static char buf[128] = "click on a button to set focus"; - - if (focus_1) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 1; - - if (focus_2) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 2; - - ImGui::PushAllowKeyboardFocus(false); - if (focus_3) ImGui::SetKeyboardFocusHere(); - ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf)); - if (ImGui::IsItemActive()) has_focus = 3; - ImGui::SameLine(); HelpMarker("Item won't be cycled through when using TAB or Shift+Tab."); - ImGui::PopAllowKeyboardFocus(); - - if (has_focus) - ImGui::Text("Item with focus: %d", has_focus); - else - ImGui::Text("Item with focus: "); - - // Use >= 0 parameter to SetKeyboardFocusHere() to focus an upcoming item - static float f3[3] = { 0.0f, 0.0f, 0.0f }; - int focus_ahead = -1; - if (ImGui::Button("Focus on X")) { focus_ahead = 0; } ImGui::SameLine(); - if (ImGui::Button("Focus on Y")) { focus_ahead = 1; } ImGui::SameLine(); - if (ImGui::Button("Focus on Z")) { focus_ahead = 2; } - if (focus_ahead != -1) ImGui::SetKeyboardFocusHere(focus_ahead); - ImGui::SliderFloat3("Float3", &f3[0], 0.0f, 1.0f); - - ImGui::TextWrapped("NB: Cursor & selection are preserved when refocusing last used item in code."); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Dragging"); - if (ImGui::TreeNode("Dragging")) - { - ImGui::TextWrapped("You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget."); - for (int button = 0; button < 3; button++) - { - ImGui::Text("IsMouseDragging(%d):", button); - ImGui::Text(" w/ default threshold: %d,", ImGui::IsMouseDragging(button)); - ImGui::Text(" w/ zero threshold: %d,", ImGui::IsMouseDragging(button, 0.0f)); - ImGui::Text(" w/ large threshold: %d,", ImGui::IsMouseDragging(button, 20.0f)); - } - - ImGui::Button("Drag Me"); - if (ImGui::IsItemActive()) - ImGui::GetForegroundDrawList()->AddLine(io.MouseClickedPos[0], io.MousePos, ImGui::GetColorU32(ImGuiCol_Button), 4.0f); // Draw a line between the button and the mouse cursor - - // Drag operations gets "unlocked" when the mouse has moved past a certain threshold - // (the default threshold is stored in io.MouseDragThreshold). You can request a lower or higher - // threshold using the second parameter of IsMouseDragging() and GetMouseDragDelta(). - ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f); - ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0); - ImVec2 mouse_delta = io.MouseDelta; - ImGui::Text("GetMouseDragDelta(0):"); - ImGui::Text(" w/ default threshold: (%.1f, %.1f)", value_with_lock_threshold.x, value_with_lock_threshold.y); - ImGui::Text(" w/ zero threshold: (%.1f, %.1f)", value_raw.x, value_raw.y); - ImGui::Text("io.MouseDelta: (%.1f, %.1f)", mouse_delta.x, mouse_delta.y); - ImGui::TreePop(); - } - - IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Mouse cursors"); - if (ImGui::TreeNode("Mouse cursors")) - { - const char* mouse_cursors_names[] = { "Arrow", "TextInput", "ResizeAll", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand", "NotAllowed" }; - IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_COUNT); - - ImGuiMouseCursor current = ImGui::GetMouseCursor(); - ImGui::Text("Current mouse cursor = %d: %s", current, mouse_cursors_names[current]); - ImGui::Text("Hover to see mouse cursors:"); - ImGui::SameLine(); HelpMarker( - "Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. " - "If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, " - "otherwise your backend needs to handle it."); - for (int i = 0; i < ImGuiMouseCursor_COUNT; i++) - { - char label[32]; - sprintf(label, "Mouse cursor %d: %s", i, mouse_cursors_names[i]); - ImGui::Bullet(); ImGui::Selectable(label, false); - if (ImGui::IsItemHovered()) - ImGui::SetMouseCursor(i); - } - ImGui::TreePop(); - } - } -} - -//----------------------------------------------------------------------------- -// [SECTION] About Window / ShowAboutWindow() -// Access from Dear ImGui Demo -> Tools -> About -//----------------------------------------------------------------------------- - -void ImGui::ShowAboutWindow(bool* p_open) -{ - if (!ImGui::Begin("About Dear ImGui", p_open, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::End(); - return; - } - IMGUI_DEMO_MARKER("Tools/About Dear ImGui"); - ImGui::Text("Dear ImGui %s", ImGui::GetVersion()); - ImGui::Separator(); - ImGui::Text("By Omar Cornut and all Dear ImGui contributors."); - ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information."); - - static bool show_config_info = false; - ImGui::Checkbox("Config/Build Information", &show_config_info); - if (show_config_info) - { - ImGuiIO& io = ImGui::GetIO(); - ImGuiStyle& style = ImGui::GetStyle(); - - bool copy_to_clipboard = ImGui::Button("Copy to clipboard"); - ImVec2 child_size = ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18); - ImGui::BeginChildFrame(ImGui::GetID("cfg_infos"), child_size, ImGuiWindowFlags_NoMove); - if (copy_to_clipboard) - { - ImGui::LogToClipboard(); - ImGui::LogText("```\n"); // Back quotes will make text appears without formatting when pasting on GitHub - } - - ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM); - ImGui::Separator(); - ImGui::Text("sizeof(size_t): %d, sizeof(ImDrawIdx): %d, sizeof(ImDrawVert): %d", (int)sizeof(size_t), (int)sizeof(ImDrawIdx), (int)sizeof(ImDrawVert)); - ImGui::Text("define: __cplusplus=%d", (int)__cplusplus); -#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO - ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_KEYIO"); -#endif -#ifdef IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_WIN32_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_WIN32_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_FILE_FUNCTIONS - ImGui::Text("define: IMGUI_DISABLE_FILE_FUNCTIONS"); -#endif -#ifdef IMGUI_DISABLE_DEFAULT_ALLOCATORS - ImGui::Text("define: IMGUI_DISABLE_DEFAULT_ALLOCATORS"); -#endif -#ifdef IMGUI_USE_BGRA_PACKED_COLOR - ImGui::Text("define: IMGUI_USE_BGRA_PACKED_COLOR"); -#endif -#ifdef _WIN32 - ImGui::Text("define: _WIN32"); -#endif -#ifdef _WIN64 - ImGui::Text("define: _WIN64"); -#endif -#ifdef __linux__ - ImGui::Text("define: __linux__"); -#endif -#ifdef __APPLE__ - ImGui::Text("define: __APPLE__"); -#endif -#ifdef _MSC_VER - ImGui::Text("define: _MSC_VER=%d", _MSC_VER); -#endif -#ifdef _MSVC_LANG - ImGui::Text("define: _MSVC_LANG=%d", (int)_MSVC_LANG); -#endif -#ifdef __MINGW32__ - ImGui::Text("define: __MINGW32__"); -#endif -#ifdef __MINGW64__ - ImGui::Text("define: __MINGW64__"); -#endif -#ifdef __GNUC__ - ImGui::Text("define: __GNUC__=%d", (int)__GNUC__); -#endif -#ifdef __clang_version__ - ImGui::Text("define: __clang_version__=%s", __clang_version__); -#endif - ImGui::Separator(); - ImGui::Text("io.BackendPlatformName: %s", io.BackendPlatformName ? io.BackendPlatformName : "NULL"); - ImGui::Text("io.BackendRendererName: %s", io.BackendRendererName ? io.BackendRendererName : "NULL"); - ImGui::Text("io.ConfigFlags: 0x%08X", io.ConfigFlags); - if (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) ImGui::Text(" NavEnableKeyboard"); - if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) ImGui::Text(" NavEnableGamepad"); - if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) ImGui::Text(" NavEnableSetMousePos"); - if (io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard) ImGui::Text(" NavNoCaptureKeyboard"); - if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) ImGui::Text(" NoMouse"); - if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) ImGui::Text(" NoMouseCursorChange"); - if (io.MouseDrawCursor) ImGui::Text("io.MouseDrawCursor"); - if (io.ConfigMacOSXBehaviors) ImGui::Text("io.ConfigMacOSXBehaviors"); - if (io.ConfigInputTextCursorBlink) ImGui::Text("io.ConfigInputTextCursorBlink"); - if (io.ConfigWindowsResizeFromEdges) ImGui::Text("io.ConfigWindowsResizeFromEdges"); - if (io.ConfigWindowsMoveFromTitleBarOnly) ImGui::Text("io.ConfigWindowsMoveFromTitleBarOnly"); - if (io.ConfigMemoryCompactTimer >= 0.0f) ImGui::Text("io.ConfigMemoryCompactTimer = %.1f", io.ConfigMemoryCompactTimer); - ImGui::Text("io.BackendFlags: 0x%08X", io.BackendFlags); - if (io.BackendFlags & ImGuiBackendFlags_HasGamepad) ImGui::Text(" HasGamepad"); - if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors"); - if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos"); - if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(" RendererHasVtxOffset"); - ImGui::Separator(); - ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight); - ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y); - ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); - ImGui::Separator(); - ImGui::Text("style.WindowPadding: %.2f,%.2f", style.WindowPadding.x, style.WindowPadding.y); - ImGui::Text("style.WindowBorderSize: %.2f", style.WindowBorderSize); - ImGui::Text("style.FramePadding: %.2f,%.2f", style.FramePadding.x, style.FramePadding.y); - ImGui::Text("style.FrameRounding: %.2f", style.FrameRounding); - ImGui::Text("style.FrameBorderSize: %.2f", style.FrameBorderSize); - ImGui::Text("style.ItemSpacing: %.2f,%.2f", style.ItemSpacing.x, style.ItemSpacing.y); - ImGui::Text("style.ItemInnerSpacing: %.2f,%.2f", style.ItemInnerSpacing.x, style.ItemInnerSpacing.y); - - if (copy_to_clipboard) - { - ImGui::LogText("\n```\n"); - ImGui::LogFinish(); - } - ImGui::EndChildFrame(); - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Style Editor / ShowStyleEditor() -//----------------------------------------------------------------------------- -// - ShowFontSelector() -// - ShowStyleSelector() -// - ShowStyleEditor() -//----------------------------------------------------------------------------- - -// Forward declare ShowFontAtlas() which isn't worth putting in public API yet -namespace ImGui { IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); } - -// Demo helper function to select among loaded fonts. -// Here we use the regular BeginCombo()/EndCombo() api which is the more flexible one. -void ImGui::ShowFontSelector(const char* label) -{ - ImGuiIO& io = ImGui::GetIO(); - ImFont* font_current = ImGui::GetFont(); - if (ImGui::BeginCombo(label, font_current->GetDebugName())) - { - for (int n = 0; n < io.Fonts->Fonts.Size; n++) - { - ImFont* font = io.Fonts->Fonts[n]; - ImGui::PushID((void*)font); - if (ImGui::Selectable(font->GetDebugName(), font == font_current)) - io.FontDefault = font; - ImGui::PopID(); - } - ImGui::EndCombo(); - } - ImGui::SameLine(); - HelpMarker( - "- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n" - "- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n" - "- Read FAQ and docs/FONTS.md for more details.\n" - "- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame()."); -} - -// Demo helper function to select among default colors. See ShowStyleEditor() for more advanced options. -// Here we use the simplified Combo() api that packs items into a single literal string. -// Useful for quick combo boxes where the choices are known locally. -bool ImGui::ShowStyleSelector(const char* label) -{ - static int style_idx = -1; - if (ImGui::Combo(label, &style_idx, "Dark\0Light\0Classic\0")) - { - switch (style_idx) - { - case 0: ImGui::StyleColorsDark(); break; - case 1: ImGui::StyleColorsLight(); break; - case 2: ImGui::StyleColorsClassic(); break; - } - return true; - } - return false; -} - -void ImGui::ShowStyleEditor(ImGuiStyle* ref) -{ - IMGUI_DEMO_MARKER("Tools/Style Editor"); - // You can pass in a reference ImGuiStyle structure to compare to, revert to and save to - // (without a reference style pointer, we will use one compared locally as a reference) - ImGuiStyle& style = ImGui::GetStyle(); - static ImGuiStyle ref_saved_style; - - // Default to using internal storage as reference - static bool init = true; - if (init && ref == NULL) - ref_saved_style = style; - init = false; - if (ref == NULL) - ref = &ref_saved_style; - - ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.50f); - - if (ImGui::ShowStyleSelector("Colors##Selector")) - ref_saved_style = style; - ImGui::ShowFontSelector("Fonts##Selector"); - - // Simplified Settings (expose floating-pointer border sizes as boolean representing 0.0f or 1.0f) - if (ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f")) - style.GrabRounding = style.FrameRounding; // Make GrabRounding always the same value as FrameRounding - { bool border = (style.WindowBorderSize > 0.0f); if (ImGui::Checkbox("WindowBorder", &border)) { style.WindowBorderSize = border ? 1.0f : 0.0f; } } - ImGui::SameLine(); - { bool border = (style.FrameBorderSize > 0.0f); if (ImGui::Checkbox("FrameBorder", &border)) { style.FrameBorderSize = border ? 1.0f : 0.0f; } } - ImGui::SameLine(); - { bool border = (style.PopupBorderSize > 0.0f); if (ImGui::Checkbox("PopupBorder", &border)) { style.PopupBorderSize = border ? 1.0f : 0.0f; } } - - // Save/Revert button - if (ImGui::Button("Save Ref")) - *ref = ref_saved_style = style; - ImGui::SameLine(); - if (ImGui::Button("Revert Ref")) - style = *ref; - ImGui::SameLine(); - HelpMarker( - "Save/Revert in local non-persistent storage. Default Colors definition are not affected. " - "Use \"Export\" below to save them somewhere."); - - ImGui::Separator(); - - if (ImGui::BeginTabBar("##tabs", ImGuiTabBarFlags_None)) - { - if (ImGui::BeginTabItem("Sizes")) - { - ImGui::Text("Main"); - ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("CellPadding", (float*)&style.CellPadding, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f"); - ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f"); - ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f"); - ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f"); - ImGui::Text("Borders"); - ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f"); - ImGui::Text("Rounding"); - ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("LogSliderDeadzone", &style.LogSliderDeadzone, 0.0f, 12.0f, "%.0f"); - ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f"); - ImGui::Text("Alignment"); - ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f"); - int window_menu_button_position = style.WindowMenuButtonPosition + 1; - if (ImGui::Combo("WindowMenuButtonPosition", (int*)&window_menu_button_position, "None\0Left\0Right\0")) - style.WindowMenuButtonPosition = window_menu_button_position - 1; - ImGui::Combo("ColorButtonPosition", (int*)&style.ColorButtonPosition, "Left\0Right\0"); - ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); - ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content."); - ImGui::SliderFloat2("SelectableTextAlign", (float*)&style.SelectableTextAlign, 0.0f, 1.0f, "%.2f"); - ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content."); - ImGui::Text("Safe Area Padding"); - ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured)."); - ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f"); - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Colors")) - { - static int output_dest = 0; - static bool output_only_modified = true; - if (ImGui::Button("Export")) - { - if (output_dest == 0) - ImGui::LogToClipboard(); - else - ImGui::LogToTTY(); - ImGui::LogText("ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const ImVec4& col = style.Colors[i]; - const char* name = ImGui::GetStyleColorName(i); - if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0) - ImGui::LogText("colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE, - name, 23 - (int)strlen(name), "", col.x, col.y, col.z, col.w); - } - ImGui::LogFinish(); - } - ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0"); - ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified); - - static ImGuiTextFilter filter; - filter.Draw("Filter colors", ImGui::GetFontSize() * 16); - - static ImGuiColorEditFlags alpha_flags = 0; - if (ImGui::RadioButton("Opaque", alpha_flags == ImGuiColorEditFlags_None)) { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine(); - if (ImGui::RadioButton("Alpha", alpha_flags == ImGuiColorEditFlags_AlphaPreview)) { alpha_flags = ImGuiColorEditFlags_AlphaPreview; } ImGui::SameLine(); - if (ImGui::RadioButton("Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine(); - HelpMarker( - "In the color list:\n" - "Left-click on color square to open color picker,\n" - "Right-click to open edit options menu."); - - ImGui::BeginChild("##colors", ImVec2(0, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened); - ImGui::PushItemWidth(-160); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const char* name = ImGui::GetStyleColorName(i); - if (!filter.PassFilter(name)) - continue; - ImGui::PushID(i); - ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags); - if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0) - { - // Tips: in a real user application, you may want to merge and use an icon font into the main font, - // so instead of "Save"/"Revert" you'd use icons! - // Read the FAQ and docs/FONTS.md about using icon fonts. It's really easy and super convenient! - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Save")) { ref->Colors[i] = style.Colors[i]; } - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Revert")) { style.Colors[i] = ref->Colors[i]; } - } - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); - ImGui::TextUnformatted(name); - ImGui::PopID(); - } - ImGui::PopItemWidth(); - ImGui::EndChild(); - - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Fonts")) - { - ImGuiIO& io = ImGui::GetIO(); - ImFontAtlas* atlas = io.Fonts; - HelpMarker("Read FAQ and docs/FONTS.md for details on font loading."); - ImGui::ShowFontAtlas(atlas); - - // Post-baking font scaling. Note that this is NOT the nice way of scaling fonts, read below. - // (we enforce hard clamping manually as by default DragFloat/SliderFloat allows CTRL+Click text to get out of bounds). - const float MIN_SCALE = 0.3f; - const float MAX_SCALE = 2.0f; - HelpMarker( - "Those are old settings provided for convenience.\n" - "However, the _correct_ way of scaling your UI is currently to reload your font at the designed size, " - "rebuild the font atlas, and call style.ScaleAllSizes() on a reference ImGuiStyle structure.\n" - "Using those settings here will give you poor quality results."); - static float window_scale = 1.0f; - ImGui::PushItemWidth(ImGui::GetFontSize() * 8); - if (ImGui::DragFloat("window scale", &window_scale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp)) // Scale only this window - ImGui::SetWindowFontScale(window_scale); - ImGui::DragFloat("global scale", &io.FontGlobalScale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp); // Scale everything - ImGui::PopItemWidth(); - - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Rendering")) - { - ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); - ImGui::SameLine(); - HelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); - - ImGui::Checkbox("Anti-aliased lines use texture", &style.AntiAliasedLinesUseTex); - ImGui::SameLine(); - HelpMarker("Faster lines using texture data. Require backend to render with bilinear filtering (not point/nearest filtering)."); - - ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); - ImGui::PushItemWidth(ImGui::GetFontSize() * 8); - ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, 10.0f, "%.2f"); - if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f; - - // When editing the "Circle Segment Max Error" value, draw a preview of its effect on auto-tessellated circles. - ImGui::DragFloat("Circle Tessellation Max Error", &style.CircleTessellationMaxError , 0.005f, 0.10f, 5.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp); - if (ImGui::IsItemActive()) - { - ImGui::SetNextWindowPos(ImGui::GetCursorScreenPos()); - ImGui::BeginTooltip(); - ImGui::TextUnformatted("(R = radius, N = number of segments)"); - ImGui::Spacing(); - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - const float min_widget_width = ImGui::CalcTextSize("N: MMM\nR: MMM").x; - for (int n = 0; n < 8; n++) - { - const float RAD_MIN = 5.0f; - const float RAD_MAX = 70.0f; - const float rad = RAD_MIN + (RAD_MAX - RAD_MIN) * (float)n / (8.0f - 1.0f); - - ImGui::BeginGroup(); - - ImGui::Text("R: %.f\nN: %d", rad, draw_list->_CalcCircleAutoSegmentCount(rad)); - - const float canvas_width = IM_MAX(min_widget_width, rad * 2.0f); - const float offset_x = floorf(canvas_width * 0.5f); - const float offset_y = floorf(RAD_MAX); - - const ImVec2 p1 = ImGui::GetCursorScreenPos(); - draw_list->AddCircle(ImVec2(p1.x + offset_x, p1.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text)); - ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2)); - - /* - const ImVec2 p2 = ImGui::GetCursorScreenPos(); - draw_list->AddCircleFilled(ImVec2(p2.x + offset_x, p2.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text)); - ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2)); - */ - - ImGui::EndGroup(); - ImGui::SameLine(); - } - ImGui::EndTooltip(); - } - ImGui::SameLine(); - HelpMarker("When drawing circle primitives with \"num_segments == 0\" tesselation will be calculated automatically."); - - ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero. - ImGui::DragFloat("Disabled Alpha", &style.DisabledAlpha, 0.005f, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Additional alpha multiplier for disabled items (multiply over current value of Alpha)."); - ImGui::PopItemWidth(); - - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } - - ImGui::PopItemWidth(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() -//----------------------------------------------------------------------------- -// - ShowExampleAppMainMenuBar() -// - ShowExampleMenuFile() -//----------------------------------------------------------------------------- - -// Demonstrate creating a "main" fullscreen menu bar and populating it. -// Note the difference between BeginMainMenuBar() and BeginMenuBar(): -// - BeginMenuBar() = menu-bar inside current window (which needs the ImGuiWindowFlags_MenuBar flag!) -// - BeginMainMenuBar() = helper to create menu-bar-sized window at the top of the main viewport + call BeginMenuBar() into it. -static void ShowExampleAppMainMenuBar() -{ - if (ImGui::BeginMainMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Edit")) - { - if (ImGui::MenuItem("Undo", "CTRL+Z")) {} - if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item - ImGui::Separator(); - if (ImGui::MenuItem("Cut", "CTRL+X")) {} - if (ImGui::MenuItem("Copy", "CTRL+C")) {} - if (ImGui::MenuItem("Paste", "CTRL+V")) {} - ImGui::EndMenu(); - } - ImGui::EndMainMenuBar(); - } -} - -// Note that shortcuts are currently provided for display only -// (future version will add explicit flags to BeginMenu() to request processing shortcuts) -static void ShowExampleMenuFile() -{ - IMGUI_DEMO_MARKER("Examples/Menu"); - ImGui::MenuItem("(demo menu)", NULL, false, false); - if (ImGui::MenuItem("New")) {} - if (ImGui::MenuItem("Open", "Ctrl+O")) {} - if (ImGui::BeginMenu("Open Recent")) - { - ImGui::MenuItem("fish_hat.c"); - ImGui::MenuItem("fish_hat.inl"); - ImGui::MenuItem("fish_hat.h"); - if (ImGui::BeginMenu("More..")) - { - ImGui::MenuItem("Hello"); - ImGui::MenuItem("Sailor"); - if (ImGui::BeginMenu("Recurse..")) - { - ShowExampleMenuFile(); - ImGui::EndMenu(); - } - ImGui::EndMenu(); - } - ImGui::EndMenu(); - } - if (ImGui::MenuItem("Save", "Ctrl+S")) {} - if (ImGui::MenuItem("Save As..")) {} - - ImGui::Separator(); - IMGUI_DEMO_MARKER("Examples/Menu/Options"); - if (ImGui::BeginMenu("Options")) - { - static bool enabled = true; - ImGui::MenuItem("Enabled", "", &enabled); - ImGui::BeginChild("child", ImVec2(0, 60), true); - for (int i = 0; i < 10; i++) - ImGui::Text("Scrolling Text %d", i); - ImGui::EndChild(); - static float f = 0.5f; - static int n = 0; - ImGui::SliderFloat("Value", &f, 0.0f, 1.0f); - ImGui::InputFloat("Input", &f, 0.1f); - ImGui::Combo("Combo", &n, "Yes\0No\0Maybe\0\0"); - ImGui::EndMenu(); - } - - IMGUI_DEMO_MARKER("Examples/Menu/Colors"); - if (ImGui::BeginMenu("Colors")) - { - float sz = ImGui::GetTextLineHeight(); - for (int i = 0; i < ImGuiCol_COUNT; i++) - { - const char* name = ImGui::GetStyleColorName((ImGuiCol)i); - ImVec2 p = ImGui::GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + sz, p.y + sz), ImGui::GetColorU32((ImGuiCol)i)); - ImGui::Dummy(ImVec2(sz, sz)); - ImGui::SameLine(); - ImGui::MenuItem(name); - } - ImGui::EndMenu(); - } - - // Here we demonstrate appending again to the "Options" menu (which we already created above) - // Of course in this demo it is a little bit silly that this function calls BeginMenu("Options") twice. - // In a real code-base using it would make senses to use this feature from very different code locations. - if (ImGui::BeginMenu("Options")) // <-- Append! - { - IMGUI_DEMO_MARKER("Examples/Menu/Append to an existing menu"); - static bool b = true; - ImGui::Checkbox("SomeOption", &b); - ImGui::EndMenu(); - } - - if (ImGui::BeginMenu("Disabled", false)) // Disabled - { - IM_ASSERT(0); - } - if (ImGui::MenuItem("Checked", NULL, true)) {} - if (ImGui::MenuItem("Quit", "Alt+F4")) {} -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Debug Console / ShowExampleAppConsole() -//----------------------------------------------------------------------------- - -// Demonstrate creating a simple console window, with scrolling, filtering, completion and history. -// For the console example, we are using a more C++ like approach of declaring a class to hold both data and functions. -struct ExampleAppConsole -{ - char InputBuf[256]; - ImVector Items; - ImVector Commands; - ImVector History; - int HistoryPos; // -1: new line, 0..History.Size-1 browsing history. - ImGuiTextFilter Filter; - bool AutoScroll; - bool ScrollToBottom; - - ExampleAppConsole() - { - IMGUI_DEMO_MARKER("Examples/Console"); - ClearLog(); - memset(InputBuf, 0, sizeof(InputBuf)); - HistoryPos = -1; - - // "CLASSIFY" is here to provide the test case where "C"+[tab] completes to "CL" and display multiple matches. - Commands.push_back("HELP"); - Commands.push_back("HISTORY"); - Commands.push_back("CLEAR"); - Commands.push_back("CLASSIFY"); - AutoScroll = true; - ScrollToBottom = false; - AddLog("Welcome to Dear ImGui!"); - } - ~ExampleAppConsole() - { - ClearLog(); - for (int i = 0; i < History.Size; i++) - free(History[i]); - } - - // Portable helpers - static int Stricmp(const char* s1, const char* s2) { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; } - static int Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; } - static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); } - static void Strtrim(char* s) { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; } - - void ClearLog() - { - for (int i = 0; i < Items.Size; i++) - free(Items[i]); - Items.clear(); - } - - void AddLog(const char* fmt, ...) IM_FMTARGS(2) - { - // FIXME-OPT - char buf[1024]; - va_list args; - va_start(args, fmt); - vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); - buf[IM_ARRAYSIZE(buf)-1] = 0; - va_end(args); - Items.push_back(Strdup(buf)); - } - - void Draw(const char* title, bool* p_open) - { - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin(title, p_open)) - { - ImGui::End(); - return; - } - - // As a specific feature guaranteed by the library, after calling Begin() the last Item represent the title bar. - // So e.g. IsItemHovered() will return true when hovering the title bar. - // Here we create a context menu only available from the title bar. - if (ImGui::BeginPopupContextItem()) - { - if (ImGui::MenuItem("Close Console")) - *p_open = false; - ImGui::EndPopup(); - } - - ImGui::TextWrapped( - "This example implements a console with basic coloring, completion (TAB key) and history (Up/Down keys). A more elaborate " - "implementation may want to store entries along with extra data such as timestamp, emitter, etc."); - ImGui::TextWrapped("Enter 'HELP' for help."); - - // TODO: display items starting from the bottom - - if (ImGui::SmallButton("Add Debug Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } - ImGui::SameLine(); - if (ImGui::SmallButton("Add Debug Error")) { AddLog("[error] something went wrong"); } - ImGui::SameLine(); - if (ImGui::SmallButton("Clear")) { ClearLog(); } - ImGui::SameLine(); - bool copy_to_clipboard = ImGui::SmallButton("Copy"); - //static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); } - - ImGui::Separator(); - - // Options menu - if (ImGui::BeginPopup("Options")) - { - ImGui::Checkbox("Auto-scroll", &AutoScroll); - ImGui::EndPopup(); - } - - // Options, Filter - if (ImGui::Button("Options")) - ImGui::OpenPopup("Options"); - ImGui::SameLine(); - Filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180); - ImGui::Separator(); - - // Reserve enough left-over height for 1 separator + 1 input text - const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); - ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar); - if (ImGui::BeginPopupContextWindow()) - { - if (ImGui::Selectable("Clear")) ClearLog(); - ImGui::EndPopup(); - } - - // Display every line as a separate entry so we can change their color or add custom widgets. - // If you only want raw text you can use ImGui::TextUnformatted(log.begin(), log.end()); - // NB- if you have thousands of entries this approach may be too inefficient and may require user-side clipping - // to only process visible items. The clipper will automatically measure the height of your first item and then - // "seek" to display only items in the visible area. - // To use the clipper we can replace your standard loop: - // for (int i = 0; i < Items.Size; i++) - // With: - // ImGuiListClipper clipper; - // clipper.Begin(Items.Size); - // while (clipper.Step()) - // for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - // - That your items are evenly spaced (same height) - // - That you have cheap random access to your elements (you can access them given their index, - // without processing all the ones before) - // You cannot this code as-is if a filter is active because it breaks the 'cheap random-access' property. - // We would need random-access on the post-filtered list. - // A typical application wanting coarse clipping and filtering may want to pre-compute an array of indices - // or offsets of items that passed the filtering test, recomputing this array when user changes the filter, - // and appending newly elements as they are inserted. This is left as a task to the user until we can manage - // to improve this example code! - // If your items are of variable height: - // - Split them into same height items would be simpler and facilitate random-seeking into your list. - // - Consider using manual call to IsRectVisible() and skipping extraneous decoration from your items. - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 1)); // Tighten spacing - if (copy_to_clipboard) - ImGui::LogToClipboard(); - for (int i = 0; i < Items.Size; i++) - { - const char* item = Items[i]; - if (!Filter.PassFilter(item)) - continue; - - // Normally you would store more information in your item than just a string. - // (e.g. make Items[] an array of structure, store color/type etc.) - ImVec4 color; - bool has_color = false; - if (strstr(item, "[error]")) { color = ImVec4(1.0f, 0.4f, 0.4f, 1.0f); has_color = true; } - else if (strncmp(item, "# ", 2) == 0) { color = ImVec4(1.0f, 0.8f, 0.6f, 1.0f); has_color = true; } - if (has_color) - ImGui::PushStyleColor(ImGuiCol_Text, color); - ImGui::TextUnformatted(item); - if (has_color) - ImGui::PopStyleColor(); - } - if (copy_to_clipboard) - ImGui::LogFinish(); - - if (ScrollToBottom || (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())) - ImGui::SetScrollHereY(1.0f); - ScrollToBottom = false; - - ImGui::PopStyleVar(); - ImGui::EndChild(); - ImGui::Separator(); - - // Command-line - bool reclaim_focus = false; - ImGuiInputTextFlags input_text_flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory; - if (ImGui::InputText("Input", InputBuf, IM_ARRAYSIZE(InputBuf), input_text_flags, &TextEditCallbackStub, (void*)this)) - { - char* s = InputBuf; - Strtrim(s); - if (s[0]) - ExecCommand(s); - strcpy(s, ""); - reclaim_focus = true; - } - - // Auto-focus on window apparition - ImGui::SetItemDefaultFocus(); - if (reclaim_focus) - ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget - - ImGui::End(); - } - - void ExecCommand(const char* command_line) - { - AddLog("# %s\n", command_line); - - // Insert into history. First find match and delete it so it can be pushed to the back. - // This isn't trying to be smart or optimal. - HistoryPos = -1; - for (int i = History.Size - 1; i >= 0; i--) - if (Stricmp(History[i], command_line) == 0) - { - free(History[i]); - History.erase(History.begin() + i); - break; - } - History.push_back(Strdup(command_line)); - - // Process command - if (Stricmp(command_line, "CLEAR") == 0) - { - ClearLog(); - } - else if (Stricmp(command_line, "HELP") == 0) - { - AddLog("Commands:"); - for (int i = 0; i < Commands.Size; i++) - AddLog("- %s", Commands[i]); - } - else if (Stricmp(command_line, "HISTORY") == 0) - { - int first = History.Size - 10; - for (int i = first > 0 ? first : 0; i < History.Size; i++) - AddLog("%3d: %s\n", i, History[i]); - } - else - { - AddLog("Unknown command: '%s'\n", command_line); - } - - // On command input, we scroll to bottom even if AutoScroll==false - ScrollToBottom = true; - } - - // In C++11 you'd be better off using lambdas for this sort of forwarding callbacks - static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) - { - ExampleAppConsole* console = (ExampleAppConsole*)data->UserData; - return console->TextEditCallback(data); - } - - int TextEditCallback(ImGuiInputTextCallbackData* data) - { - //AddLog("cursor: %d, selection: %d-%d", data->CursorPos, data->SelectionStart, data->SelectionEnd); - switch (data->EventFlag) - { - case ImGuiInputTextFlags_CallbackCompletion: - { - // Example of TEXT COMPLETION - - // Locate beginning of current word - const char* word_end = data->Buf + data->CursorPos; - const char* word_start = word_end; - while (word_start > data->Buf) - { - const char c = word_start[-1]; - if (c == ' ' || c == '\t' || c == ',' || c == ';') - break; - word_start--; - } - - // Build a list of candidates - ImVector candidates; - for (int i = 0; i < Commands.Size; i++) - if (Strnicmp(Commands[i], word_start, (int)(word_end - word_start)) == 0) - candidates.push_back(Commands[i]); - - if (candidates.Size == 0) - { - // No match - AddLog("No match for \"%.*s\"!\n", (int)(word_end - word_start), word_start); - } - else if (candidates.Size == 1) - { - // Single match. Delete the beginning of the word and replace it entirely so we've got nice casing. - data->DeleteChars((int)(word_start - data->Buf), (int)(word_end - word_start)); - data->InsertChars(data->CursorPos, candidates[0]); - data->InsertChars(data->CursorPos, " "); - } - else - { - // Multiple matches. Complete as much as we can.. - // So inputing "C"+Tab will complete to "CL" then display "CLEAR" and "CLASSIFY" as matches. - int match_len = (int)(word_end - word_start); - for (;;) - { - int c = 0; - bool all_candidates_matches = true; - for (int i = 0; i < candidates.Size && all_candidates_matches; i++) - if (i == 0) - c = toupper(candidates[i][match_len]); - else if (c == 0 || c != toupper(candidates[i][match_len])) - all_candidates_matches = false; - if (!all_candidates_matches) - break; - match_len++; - } - - if (match_len > 0) - { - data->DeleteChars((int)(word_start - data->Buf), (int)(word_end - word_start)); - data->InsertChars(data->CursorPos, candidates[0], candidates[0] + match_len); - } - - // List matches - AddLog("Possible matches:\n"); - for (int i = 0; i < candidates.Size; i++) - AddLog("- %s\n", candidates[i]); - } - - break; - } - case ImGuiInputTextFlags_CallbackHistory: - { - // Example of HISTORY - const int prev_history_pos = HistoryPos; - if (data->EventKey == ImGuiKey_UpArrow) - { - if (HistoryPos == -1) - HistoryPos = History.Size - 1; - else if (HistoryPos > 0) - HistoryPos--; - } - else if (data->EventKey == ImGuiKey_DownArrow) - { - if (HistoryPos != -1) - if (++HistoryPos >= History.Size) - HistoryPos = -1; - } - - // A better implementation would preserve the data on the current input line along with cursor position. - if (prev_history_pos != HistoryPos) - { - const char* history_str = (HistoryPos >= 0) ? History[HistoryPos] : ""; - data->DeleteChars(0, data->BufTextLen); - data->InsertChars(0, history_str); - } - } - } - return 0; - } -}; - -static void ShowExampleAppConsole(bool* p_open) -{ - static ExampleAppConsole console; - console.Draw("Example: Console", p_open); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Debug Log / ShowExampleAppLog() -//----------------------------------------------------------------------------- - -// Usage: -// static ExampleAppLog my_log; -// my_log.AddLog("Hello %d world\n", 123); -// my_log.Draw("title"); -struct ExampleAppLog -{ - ImGuiTextBuffer Buf; - ImGuiTextFilter Filter; - ImVector LineOffsets; // Index to lines offset. We maintain this with AddLog() calls. - bool AutoScroll; // Keep scrolling if already at the bottom. - - ExampleAppLog() - { - AutoScroll = true; - Clear(); - } - - void Clear() - { - Buf.clear(); - LineOffsets.clear(); - LineOffsets.push_back(0); - } - - void AddLog(const char* fmt, ...) IM_FMTARGS(2) - { - int old_size = Buf.size(); - va_list args; - va_start(args, fmt); - Buf.appendfv(fmt, args); - va_end(args); - for (int new_size = Buf.size(); old_size < new_size; old_size++) - if (Buf[old_size] == '\n') - LineOffsets.push_back(old_size + 1); - } - - void Draw(const char* title, bool* p_open = NULL) - { - if (!ImGui::Begin(title, p_open)) - { - ImGui::End(); - return; - } - - // Options menu - if (ImGui::BeginPopup("Options")) - { - ImGui::Checkbox("Auto-scroll", &AutoScroll); - ImGui::EndPopup(); - } - - // Main window - if (ImGui::Button("Options")) - ImGui::OpenPopup("Options"); - ImGui::SameLine(); - bool clear = ImGui::Button("Clear"); - ImGui::SameLine(); - bool copy = ImGui::Button("Copy"); - ImGui::SameLine(); - Filter.Draw("Filter", -100.0f); - - ImGui::Separator(); - ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar); - - if (clear) - Clear(); - if (copy) - ImGui::LogToClipboard(); - - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - const char* buf = Buf.begin(); - const char* buf_end = Buf.end(); - if (Filter.IsActive()) - { - // In this example we don't use the clipper when Filter is enabled. - // This is because we don't have a random access on the result on our filter. - // A real application processing logs with ten of thousands of entries may want to store the result of - // search/filter.. especially if the filtering function is not trivial (e.g. reg-exp). - for (int line_no = 0; line_no < LineOffsets.Size; line_no++) - { - const char* line_start = buf + LineOffsets[line_no]; - const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; - if (Filter.PassFilter(line_start, line_end)) - ImGui::TextUnformatted(line_start, line_end); - } - } - else - { - // The simplest and easy way to display the entire buffer: - // ImGui::TextUnformatted(buf_begin, buf_end); - // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward - // to skip non-visible lines. Here we instead demonstrate using the clipper to only process lines that are - // within the visible area. - // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them - // on your side is recommended. Using ImGuiListClipper requires - // - A) random access into your data - // - B) items all being the same height, - // both of which we can handle since we an array pointing to the beginning of each line of text. - // When using the filter (in the block of code above) we don't have random access into the data to display - // anymore, which is why we don't use the clipper. Storing or skimming through the search result would make - // it possible (and would be recommended if you want to search through tens of thousands of entries). - ImGuiListClipper clipper; - clipper.Begin(LineOffsets.Size); - while (clipper.Step()) - { - for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) - { - const char* line_start = buf + LineOffsets[line_no]; - const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; - ImGui::TextUnformatted(line_start, line_end); - } - } - clipper.End(); - } - ImGui::PopStyleVar(); - - if (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) - ImGui::SetScrollHereY(1.0f); - - ImGui::EndChild(); - ImGui::End(); - } -}; - -// Demonstrate creating a simple log window with basic filtering. -static void ShowExampleAppLog(bool* p_open) -{ - static ExampleAppLog log; - - // For the demo: add a debug button _BEFORE_ the normal log window contents - // We take advantage of a rarely used feature: multiple calls to Begin()/End() are appending to the _same_ window. - // Most of the contents of the window will be added by the log.Draw() call. - ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver); - ImGui::Begin("Example: Log", p_open); - IMGUI_DEMO_MARKER("Examples/Log"); - if (ImGui::SmallButton("[Debug] Add 5 entries")) - { - static int counter = 0; - const char* categories[3] = { "info", "warn", "error" }; - const char* words[] = { "Bumfuzzled", "Cattywampus", "Snickersnee", "Abibliophobia", "Absquatulate", "Nincompoop", "Pauciloquent" }; - for (int n = 0; n < 5; n++) - { - const char* category = categories[counter % IM_ARRAYSIZE(categories)]; - const char* word = words[counter % IM_ARRAYSIZE(words)]; - log.AddLog("[%05d] [%s] Hello, current time is %.1f, here's a word: '%s'\n", - ImGui::GetFrameCount(), category, ImGui::GetTime(), word); - counter++; - } - } - ImGui::End(); - - // Actually call in the regular Log helper (which will Begin() into the same window as we just did) - log.Draw("Example: Log", p_open); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() -//----------------------------------------------------------------------------- - -// Demonstrate create a window with multiple child windows. -static void ShowExampleAppLayout(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver); - if (ImGui::Begin("Example: Simple layout", p_open, ImGuiWindowFlags_MenuBar)) - { - IMGUI_DEMO_MARKER("Examples/Simple layout"); - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - if (ImGui::MenuItem("Close")) *p_open = false; - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - - // Left - static int selected = 0; - { - ImGui::BeginChild("left pane", ImVec2(150, 0), true); - for (int i = 0; i < 100; i++) - { - // FIXME: Good candidate to use ImGuiSelectableFlags_SelectOnNav - char label[128]; - sprintf(label, "MyObject %d", i); - if (ImGui::Selectable(label, selected == i)) - selected = i; - } - ImGui::EndChild(); - } - ImGui::SameLine(); - - // Right - { - ImGui::BeginGroup(); - ImGui::BeginChild("item view", ImVec2(0, -ImGui::GetFrameHeightWithSpacing())); // Leave room for 1 line below us - ImGui::Text("MyObject: %d", selected); - ImGui::Separator(); - if (ImGui::BeginTabBar("##Tabs", ImGuiTabBarFlags_None)) - { - if (ImGui::BeginTabItem("Description")) - { - ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Details")) - { - ImGui::Text("ID: 0123456789"); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); - } - ImGui::EndChild(); - if (ImGui::Button("Revert")) {} - ImGui::SameLine(); - if (ImGui::Button("Save")) {} - ImGui::EndGroup(); - } - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() -//----------------------------------------------------------------------------- - -static void ShowPlaceholderObject(const char* prefix, int uid) -{ - // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID. - ImGui::PushID(uid); - - // Text and Tree nodes are less high than framed widgets, using AlignTextToFramePadding() we add vertical spacing to make the tree lines equal high. - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::AlignTextToFramePadding(); - bool node_open = ImGui::TreeNode("Object", "%s_%u", prefix, uid); - ImGui::TableSetColumnIndex(1); - ImGui::Text("my sailor is rich"); - - if (node_open) - { - static float placeholder_members[8] = { 0.0f, 0.0f, 1.0f, 3.1416f, 100.0f, 999.0f }; - for (int i = 0; i < 8; i++) - { - ImGui::PushID(i); // Use field index as identifier. - if (i < 2) - { - ShowPlaceholderObject("Child", 424242); - } - else - { - // Here we use a TreeNode to highlight on hover (we could use e.g. Selectable as well) - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::AlignTextToFramePadding(); - ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_Bullet; - ImGui::TreeNodeEx("Field", flags, "Field_%d", i); - - ImGui::TableSetColumnIndex(1); - ImGui::SetNextItemWidth(-FLT_MIN); - if (i >= 5) - ImGui::InputFloat("##value", &placeholder_members[i], 1.0f); - else - ImGui::DragFloat("##value", &placeholder_members[i], 0.01f); - ImGui::NextColumn(); - } - ImGui::PopID(); - } - ImGui::TreePop(); - } - ImGui::PopID(); -} - -// Demonstrate create a simple property editor. -static void ShowExampleAppPropertyEditor(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(430, 450), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Example: Property editor", p_open)) - { - ImGui::End(); - return; - } - IMGUI_DEMO_MARKER("Examples/Property Editor"); - - HelpMarker( - "This example shows how you may implement a property editor using two columns.\n" - "All objects/fields data are dummies here.\n" - "Remember that in many simple cases, you can use ImGui::SameLine(xxx) to position\n" - "your cursor horizontally instead of using the Columns() API."); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 2)); - if (ImGui::BeginTable("split", 2, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_Resizable)) - { - // Iterate placeholder objects (all the same data) - for (int obj_i = 0; obj_i < 4; obj_i++) - { - ShowPlaceholderObject("Object", obj_i); - //ImGui::Separator(); - } - ImGui::EndTable(); - } - ImGui::PopStyleVar(); - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Long Text / ShowExampleAppLongText() -//----------------------------------------------------------------------------- - -// Demonstrate/test rendering huge amount of text, and the incidence of clipping. -static void ShowExampleAppLongText(bool* p_open) -{ - ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Example: Long text display", p_open)) - { - ImGui::End(); - return; - } - IMGUI_DEMO_MARKER("Examples/Long text display"); - - static int test_type = 0; - static ImGuiTextBuffer log; - static int lines = 0; - ImGui::Text("Printing unusually long amount of text."); - ImGui::Combo("Test type", &test_type, - "Single call to TextUnformatted()\0" - "Multiple calls to Text(), clipped\0" - "Multiple calls to Text(), not clipped (slow)\0"); - ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size()); - if (ImGui::Button("Clear")) { log.clear(); lines = 0; } - ImGui::SameLine(); - if (ImGui::Button("Add 1000 lines")) - { - for (int i = 0; i < 1000; i++) - log.appendf("%i The quick brown fox jumps over the lazy dog\n", lines + i); - lines += 1000; - } - ImGui::BeginChild("Log"); - switch (test_type) - { - case 0: - // Single call to TextUnformatted() with a big buffer - ImGui::TextUnformatted(log.begin(), log.end()); - break; - case 1: - { - // Multiple calls to Text(), manually coarsely clipped - demonstrate how to use the ImGuiListClipper helper. - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - ImGuiListClipper clipper; - clipper.Begin(lines); - while (clipper.Step()) - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); - ImGui::PopStyleVar(); - break; - } - case 2: - // Multiple calls to Text(), not clipped (slow) - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - for (int i = 0; i < lines; i++) - ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); - ImGui::PopStyleVar(); - break; - } - ImGui::EndChild(); - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() -//----------------------------------------------------------------------------- - -// Demonstrate creating a window which gets auto-resized according to its content. -static void ShowExampleAppAutoResize(bool* p_open) -{ - if (!ImGui::Begin("Example: Auto-resizing window", p_open, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::End(); - return; - } - IMGUI_DEMO_MARKER("Examples/Auto-resizing window"); - - static int lines = 10; - ImGui::TextUnformatted( - "Window will resize every-frame to the size of its content.\n" - "Note that you probably don't want to query the window size to\n" - "output your content because that would create a feedback loop."); - ImGui::SliderInt("Number of lines", &lines, 1, 20); - for (int i = 0; i < lines; i++) - ImGui::Text("%*sThis is line %d", i * 4, "", i); // Pad with space to extend size horizontally - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() -//----------------------------------------------------------------------------- - -// Demonstrate creating a window with custom resize constraints. -static void ShowExampleAppConstrainedResize(bool* p_open) -{ - struct CustomConstraints - { - // Helper functions to demonstrate programmatic constraints - static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->DesiredSize.x, data->DesiredSize.y); } - static void Step(ImGuiSizeCallbackData* data) { float step = (float)(int)(intptr_t)data->UserData; data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); } - }; - - const char* test_desc[] = - { - "Resize vertical only", - "Resize horizontal only", - "Width > 100, Height > 100", - "Width 400-500", - "Height 400-500", - "Custom: Always Square", - "Custom: Fixed Steps (100)", - }; - - static bool auto_resize = false; - static int type = 0; - static int display_lines = 10; - if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only - if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only - if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100 - if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width 400-500 - if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, 500)); // Height 400-500 - if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square - if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)(intptr_t)100); // Fixed Step - - ImGuiWindowFlags flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0; - if (ImGui::Begin("Example: Constrained Resize", p_open, flags)) - { - IMGUI_DEMO_MARKER("Examples/Constrained Resizing window"); - if (ImGui::Button("200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine(); - if (ImGui::Button("500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine(); - if (ImGui::Button("800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); } - ImGui::SetNextItemWidth(200); - ImGui::Combo("Constraint", &type, test_desc, IM_ARRAYSIZE(test_desc)); - ImGui::SetNextItemWidth(200); - ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100); - ImGui::Checkbox("Auto-resize", &auto_resize); - for (int i = 0; i < display_lines; i++) - ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, ""); - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Simple overlay / ShowExampleAppSimpleOverlay() -//----------------------------------------------------------------------------- - -// Demonstrate creating a simple static window with no decoration -// + a context-menu to choose which corner of the screen to use. -static void ShowExampleAppSimpleOverlay(bool* p_open) -{ - static int corner = 0; - ImGuiIO& io = ImGui::GetIO(); - ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav; - if (corner != -1) - { - const float PAD = 10.0f; - const ImGuiViewport* viewport = ImGui::GetMainViewport(); - ImVec2 work_pos = viewport->WorkPos; // Use work area to avoid menu-bar/task-bar, if any! - ImVec2 work_size = viewport->WorkSize; - ImVec2 window_pos, window_pos_pivot; - window_pos.x = (corner & 1) ? (work_pos.x + work_size.x - PAD) : (work_pos.x + PAD); - window_pos.y = (corner & 2) ? (work_pos.y + work_size.y - PAD) : (work_pos.y + PAD); - window_pos_pivot.x = (corner & 1) ? 1.0f : 0.0f; - window_pos_pivot.y = (corner & 2) ? 1.0f : 0.0f; - ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); - window_flags |= ImGuiWindowFlags_NoMove; - } - ImGui::SetNextWindowBgAlpha(0.35f); // Transparent background - if (ImGui::Begin("Example: Simple overlay", p_open, window_flags)) - { - IMGUI_DEMO_MARKER("Examples/Simple Overlay"); - ImGui::Text("Simple overlay\n" "in the corner of the screen.\n" "(right-click to change position)"); - ImGui::Separator(); - if (ImGui::IsMousePosValid()) - ImGui::Text("Mouse Position: (%.1f,%.1f)", io.MousePos.x, io.MousePos.y); - else - ImGui::Text("Mouse Position: "); - if (ImGui::BeginPopupContextWindow()) - { - if (ImGui::MenuItem("Custom", NULL, corner == -1)) corner = -1; - if (ImGui::MenuItem("Top-left", NULL, corner == 0)) corner = 0; - if (ImGui::MenuItem("Top-right", NULL, corner == 1)) corner = 1; - if (ImGui::MenuItem("Bottom-left", NULL, corner == 2)) corner = 2; - if (ImGui::MenuItem("Bottom-right", NULL, corner == 3)) corner = 3; - if (p_open && ImGui::MenuItem("Close")) *p_open = false; - ImGui::EndPopup(); - } - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Fullscreen window / ShowExampleAppFullscreen() -//----------------------------------------------------------------------------- - -// Demonstrate creating a window covering the entire screen/viewport -static void ShowExampleAppFullscreen(bool* p_open) -{ - static bool use_work_area = true; - static ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings; - - // We demonstrate using the full viewport area or the work area (without menu-bars, task-bars etc.) - // Based on your use case you may want one of the other. - const ImGuiViewport* viewport = ImGui::GetMainViewport(); - ImGui::SetNextWindowPos(use_work_area ? viewport->WorkPos : viewport->Pos); - ImGui::SetNextWindowSize(use_work_area ? viewport->WorkSize : viewport->Size); - - if (ImGui::Begin("Example: Fullscreen window", p_open, flags)) - { - ImGui::Checkbox("Use work area instead of main area", &use_work_area); - ImGui::SameLine(); - HelpMarker("Main Area = entire viewport,\nWork Area = entire viewport minus sections used by the main menu bars, task bars etc.\n\nEnable the main-menu bar in Examples menu to see the difference."); - - ImGui::CheckboxFlags("ImGuiWindowFlags_NoBackground", &flags, ImGuiWindowFlags_NoBackground); - ImGui::CheckboxFlags("ImGuiWindowFlags_NoDecoration", &flags, ImGuiWindowFlags_NoDecoration); - ImGui::Indent(); - ImGui::CheckboxFlags("ImGuiWindowFlags_NoTitleBar", &flags, ImGuiWindowFlags_NoTitleBar); - ImGui::CheckboxFlags("ImGuiWindowFlags_NoCollapse", &flags, ImGuiWindowFlags_NoCollapse); - ImGui::CheckboxFlags("ImGuiWindowFlags_NoScrollbar", &flags, ImGuiWindowFlags_NoScrollbar); - ImGui::Unindent(); - - if (p_open && ImGui::Button("Close this window")) - *p_open = false; - } - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Manipulating Window Titles / ShowExampleAppWindowTitles() -//----------------------------------------------------------------------------- - -// Demonstrate using "##" and "###" in identifiers to manipulate ID generation. -// This apply to all regular items as well. -// Read FAQ section "How can I have multiple widgets with the same label?" for details. -static void ShowExampleAppWindowTitles(bool*) -{ - const ImGuiViewport* viewport = ImGui::GetMainViewport(); - const ImVec2 base_pos = viewport->Pos; - - // By default, Windows are uniquely identified by their title. - // You can use the "##" and "###" markers to manipulate the display/ID. - - // Using "##" to display same title but have unique identifier. - ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 100), ImGuiCond_FirstUseEver); - ImGui::Begin("Same title as another window##1"); - IMGUI_DEMO_MARKER("Examples/Manipulating window titles"); - ImGui::Text("This is window 1.\nMy title is the same as window 2, but my identifier is unique."); - ImGui::End(); - - ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 200), ImGuiCond_FirstUseEver); - ImGui::Begin("Same title as another window##2"); - ImGui::Text("This is window 2.\nMy title is the same as window 1, but my identifier is unique."); - ImGui::End(); - - // Using "###" to display a changing title but keep a static identifier "AnimatedTitle" - char buf[128]; - sprintf(buf, "Animated title %c %d###AnimatedTitle", "|/-\\"[(int)(ImGui::GetTime() / 0.25f) & 3], ImGui::GetFrameCount()); - ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 300), ImGuiCond_FirstUseEver); - ImGui::Begin(buf); - ImGui::Text("This window has a changing title."); - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() -//----------------------------------------------------------------------------- - -// Demonstrate using the low-level ImDrawList to draw custom shapes. -static void ShowExampleAppCustomRendering(bool* p_open) -{ - if (!ImGui::Begin("Example: Custom rendering", p_open)) - { - ImGui::End(); - return; - } - IMGUI_DEMO_MARKER("Examples/Custom Rendering"); - - // Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of - // overloaded operators, etc. Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your - // types and ImVec2/ImVec4. Dear ImGui defines overloaded operators but they are internal to imgui.cpp and not - // exposed outside (to avoid messing with your types) In this example we are not using the maths operators! - - if (ImGui::BeginTabBar("##TabBar")) - { - if (ImGui::BeginTabItem("Primitives")) - { - ImGui::PushItemWidth(-ImGui::GetFontSize() * 15); - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - - // Draw gradients - // (note that those are currently exacerbating our sRGB/Linear issues) - // Calling ImGui::GetColorU32() multiplies the given colors by the current Style Alpha, but you may pass the IM_COL32() directly as well.. - ImGui::Text("Gradients"); - ImVec2 gradient_size = ImVec2(ImGui::CalcItemWidth(), ImGui::GetFrameHeight()); - { - ImVec2 p0 = ImGui::GetCursorScreenPos(); - ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y); - ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 0, 0, 255)); - ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 255, 255, 255)); - draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a); - ImGui::InvisibleButton("##gradient1", gradient_size); - } - { - ImVec2 p0 = ImGui::GetCursorScreenPos(); - ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y); - ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 255, 0, 255)); - ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 0, 0, 255)); - draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a); - ImGui::InvisibleButton("##gradient2", gradient_size); - } - - // Draw a bunch of primitives - ImGui::Text("All primitives"); - static float sz = 36.0f; - static float thickness = 3.0f; - static int ngon_sides = 6; - static bool circle_segments_override = false; - static int circle_segments_override_v = 12; - static bool curve_segments_override = false; - static int curve_segments_override_v = 8; - static ImVec4 colf = ImVec4(1.0f, 1.0f, 0.4f, 1.0f); - ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 100.0f, "%.0f"); - ImGui::DragFloat("Thickness", &thickness, 0.05f, 1.0f, 8.0f, "%.02f"); - ImGui::SliderInt("N-gon sides", &ngon_sides, 3, 12); - ImGui::Checkbox("##circlesegmentoverride", &circle_segments_override); - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); - circle_segments_override |= ImGui::SliderInt("Circle segments override", &circle_segments_override_v, 3, 40); - ImGui::Checkbox("##curvessegmentoverride", &curve_segments_override); - ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); - curve_segments_override |= ImGui::SliderInt("Curves segments override", &curve_segments_override_v, 3, 40); - ImGui::ColorEdit4("Color", &colf.x); - - const ImVec2 p = ImGui::GetCursorScreenPos(); - const ImU32 col = ImColor(colf); - const float spacing = 10.0f; - const ImDrawFlags corners_tl_br = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomRight; - const float rounding = sz / 5.0f; - const int circle_segments = circle_segments_override ? circle_segments_override_v : 0; - const int curve_segments = curve_segments_override ? curve_segments_override_v : 0; - float x = p.x + 4.0f; - float y = p.y + 4.0f; - for (int n = 0; n < 2; n++) - { - // First line uses a thickness of 1.0f, second line uses the configurable thickness - float th = (n == 0) ? 1.0f : thickness; - draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon - draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle - draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing; // Square - draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing; // Square with all rounded corners - draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners - draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing; // Triangle - //draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th);x+= sz*0.4f + spacing; // Thin triangle - draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!) - draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!) - draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line - - // Quadratic Bezier Curve (3 control points) - ImVec2 cp3[3] = { ImVec2(x, y + sz * 0.6f), ImVec2(x + sz * 0.5f, y - sz * 0.4f), ImVec2(x + sz, y + sz) }; - draw_list->AddBezierQuadratic(cp3[0], cp3[1], cp3[2], col, th, curve_segments); x += sz + spacing; - - // Cubic Bezier Curve (4 control points) - ImVec2 cp4[4] = { ImVec2(x, y), ImVec2(x + sz * 1.3f, y + sz * 0.3f), ImVec2(x + sz - sz * 1.3f, y + sz - sz * 0.3f), ImVec2(x + sz, y + sz) }; - draw_list->AddBezierCubic(cp4[0], cp4[1], cp4[2], cp4[3], col, th, curve_segments); - - x = p.x + 4; - y += sz + spacing; - } - draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz*0.5f, col, ngon_sides); x += sz + spacing; // N-gon - draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments); x += sz + spacing; // Circle - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners - draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle - //draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness) - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;// Vertical line (faster than AddLine, but only handle integer thickness) - draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine) - draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255)); - - ImGui::Dummy(ImVec2((sz + spacing) * 10.2f, (sz + spacing) * 3.0f)); - ImGui::PopItemWidth(); - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("Canvas")) - { - static ImVector points; - static ImVec2 scrolling(0.0f, 0.0f); - static bool opt_enable_grid = true; - static bool opt_enable_context_menu = true; - static bool adding_line = false; - - ImGui::Checkbox("Enable grid", &opt_enable_grid); - ImGui::Checkbox("Enable context menu", &opt_enable_context_menu); - ImGui::Text("Mouse Left: drag to add lines,\nMouse Right: drag to scroll, click for context menu."); - - // Typically you would use a BeginChild()/EndChild() pair to benefit from a clipping region + own scrolling. - // Here we demonstrate that this can be replaced by simple offsetting + custom drawing + PushClipRect/PopClipRect() calls. - // To use a child window instead we could use, e.g: - // ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Disable padding - // ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(50, 50, 50, 255)); // Set a background color - // ImGui::BeginChild("canvas", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_NoMove); - // ImGui::PopStyleColor(); - // ImGui::PopStyleVar(); - // [...] - // ImGui::EndChild(); - - // Using InvisibleButton() as a convenience 1) it will advance the layout cursor and 2) allows us to use IsItemHovered()/IsItemActive() - ImVec2 canvas_p0 = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates! - ImVec2 canvas_sz = ImGui::GetContentRegionAvail(); // Resize canvas to what's available - if (canvas_sz.x < 50.0f) canvas_sz.x = 50.0f; - if (canvas_sz.y < 50.0f) canvas_sz.y = 50.0f; - ImVec2 canvas_p1 = ImVec2(canvas_p0.x + canvas_sz.x, canvas_p0.y + canvas_sz.y); - - // Draw border and background color - ImGuiIO& io = ImGui::GetIO(); - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - draw_list->AddRectFilled(canvas_p0, canvas_p1, IM_COL32(50, 50, 50, 255)); - draw_list->AddRect(canvas_p0, canvas_p1, IM_COL32(255, 255, 255, 255)); - - // This will catch our interactions - ImGui::InvisibleButton("canvas", canvas_sz, ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); - const bool is_hovered = ImGui::IsItemHovered(); // Hovered - const bool is_active = ImGui::IsItemActive(); // Held - const ImVec2 origin(canvas_p0.x + scrolling.x, canvas_p0.y + scrolling.y); // Lock scrolled origin - const ImVec2 mouse_pos_in_canvas(io.MousePos.x - origin.x, io.MousePos.y - origin.y); - - // Add first and second point - if (is_hovered && !adding_line && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) - { - points.push_back(mouse_pos_in_canvas); - points.push_back(mouse_pos_in_canvas); - adding_line = true; - } - if (adding_line) - { - points.back() = mouse_pos_in_canvas; - if (!ImGui::IsMouseDown(ImGuiMouseButton_Left)) - adding_line = false; - } - - // Pan (we use a zero mouse threshold when there's no context menu) - // You may decide to make that threshold dynamic based on whether the mouse is hovering something etc. - const float mouse_threshold_for_pan = opt_enable_context_menu ? -1.0f : 0.0f; - if (is_active && ImGui::IsMouseDragging(ImGuiMouseButton_Right, mouse_threshold_for_pan)) - { - scrolling.x += io.MouseDelta.x; - scrolling.y += io.MouseDelta.y; - } - - // Context menu (under default mouse threshold) - ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right); - if (opt_enable_context_menu && drag_delta.x == 0.0f && drag_delta.y == 0.0f) - ImGui::OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); - if (ImGui::BeginPopup("context")) - { - if (adding_line) - points.resize(points.size() - 2); - adding_line = false; - if (ImGui::MenuItem("Remove one", NULL, false, points.Size > 0)) { points.resize(points.size() - 2); } - if (ImGui::MenuItem("Remove all", NULL, false, points.Size > 0)) { points.clear(); } - ImGui::EndPopup(); - } - - // Draw grid + all lines in the canvas - draw_list->PushClipRect(canvas_p0, canvas_p1, true); - if (opt_enable_grid) - { - const float GRID_STEP = 64.0f; - for (float x = fmodf(scrolling.x, GRID_STEP); x < canvas_sz.x; x += GRID_STEP) - draw_list->AddLine(ImVec2(canvas_p0.x + x, canvas_p0.y), ImVec2(canvas_p0.x + x, canvas_p1.y), IM_COL32(200, 200, 200, 40)); - for (float y = fmodf(scrolling.y, GRID_STEP); y < canvas_sz.y; y += GRID_STEP) - draw_list->AddLine(ImVec2(canvas_p0.x, canvas_p0.y + y), ImVec2(canvas_p1.x, canvas_p0.y + y), IM_COL32(200, 200, 200, 40)); - } - for (int n = 0; n < points.Size; n += 2) - draw_list->AddLine(ImVec2(origin.x + points[n].x, origin.y + points[n].y), ImVec2(origin.x + points[n + 1].x, origin.y + points[n + 1].y), IM_COL32(255, 255, 0, 255), 2.0f); - draw_list->PopClipRect(); - - ImGui::EndTabItem(); - } - - if (ImGui::BeginTabItem("BG/FG draw lists")) - { - static bool draw_bg = true; - static bool draw_fg = true; - ImGui::Checkbox("Draw in Background draw list", &draw_bg); - ImGui::SameLine(); HelpMarker("The Background draw list will be rendered below every Dear ImGui windows."); - ImGui::Checkbox("Draw in Foreground draw list", &draw_fg); - ImGui::SameLine(); HelpMarker("The Foreground draw list will be rendered over every Dear ImGui windows."); - ImVec2 window_pos = ImGui::GetWindowPos(); - ImVec2 window_size = ImGui::GetWindowSize(); - ImVec2 window_center = ImVec2(window_pos.x + window_size.x * 0.5f, window_pos.y + window_size.y * 0.5f); - if (draw_bg) - ImGui::GetBackgroundDrawList()->AddCircle(window_center, window_size.x * 0.6f, IM_COL32(255, 0, 0, 200), 0, 10 + 4); - if (draw_fg) - ImGui::GetForegroundDrawList()->AddCircle(window_center, window_size.y * 0.6f, IM_COL32(0, 255, 0, 200), 0, 10); - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } - - ImGui::End(); -} - -//----------------------------------------------------------------------------- -// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() -//----------------------------------------------------------------------------- - -// Simplified structure to mimic a Document model -struct MyDocument -{ - const char* Name; // Document title - bool Open; // Set when open (we keep an array of all available documents to simplify demo code!) - bool OpenPrev; // Copy of Open from last update. - bool Dirty; // Set when the document has been modified - bool WantClose; // Set when the document - ImVec4 Color; // An arbitrary variable associated to the document - - MyDocument(const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f)) - { - Name = name; - Open = OpenPrev = open; - Dirty = false; - WantClose = false; - Color = color; - } - void DoOpen() { Open = true; } - void DoQueueClose() { WantClose = true; } - void DoForceClose() { Open = false; Dirty = false; } - void DoSave() { Dirty = false; } - - // Display placeholder contents for the Document - static void DisplayContents(MyDocument* doc) - { - ImGui::PushID(doc); - ImGui::Text("Document \"%s\"", doc->Name); - ImGui::PushStyleColor(ImGuiCol_Text, doc->Color); - ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); - ImGui::PopStyleColor(); - if (ImGui::Button("Modify", ImVec2(100, 0))) - doc->Dirty = true; - ImGui::SameLine(); - if (ImGui::Button("Save", ImVec2(100, 0))) - doc->DoSave(); - ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior. - ImGui::PopID(); - } - - // Display context menu for the Document - static void DisplayContextMenu(MyDocument* doc) - { - if (!ImGui::BeginPopupContextItem()) - return; - - char buf[256]; - sprintf(buf, "Save %s", doc->Name); - if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open)) - doc->DoSave(); - if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open)) - doc->DoQueueClose(); - ImGui::EndPopup(); - } -}; - -struct ExampleAppDocuments -{ - ImVector Documents; - - ExampleAppDocuments() - { - Documents.push_back(MyDocument("Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f))); - Documents.push_back(MyDocument("Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f))); - Documents.push_back(MyDocument("Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f))); - Documents.push_back(MyDocument("Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f))); - Documents.push_back(MyDocument("A Rather Long Title", false)); - Documents.push_back(MyDocument("Some Document", false)); - } -}; - -// [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface. -// If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo, -// as opposed to clicking on the regular tab closing button) and stops being submitted, it will take a frame for -// the tab bar to notice its absence. During this frame there will be a gap in the tab bar, and if the tab that has -// disappeared was the selected one, the tab bar will report no selected tab during the frame. This will effectively -// give the impression of a flicker for one frame. -// We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch. -// Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag. -static void NotifyOfDocumentsClosedElsewhere(ExampleAppDocuments& app) -{ - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open && doc->OpenPrev) - ImGui::SetTabItemClosed(doc->Name); - doc->OpenPrev = doc->Open; - } -} - -void ShowExampleAppDocuments(bool* p_open) -{ - static ExampleAppDocuments app; - - // Options - static bool opt_reorderable = true; - static ImGuiTabBarFlags opt_fitting_flags = ImGuiTabBarFlags_FittingPolicyDefault_; - - bool window_contents_visible = ImGui::Begin("Example: Documents", p_open, ImGuiWindowFlags_MenuBar); - if (!window_contents_visible) - { - ImGui::End(); - return; - } - - // Menu - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("File")) - { - int open_count = 0; - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - open_count += app.Documents[doc_n].Open ? 1 : 0; - - if (ImGui::BeginMenu("Open", open_count < app.Documents.Size)) - { - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open) - if (ImGui::MenuItem(doc->Name)) - doc->DoOpen(); - } - ImGui::EndMenu(); - } - if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0)) - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - app.Documents[doc_n].DoQueueClose(); - if (ImGui::MenuItem("Exit", "Ctrl+F4") && p_open) - *p_open = false; - ImGui::EndMenu(); - } - ImGui::EndMenuBar(); - } - - // [Debug] List documents with one checkbox for each - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (doc_n > 0) - ImGui::SameLine(); - ImGui::PushID(doc); - if (ImGui::Checkbox(doc->Name, &doc->Open)) - if (!doc->Open) - doc->DoForceClose(); - ImGui::PopID(); - } - - ImGui::Separator(); - - // About the ImGuiWindowFlags_UnsavedDocument / ImGuiTabItemFlags_UnsavedDocument flags. - // They have multiple effects: - // - Display a dot next to the title. - // - Tab is selected when clicking the X close button. - // - Closure is not assumed (will wait for user to stop submitting the tab). - // Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. - // We need to assume closure by default otherwise waiting for "lack of submission" on the next frame would leave an empty - // hole for one-frame, both in the tab-bar and in tab-contents when closing a tab/window. - // The rarely used SetTabItemClosed() function is a way to notify of programmatic closure to avoid the one-frame hole. - - // Submit Tab Bar and Tabs - { - ImGuiTabBarFlags tab_bar_flags = (opt_fitting_flags) | (opt_reorderable ? ImGuiTabBarFlags_Reorderable : 0); - if (ImGui::BeginTabBar("##tabs", tab_bar_flags)) - { - if (opt_reorderable) - NotifyOfDocumentsClosedElsewhere(app); - - // [DEBUG] Stress tests - //if ((ImGui::GetFrameCount() % 30) == 0) docs[1].Open ^= 1; // [DEBUG] Automatically show/hide a tab. Test various interactions e.g. dragging with this on. - //if (ImGui::GetIO().KeyCtrl) ImGui::SetTabItemSelected(docs[1].Name); // [DEBUG] Test SetTabItemSelected(), probably not very useful as-is anyway.. - - // Submit Tabs - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open) - continue; - - ImGuiTabItemFlags tab_flags = (doc->Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0); - bool visible = ImGui::BeginTabItem(doc->Name, &doc->Open, tab_flags); - - // Cancel attempt to close when unsaved add to save queue so we can display a popup. - if (!doc->Open && doc->Dirty) - { - doc->Open = true; - doc->DoQueueClose(); - } - - MyDocument::DisplayContextMenu(doc); - if (visible) - { - MyDocument::DisplayContents(doc); - ImGui::EndTabItem(); - } - } - - ImGui::EndTabBar(); - } - } - - // Update closing queue - static ImVector close_queue; - if (close_queue.empty()) - { - // Close queue is locked once we started a popup - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (doc->WantClose) - { - doc->WantClose = false; - close_queue.push_back(doc); - } - } - } - - // Display closing confirmation UI - if (!close_queue.empty()) - { - int close_queue_unsaved_documents = 0; - for (int n = 0; n < close_queue.Size; n++) - if (close_queue[n]->Dirty) - close_queue_unsaved_documents++; - - if (close_queue_unsaved_documents == 0) - { - // Close documents when all are unsaved - for (int n = 0; n < close_queue.Size; n++) - close_queue[n]->DoForceClose(); - close_queue.clear(); - } - else - { - if (!ImGui::IsPopupOpen("Save?")) - ImGui::OpenPopup("Save?"); - if (ImGui::BeginPopupModal("Save?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) - { - ImGui::Text("Save change to the following items?"); - float item_height = ImGui::GetTextLineHeightWithSpacing(); - if (ImGui::BeginChildFrame(ImGui::GetID("frame"), ImVec2(-FLT_MIN, 6.25f * item_height))) - { - for (int n = 0; n < close_queue.Size; n++) - if (close_queue[n]->Dirty) - ImGui::Text("%s", close_queue[n]->Name); - ImGui::EndChildFrame(); - } - - ImVec2 button_size(ImGui::GetFontSize() * 7.0f, 0.0f); - if (ImGui::Button("Yes", button_size)) - { - for (int n = 0; n < close_queue.Size; n++) - { - if (close_queue[n]->Dirty) - close_queue[n]->DoSave(); - close_queue[n]->DoForceClose(); - } - close_queue.clear(); - ImGui::CloseCurrentPopup(); - } - ImGui::SameLine(); - if (ImGui::Button("No", button_size)) - { - for (int n = 0; n < close_queue.Size; n++) - close_queue[n]->DoForceClose(); - close_queue.clear(); - ImGui::CloseCurrentPopup(); - } - ImGui::SameLine(); - if (ImGui::Button("Cancel", button_size)) - { - close_queue.clear(); - ImGui::CloseCurrentPopup(); - } - ImGui::EndPopup(); - } - } - } - - ImGui::End(); -} - -// End of Demo code -#else - -void ImGui::ShowAboutWindow(bool*) {} -void ImGui::ShowDemoWindow(bool*) {} -void ImGui::ShowUserGuide() {} -void ImGui::ShowStyleEditor(ImGuiStyle*) {} - -#endif - -#endif // #ifndef IMGUI_DISABLE diff --git a/dependencies/reboot/vendor/ImGui/imgui_draw.cpp b/dependencies/reboot/vendor/ImGui/imgui_draw.cpp deleted file mode 100644 index 256dd6f..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_draw.cpp +++ /dev/null @@ -1,4162 +0,0 @@ -// dear imgui, v1.89 WIP -// (drawing and font code) - -/* - -Index of this file: - -// [SECTION] STB libraries implementation -// [SECTION] Style functions -// [SECTION] ImDrawList -// [SECTION] ImDrawListSplitter -// [SECTION] ImDrawData -// [SECTION] Helpers ShadeVertsXXX functions -// [SECTION] ImFontConfig -// [SECTION] ImFontAtlas -// [SECTION] ImFontAtlas glyph ranges helpers -// [SECTION] ImFontGlyphRangesBuilder -// [SECTION] ImFont -// [SECTION] ImGui Internal Render Helpers -// [SECTION] Decompression code -// [SECTION] Default font data (ProggyClean.ttf) - -*/ - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#ifndef IMGUI_DISABLE - -#ifndef IMGUI_DEFINE_MATH_OPERATORS -#define IMGUI_DEFINE_MATH_OPERATORS -#endif - -#include "imgui_internal.h" -#ifdef IMGUI_ENABLE_FREETYPE -#include "misc/freetype/imgui_freetype.h" -#endif - -#include // vsnprintf, sscanf, printf -#if !defined(alloca) -#if defined(__GLIBC__) || defined(__sun) || defined(__APPLE__) || defined(__NEWLIB__) -#include // alloca (glibc uses . Note that Cygwin may have _WIN32 defined, so the order matters here) -#elif defined(_WIN32) -#include // alloca -#if !defined(alloca) -#define alloca _alloca // for clang with MS Codegen -#endif -#else -#include // alloca -#endif -#endif - -// Visual Studio warnings -#ifdef _MSC_VER -#pragma warning (disable: 4127) // condition expression is constant -#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff) -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#pragma warning (disable: 6255) // [Static Analyzer] _alloca indicates failure by raising a stack overflow exception. Consider using _malloca instead. -#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). -#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer) -#endif - -// Clang/GCC warnings with -Weverything -#if defined(__clang__) -#if __has_warning("-Wunknown-warning-option") -#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! -#endif -#if __has_warning("-Walloca") -#pragma clang diagnostic ignored "-Walloca" // warning: use of function '__builtin_alloca' is discouraged -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' -#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok. -#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 -#pragma clang diagnostic ignored "-Wcomma" // warning: possible misuse of comma operator here -#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. -#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision -#elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind -#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used -#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function -#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value -#pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer -#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#endif - -//------------------------------------------------------------------------- -// [SECTION] STB libraries implementation (for stb_truetype and stb_rect_pack) -//------------------------------------------------------------------------- - -// Compile time options: -//#define IMGUI_STB_NAMESPACE ImStb -//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" -//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" -//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION -//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION - -#ifdef IMGUI_STB_NAMESPACE -namespace IMGUI_STB_NAMESPACE -{ -#endif - -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable: 4456) // declaration of 'xx' hides previous local declaration -#pragma warning (disable: 6011) // (stb_rectpack) Dereferencing NULL pointer 'cur->next'. -#pragma warning (disable: 6385) // (stb_truetype) Reading invalid data from 'buffer': the readable size is '_Old_3`kernel_width' bytes, but '3' bytes may be read. -#pragma warning (disable: 28182) // (stb_rectpack) Dereferencing NULL pointer. 'cur' contains the same NULL value as 'cur->next' did. -#endif - -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-function" -#pragma clang diagnostic ignored "-Wmissing-prototypes" -#pragma clang diagnostic ignored "-Wimplicit-fallthrough" -#pragma clang diagnostic ignored "-Wcast-qual" // warning: cast from 'const xxxx *' to 'xxx *' drops const qualifier -#endif - -#if defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type [-Wtype-limits] -#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers -#endif - -#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) -#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in another compilation unit -#define STBRP_STATIC -#define STBRP_ASSERT(x) do { IM_ASSERT(x); } while (0) -#define STBRP_SORT ImQsort -#define STB_RECT_PACK_IMPLEMENTATION -#endif -#ifdef IMGUI_STB_RECT_PACK_FILENAME -#include IMGUI_STB_RECT_PACK_FILENAME -#else -#include "imstb_rectpack.h" -#endif -#endif - -#ifdef IMGUI_ENABLE_STB_TRUETYPE -#ifndef STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) -#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in another compilation unit -#define STBTT_malloc(x,u) ((void)(u), IM_ALLOC(x)) -#define STBTT_free(x,u) ((void)(u), IM_FREE(x)) -#define STBTT_assert(x) do { IM_ASSERT(x); } while(0) -#define STBTT_fmod(x,y) ImFmod(x,y) -#define STBTT_sqrt(x) ImSqrt(x) -#define STBTT_pow(x,y) ImPow(x,y) -#define STBTT_fabs(x) ImFabs(x) -#define STBTT_ifloor(x) ((int)ImFloorSigned(x)) -#define STBTT_iceil(x) ((int)ImCeil(x)) -#define STBTT_STATIC -#define STB_TRUETYPE_IMPLEMENTATION -#else -#define STBTT_DEF extern -#endif -#ifdef IMGUI_STB_TRUETYPE_FILENAME -#include IMGUI_STB_TRUETYPE_FILENAME -#else -#include "imstb_truetype.h" -#endif -#endif -#endif // IMGUI_ENABLE_STB_TRUETYPE - -#if defined(__GNUC__) -#pragma GCC diagnostic pop -#endif - -#if defined(__clang__) -#pragma clang diagnostic pop -#endif - -#if defined(_MSC_VER) -#pragma warning (pop) -#endif - -#ifdef IMGUI_STB_NAMESPACE -} // namespace ImStb -using namespace IMGUI_STB_NAMESPACE; -#endif - -//----------------------------------------------------------------------------- -// [SECTION] Style functions -//----------------------------------------------------------------------------- - -void ImGui::StyleColorsDark(ImGuiStyle* dst) -{ - ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); - ImVec4* colors = style->Colors; - - colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f); - colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f); - colors[ImGuiCol_Border] = ImVec4(0.43f, 0.43f, 0.50f, 0.50f); - colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_FrameBg] = ImVec4(0.16f, 0.29f, 0.48f, 0.54f); - colors[ImGuiCol_FrameBgHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); - colors[ImGuiCol_FrameBgActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); - colors[ImGuiCol_TitleBg] = ImVec4(0.04f, 0.04f, 0.04f, 1.00f); - colors[ImGuiCol_TitleBgActive] = ImVec4(0.16f, 0.29f, 0.48f, 1.00f); - colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.51f); - colors[ImGuiCol_MenuBarBg] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); - colors[ImGuiCol_ScrollbarBg] = ImVec4(0.02f, 0.02f, 0.02f, 0.53f); - colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.31f, 0.31f, 0.31f, 1.00f); - colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f); - colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.51f, 0.51f, 0.51f, 1.00f); - colors[ImGuiCol_CheckMark] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_SliderGrab] = ImVec4(0.24f, 0.52f, 0.88f, 1.00f); - colors[ImGuiCol_SliderGrabActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_Button] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_ButtonActive] = ImVec4(0.06f, 0.53f, 0.98f, 1.00f); - colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); - colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); - colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_Separator] = colors[ImGuiCol_Border]; - colors[ImGuiCol_SeparatorHovered] = ImVec4(0.10f, 0.40f, 0.75f, 0.78f); - colors[ImGuiCol_SeparatorActive] = ImVec4(0.10f, 0.40f, 0.75f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.20f); - colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); - colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); - colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f); - colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; - colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); - colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); - colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); - colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f); - colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); - colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); - colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); - colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 1.00f); // Prefer using Alpha=1.0 here - colors[ImGuiCol_TableBorderLight] = ImVec4(0.23f, 0.23f, 0.25f, 1.00f); // Prefer using Alpha=1.0 here - colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); - colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); - colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); - colors[ImGuiCol_NavHighlight] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); - colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); - colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f); -} - -void ImGui::StyleColorsClassic(ImGuiStyle* dst) -{ - ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); - ImVec4* colors = style->Colors; - - colors[ImGuiCol_Text] = ImVec4(0.90f, 0.90f, 0.90f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.85f); - colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_PopupBg] = ImVec4(0.11f, 0.11f, 0.14f, 0.92f); - colors[ImGuiCol_Border] = ImVec4(0.50f, 0.50f, 0.50f, 0.50f); - colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_FrameBg] = ImVec4(0.43f, 0.43f, 0.43f, 0.39f); - colors[ImGuiCol_FrameBgHovered] = ImVec4(0.47f, 0.47f, 0.69f, 0.40f); - colors[ImGuiCol_FrameBgActive] = ImVec4(0.42f, 0.41f, 0.64f, 0.69f); - colors[ImGuiCol_TitleBg] = ImVec4(0.27f, 0.27f, 0.54f, 0.83f); - colors[ImGuiCol_TitleBgActive] = ImVec4(0.32f, 0.32f, 0.63f, 0.87f); - colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.40f, 0.40f, 0.80f, 0.20f); - colors[ImGuiCol_MenuBarBg] = ImVec4(0.40f, 0.40f, 0.55f, 0.80f); - colors[ImGuiCol_ScrollbarBg] = ImVec4(0.20f, 0.25f, 0.30f, 0.60f); - colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.40f, 0.40f, 0.80f, 0.30f); - colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.40f, 0.40f, 0.80f, 0.40f); - colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.41f, 0.39f, 0.80f, 0.60f); - colors[ImGuiCol_CheckMark] = ImVec4(0.90f, 0.90f, 0.90f, 0.50f); - colors[ImGuiCol_SliderGrab] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f); - colors[ImGuiCol_SliderGrabActive] = ImVec4(0.41f, 0.39f, 0.80f, 0.60f); - colors[ImGuiCol_Button] = ImVec4(0.35f, 0.40f, 0.61f, 0.62f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.40f, 0.48f, 0.71f, 0.79f); - colors[ImGuiCol_ButtonActive] = ImVec4(0.46f, 0.54f, 0.80f, 1.00f); - colors[ImGuiCol_Header] = ImVec4(0.40f, 0.40f, 0.90f, 0.45f); - colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.90f, 0.80f); - colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.87f, 0.80f); - colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 0.60f); - colors[ImGuiCol_SeparatorHovered] = ImVec4(0.60f, 0.60f, 0.70f, 1.00f); - colors[ImGuiCol_SeparatorActive] = ImVec4(0.70f, 0.70f, 0.90f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.10f); - colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.78f, 0.82f, 1.00f, 0.60f); - colors[ImGuiCol_ResizeGripActive] = ImVec4(0.78f, 0.82f, 1.00f, 0.90f); - colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f); - colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; - colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); - colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); - colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); - colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); - colors[ImGuiCol_TableHeaderBg] = ImVec4(0.27f, 0.27f, 0.38f, 1.00f); - colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.45f, 1.00f); // Prefer using Alpha=1.0 here - colors[ImGuiCol_TableBorderLight] = ImVec4(0.26f, 0.26f, 0.28f, 1.00f); // Prefer using Alpha=1.0 here - colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.07f); - colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 0.00f, 1.00f, 0.35f); - colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); - colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; - colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); - colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); - colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); -} - -// Those light colors are better suited with a thicker font than the default one + FrameBorder -void ImGui::StyleColorsLight(ImGuiStyle* dst) -{ - ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); - ImVec4* colors = style->Colors; - - colors[ImGuiCol_Text] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.94f, 0.94f, 0.94f, 1.00f); - colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_PopupBg] = ImVec4(1.00f, 1.00f, 1.00f, 0.98f); - colors[ImGuiCol_Border] = ImVec4(0.00f, 0.00f, 0.00f, 0.30f); - colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_FrameBg] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_FrameBgHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); - colors[ImGuiCol_FrameBgActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); - colors[ImGuiCol_TitleBg] = ImVec4(0.96f, 0.96f, 0.96f, 1.00f); - colors[ImGuiCol_TitleBgActive] = ImVec4(0.82f, 0.82f, 0.82f, 1.00f); - colors[ImGuiCol_TitleBgCollapsed] = ImVec4(1.00f, 1.00f, 1.00f, 0.51f); - colors[ImGuiCol_MenuBarBg] = ImVec4(0.86f, 0.86f, 0.86f, 1.00f); - colors[ImGuiCol_ScrollbarBg] = ImVec4(0.98f, 0.98f, 0.98f, 0.53f); - colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.69f, 0.69f, 0.69f, 0.80f); - colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.49f, 0.49f, 0.49f, 0.80f); - colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.49f, 0.49f, 0.49f, 1.00f); - colors[ImGuiCol_CheckMark] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_SliderGrab] = ImVec4(0.26f, 0.59f, 0.98f, 0.78f); - colors[ImGuiCol_SliderGrabActive] = ImVec4(0.46f, 0.54f, 0.80f, 0.60f); - colors[ImGuiCol_Button] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_ButtonActive] = ImVec4(0.06f, 0.53f, 0.98f, 1.00f); - colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); - colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); - colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); - colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 0.62f); - colors[ImGuiCol_SeparatorHovered] = ImVec4(0.14f, 0.44f, 0.80f, 0.78f); - colors[ImGuiCol_SeparatorActive] = ImVec4(0.14f, 0.44f, 0.80f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(0.35f, 0.35f, 0.35f, 0.17f); - colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); - colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); - colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.90f); - colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; - colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); - colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); - colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); - colors[ImGuiCol_PlotLines] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f); - colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); - colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.45f, 0.00f, 1.00f); - colors[ImGuiCol_TableHeaderBg] = ImVec4(0.78f, 0.87f, 0.98f, 1.00f); - colors[ImGuiCol_TableBorderStrong] = ImVec4(0.57f, 0.57f, 0.64f, 1.00f); // Prefer using Alpha=1.0 here - colors[ImGuiCol_TableBorderLight] = ImVec4(0.68f, 0.68f, 0.74f, 1.00f); // Prefer using Alpha=1.0 here - colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_TableRowBgAlt] = ImVec4(0.30f, 0.30f, 0.30f, 0.09f); - colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); - colors[ImGuiCol_DragDropTarget] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); - colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; - colors[ImGuiCol_NavWindowingHighlight] = ImVec4(0.70f, 0.70f, 0.70f, 0.70f); - colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.20f); - colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); -} - -//----------------------------------------------------------------------------- -// [SECTION] ImDrawList -//----------------------------------------------------------------------------- - -ImDrawListSharedData::ImDrawListSharedData() -{ - memset(this, 0, sizeof(*this)); - for (int i = 0; i < IM_ARRAYSIZE(ArcFastVtx); i++) - { - const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(ArcFastVtx); - ArcFastVtx[i] = ImVec2(ImCos(a), ImSin(a)); - } - ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError); -} - -void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error) -{ - if (CircleSegmentMaxError == max_error) - return; - - IM_ASSERT(max_error > 0.0f); - CircleSegmentMaxError = max_error; - for (int i = 0; i < IM_ARRAYSIZE(CircleSegmentCounts); i++) - { - const float radius = (float)i; - CircleSegmentCounts[i] = (ImU8)((i > 0) ? IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, CircleSegmentMaxError) : IM_DRAWLIST_ARCFAST_SAMPLE_MAX); - } - ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError); -} - -// Initialize before use in a new frame. We always have a command ready in the buffer. -void ImDrawList::_ResetForNewFrame() -{ - // Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory. - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, ClipRect) == 0); - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, TextureId) == sizeof(ImVec4)); - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID)); - - CmdBuffer.resize(0); - IdxBuffer.resize(0); - VtxBuffer.resize(0); - Flags = _Data->InitialFlags; - memset(&_CmdHeader, 0, sizeof(_CmdHeader)); - _VtxCurrentIdx = 0; - _VtxWritePtr = NULL; - _IdxWritePtr = NULL; - _ClipRectStack.resize(0); - _TextureIdStack.resize(0); - _Path.resize(0); - _Splitter.Clear(); - CmdBuffer.push_back(ImDrawCmd()); - _FringeScale = 1.0f; -} - -void ImDrawList::_ClearFreeMemory() -{ - CmdBuffer.clear(); - IdxBuffer.clear(); - VtxBuffer.clear(); - Flags = ImDrawListFlags_None; - _VtxCurrentIdx = 0; - _VtxWritePtr = NULL; - _IdxWritePtr = NULL; - _ClipRectStack.clear(); - _TextureIdStack.clear(); - _Path.clear(); - _Splitter.ClearFreeMemory(); -} - -ImDrawList* ImDrawList::CloneOutput() const -{ - ImDrawList* dst = IM_NEW(ImDrawList(_Data)); - dst->CmdBuffer = CmdBuffer; - dst->IdxBuffer = IdxBuffer; - dst->VtxBuffer = VtxBuffer; - dst->Flags = Flags; - return dst; -} - -void ImDrawList::AddDrawCmd() -{ - ImDrawCmd draw_cmd; - draw_cmd.ClipRect = _CmdHeader.ClipRect; // Same as calling ImDrawCmd_HeaderCopy() - draw_cmd.TextureId = _CmdHeader.TextureId; - draw_cmd.VtxOffset = _CmdHeader.VtxOffset; - draw_cmd.IdxOffset = IdxBuffer.Size; - - IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w); - CmdBuffer.push_back(draw_cmd); -} - -// Pop trailing draw command (used before merging or presenting to user) -// Note that this leaves the ImDrawList in a state unfit for further commands, as most code assume that CmdBuffer.Size > 0 && CmdBuffer.back().UserCallback == NULL -void ImDrawList::_PopUnusedDrawCmd() -{ - if (CmdBuffer.Size == 0) - return; - ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - if (curr_cmd->ElemCount == 0 && curr_cmd->UserCallback == NULL) - CmdBuffer.pop_back(); -} - -void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data) -{ - IM_ASSERT_PARANOID(CmdBuffer.Size > 0); - ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - IM_ASSERT(curr_cmd->UserCallback == NULL); - if (curr_cmd->ElemCount != 0) - { - AddDrawCmd(); - curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - } - curr_cmd->UserCallback = callback; - curr_cmd->UserCallbackData = callback_data; - - AddDrawCmd(); // Force a new command after us (see comment below) -} - -// Compare ClipRect, TextureId and VtxOffset with a single memcmp() -#define ImDrawCmd_HeaderSize (IM_OFFSETOF(ImDrawCmd, VtxOffset) + sizeof(unsigned int)) -#define ImDrawCmd_HeaderCompare(CMD_LHS, CMD_RHS) (memcmp(CMD_LHS, CMD_RHS, ImDrawCmd_HeaderSize)) // Compare ClipRect, TextureId, VtxOffset -#define ImDrawCmd_HeaderCopy(CMD_DST, CMD_SRC) (memcpy(CMD_DST, CMD_SRC, ImDrawCmd_HeaderSize)) // Copy ClipRect, TextureId, VtxOffset -#define ImDrawCmd_AreSequentialIdxOffset(CMD_0, CMD_1) (CMD_0->IdxOffset + CMD_0->ElemCount == CMD_1->IdxOffset) - -// Try to merge two last draw commands -void ImDrawList::_TryMergeDrawCmds() -{ - IM_ASSERT_PARANOID(CmdBuffer.Size > 0); - ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - ImDrawCmd* prev_cmd = curr_cmd - 1; - if (ImDrawCmd_HeaderCompare(curr_cmd, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && curr_cmd->UserCallback == NULL && prev_cmd->UserCallback == NULL) - { - prev_cmd->ElemCount += curr_cmd->ElemCount; - CmdBuffer.pop_back(); - } -} - -// Our scheme may appears a bit unusual, basically we want the most-common calls AddLine AddRect etc. to not have to perform any check so we always have a command ready in the stack. -// The cost of figuring out if a new command has to be added or if we can merge is paid in those Update** functions only. -void ImDrawList::_OnChangedClipRect() -{ - // If current command is used with different settings we need to add a new command - IM_ASSERT_PARANOID(CmdBuffer.Size > 0); - ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - if (curr_cmd->ElemCount != 0 && memcmp(&curr_cmd->ClipRect, &_CmdHeader.ClipRect, sizeof(ImVec4)) != 0) - { - AddDrawCmd(); - return; - } - IM_ASSERT(curr_cmd->UserCallback == NULL); - - // Try to merge with previous command if it matches, else use current command - ImDrawCmd* prev_cmd = curr_cmd - 1; - if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && prev_cmd->UserCallback == NULL) - { - CmdBuffer.pop_back(); - return; - } - - curr_cmd->ClipRect = _CmdHeader.ClipRect; -} - -void ImDrawList::_OnChangedTextureID() -{ - // If current command is used with different settings we need to add a new command - IM_ASSERT_PARANOID(CmdBuffer.Size > 0); - ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - if (curr_cmd->ElemCount != 0 && curr_cmd->TextureId != _CmdHeader.TextureId) - { - AddDrawCmd(); - return; - } - IM_ASSERT(curr_cmd->UserCallback == NULL); - - // Try to merge with previous command if it matches, else use current command - ImDrawCmd* prev_cmd = curr_cmd - 1; - if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && prev_cmd->UserCallback == NULL) - { - CmdBuffer.pop_back(); - return; - } - - curr_cmd->TextureId = _CmdHeader.TextureId; -} - -void ImDrawList::_OnChangedVtxOffset() -{ - // We don't need to compare curr_cmd->VtxOffset != _CmdHeader.VtxOffset because we know it'll be different at the time we call this. - _VtxCurrentIdx = 0; - IM_ASSERT_PARANOID(CmdBuffer.Size > 0); - ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - //IM_ASSERT(curr_cmd->VtxOffset != _CmdHeader.VtxOffset); // See #3349 - if (curr_cmd->ElemCount != 0) - { - AddDrawCmd(); - return; - } - IM_ASSERT(curr_cmd->UserCallback == NULL); - curr_cmd->VtxOffset = _CmdHeader.VtxOffset; -} - -int ImDrawList::_CalcCircleAutoSegmentCount(float radius) const -{ - // Automatic segment count - const int radius_idx = (int)(radius + 0.999999f); // ceil to never reduce accuracy - if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts)) - return _Data->CircleSegmentCounts[radius_idx]; // Use cached value - else - return IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError); -} - -// Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) -void ImDrawList::PushClipRect(const ImVec2& cr_min, const ImVec2& cr_max, bool intersect_with_current_clip_rect) -{ - ImVec4 cr(cr_min.x, cr_min.y, cr_max.x, cr_max.y); - if (intersect_with_current_clip_rect) - { - ImVec4 current = _CmdHeader.ClipRect; - if (cr.x < current.x) cr.x = current.x; - if (cr.y < current.y) cr.y = current.y; - if (cr.z > current.z) cr.z = current.z; - if (cr.w > current.w) cr.w = current.w; - } - cr.z = ImMax(cr.x, cr.z); - cr.w = ImMax(cr.y, cr.w); - - _ClipRectStack.push_back(cr); - _CmdHeader.ClipRect = cr; - _OnChangedClipRect(); -} - -void ImDrawList::PushClipRectFullScreen() -{ - PushClipRect(ImVec2(_Data->ClipRectFullscreen.x, _Data->ClipRectFullscreen.y), ImVec2(_Data->ClipRectFullscreen.z, _Data->ClipRectFullscreen.w)); -} - -void ImDrawList::PopClipRect() -{ - _ClipRectStack.pop_back(); - _CmdHeader.ClipRect = (_ClipRectStack.Size == 0) ? _Data->ClipRectFullscreen : _ClipRectStack.Data[_ClipRectStack.Size - 1]; - _OnChangedClipRect(); -} - -void ImDrawList::PushTextureID(ImTextureID texture_id) -{ - _TextureIdStack.push_back(texture_id); - _CmdHeader.TextureId = texture_id; - _OnChangedTextureID(); -} - -void ImDrawList::PopTextureID() -{ - _TextureIdStack.pop_back(); - _CmdHeader.TextureId = (_TextureIdStack.Size == 0) ? (ImTextureID)NULL : _TextureIdStack.Data[_TextureIdStack.Size - 1]; - _OnChangedTextureID(); -} - -// Reserve space for a number of vertices and indices. -// You must finish filling your reserved data before calling PrimReserve() again, as it may reallocate or -// submit the intermediate results. PrimUnreserve() can be used to release unused allocations. -void ImDrawList::PrimReserve(int idx_count, int vtx_count) -{ - // Large mesh support (when enabled) - IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); - if (sizeof(ImDrawIdx) == 2 && (_VtxCurrentIdx + vtx_count >= (1 << 16)) && (Flags & ImDrawListFlags_AllowVtxOffset)) - { - // FIXME: In theory we should be testing that vtx_count <64k here. - // In practice, RenderText() relies on reserving ahead for a worst case scenario so it is currently useful for us - // to not make that check until we rework the text functions to handle clipping and large horizontal lines better. - _CmdHeader.VtxOffset = VtxBuffer.Size; - _OnChangedVtxOffset(); - } - - ImDrawCmd* draw_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - draw_cmd->ElemCount += idx_count; - - int vtx_buffer_old_size = VtxBuffer.Size; - VtxBuffer.resize(vtx_buffer_old_size + vtx_count); - _VtxWritePtr = VtxBuffer.Data + vtx_buffer_old_size; - - int idx_buffer_old_size = IdxBuffer.Size; - IdxBuffer.resize(idx_buffer_old_size + idx_count); - _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size; -} - -// Release the a number of reserved vertices/indices from the end of the last reservation made with PrimReserve(). -void ImDrawList::PrimUnreserve(int idx_count, int vtx_count) -{ - IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); - - ImDrawCmd* draw_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; - draw_cmd->ElemCount -= idx_count; - VtxBuffer.shrink(VtxBuffer.Size - vtx_count); - IdxBuffer.shrink(IdxBuffer.Size - idx_count); -} - -// Fully unrolled with inline call to keep our debug builds decently fast. -void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col) -{ - ImVec2 b(c.x, a.y), d(a.x, c.y), uv(_Data->TexUvWhitePixel); - ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; - _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); - _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); - _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col; - _VtxWritePtr += 4; - _VtxCurrentIdx += 4; - _IdxWritePtr += 6; -} - -void ImDrawList::PrimRectUV(const ImVec2& a, const ImVec2& c, const ImVec2& uv_a, const ImVec2& uv_c, ImU32 col) -{ - ImVec2 b(c.x, a.y), d(a.x, c.y), uv_b(uv_c.x, uv_a.y), uv_d(uv_a.x, uv_c.y); - ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; - _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); - _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); - _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col; - _VtxWritePtr += 4; - _VtxCurrentIdx += 4; - _IdxWritePtr += 6; -} - -void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col) -{ - ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; - _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); - _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); - _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col; - _VtxWritePtr += 4; - _VtxCurrentIdx += 4; - _IdxWritePtr += 6; -} - -// On AddPolyline() and AddConvexPolyFilled() we intentionally avoid using ImVec2 and superfluous function calls to optimize debug/non-inlined builds. -// - Those macros expects l-values and need to be used as their own statement. -// - Those macros are intentionally not surrounded by the 'do {} while (0)' idiom because even that translates to runtime with debug compilers. -#define IM_NORMALIZE2F_OVER_ZERO(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = ImRsqrt(d2); VX *= inv_len; VY *= inv_len; } } (void)0 -#define IM_FIXNORMAL2F_MAX_INVLEN2 100.0f // 500.0f (see #4053, #3366) -#define IM_FIXNORMAL2F(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.000001f) { float inv_len2 = 1.0f / d2; if (inv_len2 > IM_FIXNORMAL2F_MAX_INVLEN2) inv_len2 = IM_FIXNORMAL2F_MAX_INVLEN2; VX *= inv_len2; VY *= inv_len2; } } (void)0 - -// TODO: Thickness anti-aliased lines cap are missing their AA fringe. -// We avoid using the ImVec2 math operators here to reduce cost to a minimum for debug/non-inlined builds. -void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, ImDrawFlags flags, float thickness) -{ - if (points_count < 2) - return; - - const bool closed = (flags & ImDrawFlags_Closed) != 0; - const ImVec2 opaque_uv = _Data->TexUvWhitePixel; - const int count = closed ? points_count : points_count - 1; // The number of line segments we need to draw - const bool thick_line = (thickness > _FringeScale); - - if (Flags & ImDrawListFlags_AntiAliasedLines) - { - // Anti-aliased stroke - const float AA_SIZE = _FringeScale; - const ImU32 col_trans = col & ~IM_COL32_A_MASK; - - // Thicknesses <1.0 should behave like thickness 1.0 - thickness = ImMax(thickness, 1.0f); - const int integer_thickness = (int)thickness; - const float fractional_thickness = thickness - integer_thickness; - - // Do we want to draw this line using a texture? - // - For now, only draw integer-width lines using textures to avoid issues with the way scaling occurs, could be improved. - // - If AA_SIZE is not 1.0f we cannot use the texture path. - const bool use_texture = (Flags & ImDrawListFlags_AntiAliasedLinesUseTex) && (integer_thickness < IM_DRAWLIST_TEX_LINES_WIDTH_MAX) && (fractional_thickness <= 0.00001f) && (AA_SIZE == 1.0f); - - // We should never hit this, because NewFrame() doesn't set ImDrawListFlags_AntiAliasedLinesUseTex unless ImFontAtlasFlags_NoBakedLines is off - IM_ASSERT_PARANOID(!use_texture || !(_Data->Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)); - - const int idx_count = use_texture ? (count * 6) : (thick_line ? count * 18 : count * 12); - const int vtx_count = use_texture ? (points_count * 2) : (thick_line ? points_count * 4 : points_count * 3); - PrimReserve(idx_count, vtx_count); - - // Temporary buffer - // The first items are normals at each line point, then after that there are either 2 or 4 temp points for each line point - ImVec2* temp_normals = (ImVec2*)alloca(points_count * ((use_texture || !thick_line) ? 3 : 5) * sizeof(ImVec2)); //-V630 - ImVec2* temp_points = temp_normals + points_count; - - // Calculate normals (tangents) for each line segment - for (int i1 = 0; i1 < count; i1++) - { - const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; - float dx = points[i2].x - points[i1].x; - float dy = points[i2].y - points[i1].y; - IM_NORMALIZE2F_OVER_ZERO(dx, dy); - temp_normals[i1].x = dy; - temp_normals[i1].y = -dx; - } - if (!closed) - temp_normals[points_count - 1] = temp_normals[points_count - 2]; - - // If we are drawing a one-pixel-wide line without a texture, or a textured line of any width, we only need 2 or 3 vertices per point - if (use_texture || !thick_line) - { - // [PATH 1] Texture-based lines (thick or non-thick) - // [PATH 2] Non texture-based lines (non-thick) - - // The width of the geometry we need to draw - this is essentially pixels for the line itself, plus "one pixel" for AA. - // - In the texture-based path, we don't use AA_SIZE here because the +1 is tied to the generated texture - // (see ImFontAtlasBuildRenderLinesTexData() function), and so alternate values won't work without changes to that code. - // - In the non texture-based paths, we would allow AA_SIZE to potentially be != 1.0f with a patch (e.g. fringe_scale patch to - // allow scaling geometry while preserving one-screen-pixel AA fringe). - const float half_draw_size = use_texture ? ((thickness * 0.5f) + 1) : AA_SIZE; - - // If line is not closed, the first and last points need to be generated differently as there are no normals to blend - if (!closed) - { - temp_points[0] = points[0] + temp_normals[0] * half_draw_size; - temp_points[1] = points[0] - temp_normals[0] * half_draw_size; - temp_points[(points_count-1)*2+0] = points[points_count-1] + temp_normals[points_count-1] * half_draw_size; - temp_points[(points_count-1)*2+1] = points[points_count-1] - temp_normals[points_count-1] * half_draw_size; - } - - // Generate the indices to form a number of triangles for each line segment, and the vertices for the line edges - // This takes points n and n+1 and writes into n+1, with the first point in a closed line being generated from the final one (as n+1 wraps) - // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. - unsigned int idx1 = _VtxCurrentIdx; // Vertex index for start of line segment - for (int i1 = 0; i1 < count; i1++) // i1 is the first point of the line segment - { - const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; // i2 is the second point of the line segment - const unsigned int idx2 = ((i1 + 1) == points_count) ? _VtxCurrentIdx : (idx1 + (use_texture ? 2 : 3)); // Vertex index for end of segment - - // Average normals - float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f; - float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f; - IM_FIXNORMAL2F(dm_x, dm_y); - dm_x *= half_draw_size; // dm_x, dm_y are offset to the outer edge of the AA area - dm_y *= half_draw_size; - - // Add temporary vertexes for the outer edges - ImVec2* out_vtx = &temp_points[i2 * 2]; - out_vtx[0].x = points[i2].x + dm_x; - out_vtx[0].y = points[i2].y + dm_y; - out_vtx[1].x = points[i2].x - dm_x; - out_vtx[1].y = points[i2].y - dm_y; - - if (use_texture) - { - // Add indices for two triangles - _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 1); // Right tri - _IdxWritePtr[3] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[4] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 0); // Left tri - _IdxWritePtr += 6; - } - else - { - // Add indexes for four triangles - _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 2); // Right tri 1 - _IdxWritePtr[3] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[4] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 0); // Right tri 2 - _IdxWritePtr[6] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[7] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[8] = (ImDrawIdx)(idx1 + 0); // Left tri 1 - _IdxWritePtr[9] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[10] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[11] = (ImDrawIdx)(idx2 + 1); // Left tri 2 - _IdxWritePtr += 12; - } - - idx1 = idx2; - } - - // Add vertexes for each point on the line - if (use_texture) - { - // If we're using textures we only need to emit the left/right edge vertices - ImVec4 tex_uvs = _Data->TexUvLines[integer_thickness]; - /*if (fractional_thickness != 0.0f) // Currently always zero when use_texture==false! - { - const ImVec4 tex_uvs_1 = _Data->TexUvLines[integer_thickness + 1]; - tex_uvs.x = tex_uvs.x + (tex_uvs_1.x - tex_uvs.x) * fractional_thickness; // inlined ImLerp() - tex_uvs.y = tex_uvs.y + (tex_uvs_1.y - tex_uvs.y) * fractional_thickness; - tex_uvs.z = tex_uvs.z + (tex_uvs_1.z - tex_uvs.z) * fractional_thickness; - tex_uvs.w = tex_uvs.w + (tex_uvs_1.w - tex_uvs.w) * fractional_thickness; - }*/ - ImVec2 tex_uv0(tex_uvs.x, tex_uvs.y); - ImVec2 tex_uv1(tex_uvs.z, tex_uvs.w); - for (int i = 0; i < points_count; i++) - { - _VtxWritePtr[0].pos = temp_points[i * 2 + 0]; _VtxWritePtr[0].uv = tex_uv0; _VtxWritePtr[0].col = col; // Left-side outer edge - _VtxWritePtr[1].pos = temp_points[i * 2 + 1]; _VtxWritePtr[1].uv = tex_uv1; _VtxWritePtr[1].col = col; // Right-side outer edge - _VtxWritePtr += 2; - } - } - else - { - // If we're not using a texture, we need the center vertex as well - for (int i = 0; i < points_count; i++) - { - _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col; // Center of line - _VtxWritePtr[1].pos = temp_points[i * 2 + 0]; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col_trans; // Left-side outer edge - _VtxWritePtr[2].pos = temp_points[i * 2 + 1]; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col_trans; // Right-side outer edge - _VtxWritePtr += 3; - } - } - } - else - { - // [PATH 2] Non texture-based lines (thick): we need to draw the solid line core and thus require four vertices per point - const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f; - - // If line is not closed, the first and last points need to be generated differently as there are no normals to blend - if (!closed) - { - const int points_last = points_count - 1; - temp_points[0] = points[0] + temp_normals[0] * (half_inner_thickness + AA_SIZE); - temp_points[1] = points[0] + temp_normals[0] * (half_inner_thickness); - temp_points[2] = points[0] - temp_normals[0] * (half_inner_thickness); - temp_points[3] = points[0] - temp_normals[0] * (half_inner_thickness + AA_SIZE); - temp_points[points_last * 4 + 0] = points[points_last] + temp_normals[points_last] * (half_inner_thickness + AA_SIZE); - temp_points[points_last * 4 + 1] = points[points_last] + temp_normals[points_last] * (half_inner_thickness); - temp_points[points_last * 4 + 2] = points[points_last] - temp_normals[points_last] * (half_inner_thickness); - temp_points[points_last * 4 + 3] = points[points_last] - temp_normals[points_last] * (half_inner_thickness + AA_SIZE); - } - - // Generate the indices to form a number of triangles for each line segment, and the vertices for the line edges - // This takes points n and n+1 and writes into n+1, with the first point in a closed line being generated from the final one (as n+1 wraps) - // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. - unsigned int idx1 = _VtxCurrentIdx; // Vertex index for start of line segment - for (int i1 = 0; i1 < count; i1++) // i1 is the first point of the line segment - { - const int i2 = (i1 + 1) == points_count ? 0 : (i1 + 1); // i2 is the second point of the line segment - const unsigned int idx2 = (i1 + 1) == points_count ? _VtxCurrentIdx : (idx1 + 4); // Vertex index for end of segment - - // Average normals - float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f; - float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f; - IM_FIXNORMAL2F(dm_x, dm_y); - float dm_out_x = dm_x * (half_inner_thickness + AA_SIZE); - float dm_out_y = dm_y * (half_inner_thickness + AA_SIZE); - float dm_in_x = dm_x * half_inner_thickness; - float dm_in_y = dm_y * half_inner_thickness; - - // Add temporary vertices - ImVec2* out_vtx = &temp_points[i2 * 4]; - out_vtx[0].x = points[i2].x + dm_out_x; - out_vtx[0].y = points[i2].y + dm_out_y; - out_vtx[1].x = points[i2].x + dm_in_x; - out_vtx[1].y = points[i2].y + dm_in_y; - out_vtx[2].x = points[i2].x - dm_in_x; - out_vtx[2].y = points[i2].y - dm_in_y; - out_vtx[3].x = points[i2].x - dm_out_x; - out_vtx[3].y = points[i2].y - dm_out_y; - - // Add indexes - _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 2); - _IdxWritePtr[3] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[4] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 1); - _IdxWritePtr[6] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[7] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[8] = (ImDrawIdx)(idx1 + 0); - _IdxWritePtr[9] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[10] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[11] = (ImDrawIdx)(idx2 + 1); - _IdxWritePtr[12] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[13] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[14] = (ImDrawIdx)(idx1 + 3); - _IdxWritePtr[15] = (ImDrawIdx)(idx1 + 3); _IdxWritePtr[16] = (ImDrawIdx)(idx2 + 3); _IdxWritePtr[17] = (ImDrawIdx)(idx2 + 2); - _IdxWritePtr += 18; - - idx1 = idx2; - } - - // Add vertices - for (int i = 0; i < points_count; i++) - { - _VtxWritePtr[0].pos = temp_points[i * 4 + 0]; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col_trans; - _VtxWritePtr[1].pos = temp_points[i * 4 + 1]; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos = temp_points[i * 4 + 2]; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos = temp_points[i * 4 + 3]; _VtxWritePtr[3].uv = opaque_uv; _VtxWritePtr[3].col = col_trans; - _VtxWritePtr += 4; - } - } - _VtxCurrentIdx += (ImDrawIdx)vtx_count; - } - else - { - // [PATH 4] Non texture-based, Non anti-aliased lines - const int idx_count = count * 6; - const int vtx_count = count * 4; // FIXME-OPT: Not sharing edges - PrimReserve(idx_count, vtx_count); - - for (int i1 = 0; i1 < count; i1++) - { - const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; - const ImVec2& p1 = points[i1]; - const ImVec2& p2 = points[i2]; - - float dx = p2.x - p1.x; - float dy = p2.y - p1.y; - IM_NORMALIZE2F_OVER_ZERO(dx, dy); - dx *= (thickness * 0.5f); - dy *= (thickness * 0.5f); - - _VtxWritePtr[0].pos.x = p1.x + dy; _VtxWritePtr[0].pos.y = p1.y - dx; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col; - _VtxWritePtr[1].pos.x = p2.x + dy; _VtxWritePtr[1].pos.y = p2.y - dx; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col; - _VtxWritePtr[2].pos.x = p2.x - dy; _VtxWritePtr[2].pos.y = p2.y + dx; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col; - _VtxWritePtr[3].pos.x = p1.x - dy; _VtxWritePtr[3].pos.y = p1.y + dx; _VtxWritePtr[3].uv = opaque_uv; _VtxWritePtr[3].col = col; - _VtxWritePtr += 4; - - _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + 1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + 2); - _IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx + 2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx + 3); - _IdxWritePtr += 6; - _VtxCurrentIdx += 4; - } - } -} - -// - We intentionally avoid using ImVec2 and its math operators here to reduce cost to a minimum for debug/non-inlined builds. -// - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. -void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_count, ImU32 col) -{ - if (points_count < 3) - return; - - const ImVec2 uv = _Data->TexUvWhitePixel; - - if (Flags & ImDrawListFlags_AntiAliasedFill) - { - // Anti-aliased Fill - const float AA_SIZE = _FringeScale; - const ImU32 col_trans = col & ~IM_COL32_A_MASK; - const int idx_count = (points_count - 2)*3 + points_count * 6; - const int vtx_count = (points_count * 2); - PrimReserve(idx_count, vtx_count); - - // Add indexes for fill - unsigned int vtx_inner_idx = _VtxCurrentIdx; - unsigned int vtx_outer_idx = _VtxCurrentIdx + 1; - for (int i = 2; i < points_count; i++) - { - _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + ((i - 1) << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx + (i << 1)); - _IdxWritePtr += 3; - } - - // Compute normals - ImVec2* temp_normals = (ImVec2*)alloca(points_count * sizeof(ImVec2)); //-V630 - for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) - { - const ImVec2& p0 = points[i0]; - const ImVec2& p1 = points[i1]; - float dx = p1.x - p0.x; - float dy = p1.y - p0.y; - IM_NORMALIZE2F_OVER_ZERO(dx, dy); - temp_normals[i0].x = dy; - temp_normals[i0].y = -dx; - } - - for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) - { - // Average normals - const ImVec2& n0 = temp_normals[i0]; - const ImVec2& n1 = temp_normals[i1]; - float dm_x = (n0.x + n1.x) * 0.5f; - float dm_y = (n0.y + n1.y) * 0.5f; - IM_FIXNORMAL2F(dm_x, dm_y); - dm_x *= AA_SIZE * 0.5f; - dm_y *= AA_SIZE * 0.5f; - - // Add vertices - _VtxWritePtr[0].pos.x = (points[i1].x - dm_x); _VtxWritePtr[0].pos.y = (points[i1].y - dm_y); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner - _VtxWritePtr[1].pos.x = (points[i1].x + dm_x); _VtxWritePtr[1].pos.y = (points[i1].y + dm_y); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer - _VtxWritePtr += 2; - - // Add indexes for fringes - _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (i0 << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); - _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx + (i1 << 1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); - _IdxWritePtr += 6; - } - _VtxCurrentIdx += (ImDrawIdx)vtx_count; - } - else - { - // Non Anti-aliased Fill - const int idx_count = (points_count - 2)*3; - const int vtx_count = points_count; - PrimReserve(idx_count, vtx_count); - for (int i = 0; i < vtx_count; i++) - { - _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; - _VtxWritePtr++; - } - for (int i = 2; i < points_count; i++) - { - _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + i - 1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + i); - _IdxWritePtr += 3; - } - _VtxCurrentIdx += (ImDrawIdx)vtx_count; - } -} - -void ImDrawList::_PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step) -{ - if (radius < 0.5f) - { - _Path.push_back(center); - return; - } - - // Calculate arc auto segment step size - if (a_step <= 0) - a_step = IM_DRAWLIST_ARCFAST_SAMPLE_MAX / _CalcCircleAutoSegmentCount(radius); - - // Make sure we never do steps larger than one quarter of the circle - a_step = ImClamp(a_step, 1, IM_DRAWLIST_ARCFAST_TABLE_SIZE / 4); - - const int sample_range = ImAbs(a_max_sample - a_min_sample); - const int a_next_step = a_step; - - int samples = sample_range + 1; - bool extra_max_sample = false; - if (a_step > 1) - { - samples = sample_range / a_step + 1; - const int overstep = sample_range % a_step; - - if (overstep > 0) - { - extra_max_sample = true; - samples++; - - // When we have overstep to avoid awkwardly looking one long line and one tiny one at the end, - // distribute first step range evenly between them by reducing first step size. - if (sample_range > 0) - a_step -= (a_step - overstep) / 2; - } - } - - _Path.resize(_Path.Size + samples); - ImVec2* out_ptr = _Path.Data + (_Path.Size - samples); - - int sample_index = a_min_sample; - if (sample_index < 0 || sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX) - { - sample_index = sample_index % IM_DRAWLIST_ARCFAST_SAMPLE_MAX; - if (sample_index < 0) - sample_index += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; - } - - if (a_max_sample >= a_min_sample) - { - for (int a = a_min_sample; a <= a_max_sample; a += a_step, sample_index += a_step, a_step = a_next_step) - { - // a_step is clamped to IM_DRAWLIST_ARCFAST_SAMPLE_MAX, so we have guaranteed that it will not wrap over range twice or more - if (sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX) - sample_index -= IM_DRAWLIST_ARCFAST_SAMPLE_MAX; - - const ImVec2 s = _Data->ArcFastVtx[sample_index]; - out_ptr->x = center.x + s.x * radius; - out_ptr->y = center.y + s.y * radius; - out_ptr++; - } - } - else - { - for (int a = a_min_sample; a >= a_max_sample; a -= a_step, sample_index -= a_step, a_step = a_next_step) - { - // a_step is clamped to IM_DRAWLIST_ARCFAST_SAMPLE_MAX, so we have guaranteed that it will not wrap over range twice or more - if (sample_index < 0) - sample_index += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; - - const ImVec2 s = _Data->ArcFastVtx[sample_index]; - out_ptr->x = center.x + s.x * radius; - out_ptr->y = center.y + s.y * radius; - out_ptr++; - } - } - - if (extra_max_sample) - { - int normalized_max_sample = a_max_sample % IM_DRAWLIST_ARCFAST_SAMPLE_MAX; - if (normalized_max_sample < 0) - normalized_max_sample += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; - - const ImVec2 s = _Data->ArcFastVtx[normalized_max_sample]; - out_ptr->x = center.x + s.x * radius; - out_ptr->y = center.y + s.y * radius; - out_ptr++; - } - - IM_ASSERT_PARANOID(_Path.Data + _Path.Size == out_ptr); -} - -void ImDrawList::_PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments) -{ - if (radius < 0.5f) - { - _Path.push_back(center); - return; - } - - // Note that we are adding a point at both a_min and a_max. - // If you are trying to draw a full closed circle you don't want the overlapping points! - _Path.reserve(_Path.Size + (num_segments + 1)); - for (int i = 0; i <= num_segments; i++) - { - const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min); - _Path.push_back(ImVec2(center.x + ImCos(a) * radius, center.y + ImSin(a) * radius)); - } -} - -// 0: East, 3: South, 6: West, 9: North, 12: East -void ImDrawList::PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12) -{ - if (radius < 0.5f) - { - _Path.push_back(center); - return; - } - _PathArcToFastEx(center, radius, a_min_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12, a_max_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12, 0); -} - -void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments) -{ - if (radius < 0.5f) - { - _Path.push_back(center); - return; - } - - if (num_segments > 0) - { - _PathArcToN(center, radius, a_min, a_max, num_segments); - return; - } - - // Automatic segment count - if (radius <= _Data->ArcFastRadiusCutoff) - { - const bool a_is_reverse = a_max < a_min; - - // We are going to use precomputed values for mid samples. - // Determine first and last sample in lookup table that belong to the arc. - const float a_min_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_min / (IM_PI * 2.0f); - const float a_max_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_max / (IM_PI * 2.0f); - - const int a_min_sample = a_is_reverse ? (int)ImFloorSigned(a_min_sample_f) : (int)ImCeil(a_min_sample_f); - const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloorSigned(a_max_sample_f); - const int a_mid_samples = a_is_reverse ? ImMax(a_min_sample - a_max_sample, 0) : ImMax(a_max_sample - a_min_sample, 0); - - const float a_min_segment_angle = a_min_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; - const float a_max_segment_angle = a_max_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; - const bool a_emit_start = ImAbs(a_min_segment_angle - a_min) >= 1e-5f; - const bool a_emit_end = ImAbs(a_max - a_max_segment_angle) >= 1e-5f; - - _Path.reserve(_Path.Size + (a_mid_samples + 1 + (a_emit_start ? 1 : 0) + (a_emit_end ? 1 : 0))); - if (a_emit_start) - _Path.push_back(ImVec2(center.x + ImCos(a_min) * radius, center.y + ImSin(a_min) * radius)); - if (a_mid_samples > 0) - _PathArcToFastEx(center, radius, a_min_sample, a_max_sample, 0); - if (a_emit_end) - _Path.push_back(ImVec2(center.x + ImCos(a_max) * radius, center.y + ImSin(a_max) * radius)); - } - else - { - const float arc_length = ImAbs(a_max - a_min); - const int circle_segment_count = _CalcCircleAutoSegmentCount(radius); - const int arc_segment_count = ImMax((int)ImCeil(circle_segment_count * arc_length / (IM_PI * 2.0f)), (int)(2.0f * IM_PI / arc_length)); - _PathArcToN(center, radius, a_min, a_max, arc_segment_count); - } -} - -ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t) -{ - float u = 1.0f - t; - float w1 = u * u * u; - float w2 = 3 * u * u * t; - float w3 = 3 * u * t * t; - float w4 = t * t * t; - return ImVec2(w1 * p1.x + w2 * p2.x + w3 * p3.x + w4 * p4.x, w1 * p1.y + w2 * p2.y + w3 * p3.y + w4 * p4.y); -} - -ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t) -{ - float u = 1.0f - t; - float w1 = u * u; - float w2 = 2 * u * t; - float w3 = t * t; - return ImVec2(w1 * p1.x + w2 * p2.x + w3 * p3.x, w1 * p1.y + w2 * p2.y + w3 * p3.y); -} - -// Closely mimics ImBezierCubicClosestPointCasteljau() in imgui.cpp -static void PathBezierCubicCurveToCasteljau(ImVector* path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) -{ - float dx = x4 - x1; - float dy = y4 - y1; - float d2 = (x2 - x4) * dy - (y2 - y4) * dx; - float d3 = (x3 - x4) * dy - (y3 - y4) * dx; - d2 = (d2 >= 0) ? d2 : -d2; - d3 = (d3 >= 0) ? d3 : -d3; - if ((d2 + d3) * (d2 + d3) < tess_tol * (dx * dx + dy * dy)) - { - path->push_back(ImVec2(x4, y4)); - } - else if (level < 10) - { - float x12 = (x1 + x2) * 0.5f, y12 = (y1 + y2) * 0.5f; - float x23 = (x2 + x3) * 0.5f, y23 = (y2 + y3) * 0.5f; - float x34 = (x3 + x4) * 0.5f, y34 = (y3 + y4) * 0.5f; - float x123 = (x12 + x23) * 0.5f, y123 = (y12 + y23) * 0.5f; - float x234 = (x23 + x34) * 0.5f, y234 = (y23 + y34) * 0.5f; - float x1234 = (x123 + x234) * 0.5f, y1234 = (y123 + y234) * 0.5f; - PathBezierCubicCurveToCasteljau(path, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1); - PathBezierCubicCurveToCasteljau(path, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1); - } -} - -static void PathBezierQuadraticCurveToCasteljau(ImVector* path, float x1, float y1, float x2, float y2, float x3, float y3, float tess_tol, int level) -{ - float dx = x3 - x1, dy = y3 - y1; - float det = (x2 - x3) * dy - (y2 - y3) * dx; - if (det * det * 4.0f < tess_tol * (dx * dx + dy * dy)) - { - path->push_back(ImVec2(x3, y3)); - } - else if (level < 10) - { - float x12 = (x1 + x2) * 0.5f, y12 = (y1 + y2) * 0.5f; - float x23 = (x2 + x3) * 0.5f, y23 = (y2 + y3) * 0.5f; - float x123 = (x12 + x23) * 0.5f, y123 = (y12 + y23) * 0.5f; - PathBezierQuadraticCurveToCasteljau(path, x1, y1, x12, y12, x123, y123, tess_tol, level + 1); - PathBezierQuadraticCurveToCasteljau(path, x123, y123, x23, y23, x3, y3, tess_tol, level + 1); - } -} - -void ImDrawList::PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments) -{ - ImVec2 p1 = _Path.back(); - if (num_segments == 0) - { - PathBezierCubicCurveToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, _Data->CurveTessellationTol, 0); // Auto-tessellated - } - else - { - float t_step = 1.0f / (float)num_segments; - for (int i_step = 1; i_step <= num_segments; i_step++) - _Path.push_back(ImBezierCubicCalc(p1, p2, p3, p4, t_step * i_step)); - } -} - -void ImDrawList::PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments) -{ - ImVec2 p1 = _Path.back(); - if (num_segments == 0) - { - PathBezierQuadraticCurveToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, _Data->CurveTessellationTol, 0);// Auto-tessellated - } - else - { - float t_step = 1.0f / (float)num_segments; - for (int i_step = 1; i_step <= num_segments; i_step++) - _Path.push_back(ImBezierQuadraticCalc(p1, p2, p3, t_step * i_step)); - } -} - -IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4)); -static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags) -{ -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - // Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All) - // ~0 --> ImDrawFlags_RoundCornersAll or 0 - if (flags == ~0) - return ImDrawFlags_RoundCornersAll; - - // Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations) - // 0x01 --> ImDrawFlags_RoundCornersTopLeft (VALUE 0x01 OVERLAPS ImDrawFlags_Closed but ImDrawFlags_Closed is never valid in this path!) - // 0x02 --> ImDrawFlags_RoundCornersTopRight - // 0x03 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight - // 0x04 --> ImDrawFlags_RoundCornersBotLeft - // 0x05 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBotLeft - // ... - // 0x0F --> ImDrawFlags_RoundCornersAll or 0 - // (See all values in ImDrawCornerFlags_) - if (flags >= 0x01 && flags <= 0x0F) - return (flags << 4); - - // We cannot support hard coded 0x00 with 'float rounding > 0.0f' --> replace with ImDrawFlags_RoundCornersNone or use 'float rounding = 0.0f' -#endif - - // If this triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values. - // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc... - IM_ASSERT((flags & 0x0F) == 0 && "Misuse of legacy hardcoded ImDrawCornerFlags values!"); - - if ((flags & ImDrawFlags_RoundCornersMask_) == 0) - flags |= ImDrawFlags_RoundCornersAll; - - return flags; -} - -void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawFlags flags) -{ - flags = FixRectCornerFlags(flags); - rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f ) - 1.0f); - rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f ) - 1.0f); - - if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) - { - PathLineTo(a); - PathLineTo(ImVec2(b.x, a.y)); - PathLineTo(b); - PathLineTo(ImVec2(a.x, b.y)); - } - else - { - const float rounding_tl = (flags & ImDrawFlags_RoundCornersTopLeft) ? rounding : 0.0f; - const float rounding_tr = (flags & ImDrawFlags_RoundCornersTopRight) ? rounding : 0.0f; - const float rounding_br = (flags & ImDrawFlags_RoundCornersBottomRight) ? rounding : 0.0f; - const float rounding_bl = (flags & ImDrawFlags_RoundCornersBottomLeft) ? rounding : 0.0f; - PathArcToFast(ImVec2(a.x + rounding_tl, a.y + rounding_tl), rounding_tl, 6, 9); - PathArcToFast(ImVec2(b.x - rounding_tr, a.y + rounding_tr), rounding_tr, 9, 12); - PathArcToFast(ImVec2(b.x - rounding_br, b.y - rounding_br), rounding_br, 0, 3); - PathArcToFast(ImVec2(a.x + rounding_bl, b.y - rounding_bl), rounding_bl, 3, 6); - } -} - -void ImDrawList::AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - PathLineTo(p1 + ImVec2(0.5f, 0.5f)); - PathLineTo(p2 + ImVec2(0.5f, 0.5f)); - PathStroke(col, 0, thickness); -} - -// p_min = upper-left, p_max = lower-right -// Note we don't render 1 pixels sized rectangles properly. -void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawFlags flags, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - if (Flags & ImDrawListFlags_AntiAliasedLines) - PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.50f, 0.50f), rounding, flags); - else - PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.49f, 0.49f), rounding, flags); // Better looking lower-right corner and rounded non-AA shapes. - PathStroke(col, ImDrawFlags_Closed, thickness); -} - -void ImDrawList::AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawFlags flags) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) - { - PrimReserve(6, 4); - PrimRect(p_min, p_max, col); - } - else - { - PathRect(p_min, p_max, rounding, flags); - PathFillConvex(col); - } -} - -// p_min = upper-left, p_max = lower-right -void ImDrawList::AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left) -{ - if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0) - return; - - const ImVec2 uv = _Data->TexUvWhitePixel; - PrimReserve(6, 4); - PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 2)); - PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 3)); - PrimWriteVtx(p_min, uv, col_upr_left); - PrimWriteVtx(ImVec2(p_max.x, p_min.y), uv, col_upr_right); - PrimWriteVtx(p_max, uv, col_bot_right); - PrimWriteVtx(ImVec2(p_min.x, p_max.y), uv, col_bot_left); -} - -void ImDrawList::AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(p1); - PathLineTo(p2); - PathLineTo(p3); - PathLineTo(p4); - PathStroke(col, ImDrawFlags_Closed, thickness); -} - -void ImDrawList::AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(p1); - PathLineTo(p2); - PathLineTo(p3); - PathLineTo(p4); - PathFillConvex(col); -} - -void ImDrawList::AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(p1); - PathLineTo(p2); - PathLineTo(p3); - PathStroke(col, ImDrawFlags_Closed, thickness); -} - -void ImDrawList::AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(p1); - PathLineTo(p2); - PathLineTo(p3); - PathFillConvex(col); -} - -void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0 || radius < 0.5f) - return; - - if (num_segments <= 0) - { - // Use arc with automatic segment count - _PathArcToFastEx(center, radius - 0.5f, 0, IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0); - _Path.Size--; - } - else - { - // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes) - num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX); - - // Because we are filling a closed shape we remove 1 from the count of segments/points - const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; - PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1); - } - - PathStroke(col, ImDrawFlags_Closed, thickness); -} - -void ImDrawList::AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments) -{ - if ((col & IM_COL32_A_MASK) == 0 || radius < 0.5f) - return; - - if (num_segments <= 0) - { - // Use arc with automatic segment count - _PathArcToFastEx(center, radius, 0, IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0); - _Path.Size--; - } - else - { - // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes) - num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX); - - // Because we are filling a closed shape we remove 1 from the count of segments/points - const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; - PathArcTo(center, radius, 0.0f, a_max, num_segments - 1); - } - - PathFillConvex(col); -} - -// Guaranteed to honor 'num_segments' -void ImDrawList::AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness) -{ - if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2) - return; - - // Because we are filling a closed shape we remove 1 from the count of segments/points - const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; - PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1); - PathStroke(col, ImDrawFlags_Closed, thickness); -} - -// Guaranteed to honor 'num_segments' -void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments) -{ - if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2) - return; - - // Because we are filling a closed shape we remove 1 from the count of segments/points - const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; - PathArcTo(center, radius, 0.0f, a_max, num_segments - 1); - PathFillConvex(col); -} - -// Cubic Bezier takes 4 controls points -void ImDrawList::AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(p1); - PathBezierCubicCurveTo(p2, p3, p4, num_segments); - PathStroke(col, 0, thickness); -} - -// Quadratic Bezier takes 3 controls points -void ImDrawList::AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - PathLineTo(p1); - PathBezierQuadraticCurveTo(p2, p3, num_segments); - PathStroke(col, 0, thickness); -} - -void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - if (text_end == NULL) - text_end = text_begin + strlen(text_begin); - if (text_begin == text_end) - return; - - // Pull default font/size from the shared ImDrawListSharedData instance - if (font == NULL) - font = _Data->Font; - if (font_size == 0.0f) - font_size = _Data->FontSize; - - IM_ASSERT(font->ContainerAtlas->TexID == _CmdHeader.TextureId); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font. - - ImVec4 clip_rect = _CmdHeader.ClipRect; - if (cpu_fine_clip_rect) - { - clip_rect.x = ImMax(clip_rect.x, cpu_fine_clip_rect->x); - clip_rect.y = ImMax(clip_rect.y, cpu_fine_clip_rect->y); - clip_rect.z = ImMin(clip_rect.z, cpu_fine_clip_rect->z); - clip_rect.w = ImMin(clip_rect.w, cpu_fine_clip_rect->w); - } - font->RenderText(this, font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect != NULL); -} - -void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end) -{ - AddText(NULL, 0.0f, pos, col, text_begin, text_end); -} - -void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; - if (push_texture_id) - PushTextureID(user_texture_id); - - PrimReserve(6, 4); - PrimRectUV(p_min, p_max, uv_min, uv_max, col); - - if (push_texture_id) - PopTextureID(); -} - -void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1, const ImVec2& uv2, const ImVec2& uv3, const ImVec2& uv4, ImU32 col) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; - if (push_texture_id) - PushTextureID(user_texture_id); - - PrimReserve(6, 4); - PrimQuadUV(p1, p2, p3, p4, uv1, uv2, uv3, uv4, col); - - if (push_texture_id) - PopTextureID(); -} - -void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags) -{ - if ((col & IM_COL32_A_MASK) == 0) - return; - - flags = FixRectCornerFlags(flags); - if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) - { - AddImage(user_texture_id, p_min, p_max, uv_min, uv_max, col); - return; - } - - const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; - if (push_texture_id) - PushTextureID(user_texture_id); - - int vert_start_idx = VtxBuffer.Size; - PathRect(p_min, p_max, rounding, flags); - PathFillConvex(col); - int vert_end_idx = VtxBuffer.Size; - ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, p_min, p_max, uv_min, uv_max, true); - - if (push_texture_id) - PopTextureID(); -} - - -//----------------------------------------------------------------------------- -// [SECTION] ImDrawListSplitter -//----------------------------------------------------------------------------- -// FIXME: This may be a little confusing, trying to be a little too low-level/optimal instead of just doing vector swap.. -//----------------------------------------------------------------------------- - -void ImDrawListSplitter::ClearFreeMemory() -{ - for (int i = 0; i < _Channels.Size; i++) - { - if (i == _Current) - memset(&_Channels[i], 0, sizeof(_Channels[i])); // Current channel is a copy of CmdBuffer/IdxBuffer, don't destruct again - _Channels[i]._CmdBuffer.clear(); - _Channels[i]._IdxBuffer.clear(); - } - _Current = 0; - _Count = 1; - _Channels.clear(); -} - -void ImDrawListSplitter::Split(ImDrawList* draw_list, int channels_count) -{ - IM_UNUSED(draw_list); - IM_ASSERT(_Current == 0 && _Count <= 1 && "Nested channel splitting is not supported. Please use separate instances of ImDrawListSplitter."); - int old_channels_count = _Channels.Size; - if (old_channels_count < channels_count) - { - _Channels.reserve(channels_count); // Avoid over reserving since this is likely to stay stable - _Channels.resize(channels_count); - } - _Count = channels_count; - - // Channels[] (24/32 bytes each) hold storage that we'll swap with draw_list->_CmdBuffer/_IdxBuffer - // The content of Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to. - // When we switch to the next channel, we'll copy draw_list->_CmdBuffer/_IdxBuffer into Channels[0] and then Channels[1] into draw_list->CmdBuffer/_IdxBuffer - memset(&_Channels[0], 0, sizeof(ImDrawChannel)); - for (int i = 1; i < channels_count; i++) - { - if (i >= old_channels_count) - { - IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel(); - } - else - { - _Channels[i]._CmdBuffer.resize(0); - _Channels[i]._IdxBuffer.resize(0); - } - } -} - -void ImDrawListSplitter::Merge(ImDrawList* draw_list) -{ - // Note that we never use or rely on _Channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use. - if (_Count <= 1) - return; - - SetCurrentChannel(draw_list, 0); - draw_list->_PopUnusedDrawCmd(); - - // Calculate our final buffer sizes. Also fix the incorrect IdxOffset values in each command. - int new_cmd_buffer_count = 0; - int new_idx_buffer_count = 0; - ImDrawCmd* last_cmd = (_Count > 0 && draw_list->CmdBuffer.Size > 0) ? &draw_list->CmdBuffer.back() : NULL; - int idx_offset = last_cmd ? last_cmd->IdxOffset + last_cmd->ElemCount : 0; - for (int i = 1; i < _Count; i++) - { - ImDrawChannel& ch = _Channels[i]; - if (ch._CmdBuffer.Size > 0 && ch._CmdBuffer.back().ElemCount == 0 && ch._CmdBuffer.back().UserCallback == NULL) // Equivalent of PopUnusedDrawCmd() - ch._CmdBuffer.pop_back(); - - if (ch._CmdBuffer.Size > 0 && last_cmd != NULL) - { - // Do not include ImDrawCmd_AreSequentialIdxOffset() in the compare as we rebuild IdxOffset values ourselves. - // Manipulating IdxOffset (e.g. by reordering draw commands like done by RenderDimmedBackgroundBehindWindow()) is not supported within a splitter. - ImDrawCmd* next_cmd = &ch._CmdBuffer[0]; - if (ImDrawCmd_HeaderCompare(last_cmd, next_cmd) == 0 && last_cmd->UserCallback == NULL && next_cmd->UserCallback == NULL) - { - // Merge previous channel last draw command with current channel first draw command if matching. - last_cmd->ElemCount += next_cmd->ElemCount; - idx_offset += next_cmd->ElemCount; - ch._CmdBuffer.erase(ch._CmdBuffer.Data); // FIXME-OPT: Improve for multiple merges. - } - } - if (ch._CmdBuffer.Size > 0) - last_cmd = &ch._CmdBuffer.back(); - new_cmd_buffer_count += ch._CmdBuffer.Size; - new_idx_buffer_count += ch._IdxBuffer.Size; - for (int cmd_n = 0; cmd_n < ch._CmdBuffer.Size; cmd_n++) - { - ch._CmdBuffer.Data[cmd_n].IdxOffset = idx_offset; - idx_offset += ch._CmdBuffer.Data[cmd_n].ElemCount; - } - } - draw_list->CmdBuffer.resize(draw_list->CmdBuffer.Size + new_cmd_buffer_count); - draw_list->IdxBuffer.resize(draw_list->IdxBuffer.Size + new_idx_buffer_count); - - // Write commands and indices in order (they are fairly small structures, we don't copy vertices only indices) - ImDrawCmd* cmd_write = draw_list->CmdBuffer.Data + draw_list->CmdBuffer.Size - new_cmd_buffer_count; - ImDrawIdx* idx_write = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size - new_idx_buffer_count; - for (int i = 1; i < _Count; i++) - { - ImDrawChannel& ch = _Channels[i]; - if (int sz = ch._CmdBuffer.Size) { memcpy(cmd_write, ch._CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; } - if (int sz = ch._IdxBuffer.Size) { memcpy(idx_write, ch._IdxBuffer.Data, sz * sizeof(ImDrawIdx)); idx_write += sz; } - } - draw_list->_IdxWritePtr = idx_write; - - // Ensure there's always a non-callback draw command trailing the command-buffer - if (draw_list->CmdBuffer.Size == 0 || draw_list->CmdBuffer.back().UserCallback != NULL) - draw_list->AddDrawCmd(); - - // If current command is used with different settings we need to add a new command - ImDrawCmd* curr_cmd = &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1]; - if (curr_cmd->ElemCount == 0) - ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset - else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0) - draw_list->AddDrawCmd(); - - _Count = 1; -} - -void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx) -{ - IM_ASSERT(idx >= 0 && idx < _Count); - if (_Current == idx) - return; - - // Overwrite ImVector (12/16 bytes), four times. This is merely a silly optimization instead of doing .swap() - memcpy(&_Channels.Data[_Current]._CmdBuffer, &draw_list->CmdBuffer, sizeof(draw_list->CmdBuffer)); - memcpy(&_Channels.Data[_Current]._IdxBuffer, &draw_list->IdxBuffer, sizeof(draw_list->IdxBuffer)); - _Current = idx; - memcpy(&draw_list->CmdBuffer, &_Channels.Data[idx]._CmdBuffer, sizeof(draw_list->CmdBuffer)); - memcpy(&draw_list->IdxBuffer, &_Channels.Data[idx]._IdxBuffer, sizeof(draw_list->IdxBuffer)); - draw_list->_IdxWritePtr = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size; - - // If current command is used with different settings we need to add a new command - ImDrawCmd* curr_cmd = (draw_list->CmdBuffer.Size == 0) ? NULL : &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1]; - if (curr_cmd == NULL) - draw_list->AddDrawCmd(); - else if (curr_cmd->ElemCount == 0) - ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset - else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0) - draw_list->AddDrawCmd(); -} - -//----------------------------------------------------------------------------- -// [SECTION] ImDrawData -//----------------------------------------------------------------------------- - -// For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! -void ImDrawData::DeIndexAllBuffers() -{ - ImVector new_vtx_buffer; - TotalVtxCount = TotalIdxCount = 0; - for (int i = 0; i < CmdListsCount; i++) - { - ImDrawList* cmd_list = CmdLists[i]; - if (cmd_list->IdxBuffer.empty()) - continue; - new_vtx_buffer.resize(cmd_list->IdxBuffer.Size); - for (int j = 0; j < cmd_list->IdxBuffer.Size; j++) - new_vtx_buffer[j] = cmd_list->VtxBuffer[cmd_list->IdxBuffer[j]]; - cmd_list->VtxBuffer.swap(new_vtx_buffer); - cmd_list->IdxBuffer.resize(0); - TotalVtxCount += cmd_list->VtxBuffer.Size; - } -} - -// Helper to scale the ClipRect field of each ImDrawCmd. -// Use if your final output buffer is at a different scale than draw_data->DisplaySize, -// or if there is a difference between your window resolution and framebuffer resolution. -void ImDrawData::ScaleClipRects(const ImVec2& fb_scale) -{ - for (int i = 0; i < CmdListsCount; i++) - { - ImDrawList* cmd_list = CmdLists[i]; - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) - { - ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i]; - cmd->ClipRect = ImVec4(cmd->ClipRect.x * fb_scale.x, cmd->ClipRect.y * fb_scale.y, cmd->ClipRect.z * fb_scale.x, cmd->ClipRect.w * fb_scale.y); - } - } -} - -//----------------------------------------------------------------------------- -// [SECTION] Helpers ShadeVertsXXX functions -//----------------------------------------------------------------------------- - -// Generic linear color gradient, write to RGB fields, leave A untouched. -void ImGui::ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1) -{ - ImVec2 gradient_extent = gradient_p1 - gradient_p0; - float gradient_inv_length2 = 1.0f / ImLengthSqr(gradient_extent); - ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; - ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; - const int col0_r = (int)(col0 >> IM_COL32_R_SHIFT) & 0xFF; - const int col0_g = (int)(col0 >> IM_COL32_G_SHIFT) & 0xFF; - const int col0_b = (int)(col0 >> IM_COL32_B_SHIFT) & 0xFF; - const int col_delta_r = ((int)(col1 >> IM_COL32_R_SHIFT) & 0xFF) - col0_r; - const int col_delta_g = ((int)(col1 >> IM_COL32_G_SHIFT) & 0xFF) - col0_g; - const int col_delta_b = ((int)(col1 >> IM_COL32_B_SHIFT) & 0xFF) - col0_b; - for (ImDrawVert* vert = vert_start; vert < vert_end; vert++) - { - float d = ImDot(vert->pos - gradient_p0, gradient_extent); - float t = ImClamp(d * gradient_inv_length2, 0.0f, 1.0f); - int r = (int)(col0_r + col_delta_r * t); - int g = (int)(col0_g + col_delta_g * t); - int b = (int)(col0_b + col_delta_b * t); - vert->col = (r << IM_COL32_R_SHIFT) | (g << IM_COL32_G_SHIFT) | (b << IM_COL32_B_SHIFT) | (vert->col & IM_COL32_A_MASK); - } -} - -// Distribute UV over (a, b) rectangle -void ImGui::ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp) -{ - const ImVec2 size = b - a; - const ImVec2 uv_size = uv_b - uv_a; - const ImVec2 scale = ImVec2( - size.x != 0.0f ? (uv_size.x / size.x) : 0.0f, - size.y != 0.0f ? (uv_size.y / size.y) : 0.0f); - - ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; - ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; - if (clamp) - { - const ImVec2 min = ImMin(uv_a, uv_b); - const ImVec2 max = ImMax(uv_a, uv_b); - for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) - vertex->uv = ImClamp(uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale), min, max); - } - else - { - for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) - vertex->uv = uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale); - } -} - -//----------------------------------------------------------------------------- -// [SECTION] ImFontConfig -//----------------------------------------------------------------------------- - -ImFontConfig::ImFontConfig() -{ - memset(this, 0, sizeof(*this)); - FontDataOwnedByAtlas = true; - OversampleH = 3; // FIXME: 2 may be a better default? - OversampleV = 1; - GlyphMaxAdvanceX = FLT_MAX; - RasterizerMultiply = 1.0f; - EllipsisChar = (ImWchar)-1; -} - -//----------------------------------------------------------------------------- -// [SECTION] ImFontAtlas -//----------------------------------------------------------------------------- - -// A work of art lies ahead! (. = white layer, X = black layer, others are blank) -// The 2x2 white texels on the top left are the ones we'll use everywhere in Dear ImGui to render filled shapes. -// (This is used when io.MouseDrawCursor = true) -const int FONT_ATLAS_DEFAULT_TEX_DATA_W = 122; // Actual texture will be 2 times that + 1 spacing. -const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27; -static const char FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[FONT_ATLAS_DEFAULT_TEX_DATA_W * FONT_ATLAS_DEFAULT_TEX_DATA_H + 1] = -{ - "..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX- XX - XX XX " - "..- -X.....X- X.X - X.X -X.....X - X.....X- X..X -X..X X..X" - "--- -XXX.XXX- X...X - X...X -X....X - X....X- X..X -X...X X...X" - "X - X.X - X.....X - X.....X -X...X - X...X- X..X - X...X X...X " - "XX - X.X -X.......X- X.......X -X..X.X - X.X..X- X..X - X...X...X " - "X.X - X.X -XXXX.XXXX- XXXX.XXXX -X.X X.X - X.X X.X- X..XXX - X.....X " - "X..X - X.X - X.X - X.X -XX X.X - X.X XX- X..X..XXX - X...X " - "X...X - X.X - X.X - XX X.X XX - X.X - X.X - X..X..X..XX - X.X " - "X....X - X.X - X.X - X.X X.X X.X - X.X - X.X - X..X..X..X.X - X...X " - "X.....X - X.X - X.X - X..X X.X X..X - X.X - X.X -XXX X..X..X..X..X- X.....X " - "X......X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X XX-XX X.X -X..XX........X..X- X...X...X " - "X.......X - X.X - X.X -X.....................X- X.X X.X-X.X X.X -X...X...........X- X...X X...X " - "X........X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X..X-X..X.X - X..............X-X...X X...X" - "X.........X -XXX.XXX- X.X - X..X X.X X..X - X...X-X...X - X.............X-X..X X..X" - "X..........X-X.....X- X.X - X.X X.X X.X - X....X-X....X - X.............X- XX XX " - "X......XXXXX-XXXXXXX- X.X - XX X.X XX - X.....X-X.....X - X............X--------------" - "X...X..X --------- X.X - X.X - XXXXXXX-XXXXXXX - X...........X - " - "X..X X..X - -XXXX.XXXX- XXXX.XXXX ------------------------------------- X..........X - " - "X.X X..X - -X.......X- X.......X - XX XX - - X..........X - " - "XX X..X - - X.....X - X.....X - X.X X.X - - X........X - " - " X..X - - X...X - X...X - X..X X..X - - X........X - " - " XX - - X.X - X.X - X...XXXXXXXXXXXXX...X - - XXXXXXXXXX - " - "------------- - X - X -X.....................X- ------------------- " - " ----------------------------------- X...XXXXXXXXXXXXX...X - " - " - X..X X..X - " - " - X.X X.X - " - " - XX XX - " -}; - -static const ImVec2 FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ImGuiMouseCursor_COUNT][3] = -{ - // Pos ........ Size ......... Offset ...... - { ImVec2( 0,3), ImVec2(12,19), ImVec2( 0, 0) }, // ImGuiMouseCursor_Arrow - { ImVec2(13,0), ImVec2( 7,16), ImVec2( 1, 8) }, // ImGuiMouseCursor_TextInput - { ImVec2(31,0), ImVec2(23,23), ImVec2(11,11) }, // ImGuiMouseCursor_ResizeAll - { ImVec2(21,0), ImVec2( 9,23), ImVec2( 4,11) }, // ImGuiMouseCursor_ResizeNS - { ImVec2(55,18),ImVec2(23, 9), ImVec2(11, 4) }, // ImGuiMouseCursor_ResizeEW - { ImVec2(73,0), ImVec2(17,17), ImVec2( 8, 8) }, // ImGuiMouseCursor_ResizeNESW - { ImVec2(55,0), ImVec2(17,17), ImVec2( 8, 8) }, // ImGuiMouseCursor_ResizeNWSE - { ImVec2(91,0), ImVec2(17,22), ImVec2( 5, 0) }, // ImGuiMouseCursor_Hand - { ImVec2(109,0),ImVec2(13,15), ImVec2( 6, 7) }, // ImGuiMouseCursor_NotAllowed -}; - -ImFontAtlas::ImFontAtlas() -{ - memset(this, 0, sizeof(*this)); - TexGlyphPadding = 1; - PackIdMouseCursors = PackIdLines = -1; -} - -ImFontAtlas::~ImFontAtlas() -{ - IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - Clear(); -} - -void ImFontAtlas::ClearInputData() -{ - IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - for (int i = 0; i < ConfigData.Size; i++) - if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas) - { - IM_FREE(ConfigData[i].FontData); - ConfigData[i].FontData = NULL; - } - - // When clearing this we lose access to the font name and other information used to build the font. - for (int i = 0; i < Fonts.Size; i++) - if (Fonts[i]->ConfigData >= ConfigData.Data && Fonts[i]->ConfigData < ConfigData.Data + ConfigData.Size) - { - Fonts[i]->ConfigData = NULL; - Fonts[i]->ConfigDataCount = 0; - } - ConfigData.clear(); - CustomRects.clear(); - PackIdMouseCursors = PackIdLines = -1; - // Important: we leave TexReady untouched -} - -void ImFontAtlas::ClearTexData() -{ - IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - if (TexPixelsAlpha8) - IM_FREE(TexPixelsAlpha8); - if (TexPixelsRGBA32) - IM_FREE(TexPixelsRGBA32); - TexPixelsAlpha8 = NULL; - TexPixelsRGBA32 = NULL; - TexPixelsUseColors = false; - // Important: we leave TexReady untouched -} - -void ImFontAtlas::ClearFonts() -{ - IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - Fonts.clear_delete(); - TexReady = false; -} - -void ImFontAtlas::Clear() -{ - ClearInputData(); - ClearTexData(); - ClearFonts(); -} - -void ImFontAtlas::GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel) -{ - // Build atlas on demand - if (TexPixelsAlpha8 == NULL) - Build(); - - *out_pixels = TexPixelsAlpha8; - if (out_width) *out_width = TexWidth; - if (out_height) *out_height = TexHeight; - if (out_bytes_per_pixel) *out_bytes_per_pixel = 1; -} - -void ImFontAtlas::GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel) -{ - // Convert to RGBA32 format on demand - // Although it is likely to be the most commonly used format, our font rendering is 1 channel / 8 bpp - if (!TexPixelsRGBA32) - { - unsigned char* pixels = NULL; - GetTexDataAsAlpha8(&pixels, NULL, NULL); - if (pixels) - { - TexPixelsRGBA32 = (unsigned int*)IM_ALLOC((size_t)TexWidth * (size_t)TexHeight * 4); - const unsigned char* src = pixels; - unsigned int* dst = TexPixelsRGBA32; - for (int n = TexWidth * TexHeight; n > 0; n--) - *dst++ = IM_COL32(255, 255, 255, (unsigned int)(*src++)); - } - } - - *out_pixels = (unsigned char*)TexPixelsRGBA32; - if (out_width) *out_width = TexWidth; - if (out_height) *out_height = TexHeight; - if (out_bytes_per_pixel) *out_bytes_per_pixel = 4; -} - -ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg) -{ - IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0); - IM_ASSERT(font_cfg->SizePixels > 0.0f); - - // Create new font - if (!font_cfg->MergeMode) - Fonts.push_back(IM_NEW(ImFont)); - else - IM_ASSERT(!Fonts.empty() && "Cannot use MergeMode for the first font"); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font. - - ConfigData.push_back(*font_cfg); - ImFontConfig& new_font_cfg = ConfigData.back(); - if (new_font_cfg.DstFont == NULL) - new_font_cfg.DstFont = Fonts.back(); - if (!new_font_cfg.FontDataOwnedByAtlas) - { - new_font_cfg.FontData = IM_ALLOC(new_font_cfg.FontDataSize); - new_font_cfg.FontDataOwnedByAtlas = true; - memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize); - } - - if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1) - new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar; - - // Invalidate texture - TexReady = false; - ClearTexData(); - return new_font_cfg.DstFont; -} - -// Default font TTF is compressed with stb_compress then base85 encoded (see misc/fonts/binary_to_compressed_c.cpp for encoder) -static unsigned int stb_decompress_length(const unsigned char* input); -static unsigned int stb_decompress(unsigned char* output, const unsigned char* input, unsigned int length); -static const char* GetDefaultCompressedFontDataTTFBase85(); -static unsigned int Decode85Byte(char c) { return c >= '\\' ? c-36 : c-35; } -static void Decode85(const unsigned char* src, unsigned char* dst) -{ - while (*src) - { - unsigned int tmp = Decode85Byte(src[0]) + 85 * (Decode85Byte(src[1]) + 85 * (Decode85Byte(src[2]) + 85 * (Decode85Byte(src[3]) + 85 * Decode85Byte(src[4])))); - dst[0] = ((tmp >> 0) & 0xFF); dst[1] = ((tmp >> 8) & 0xFF); dst[2] = ((tmp >> 16) & 0xFF); dst[3] = ((tmp >> 24) & 0xFF); // We can't assume little-endianness. - src += 5; - dst += 4; - } -} - -// Load embedded ProggyClean.ttf at size 13, disable oversampling -ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template) -{ - ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); - if (!font_cfg_template) - { - font_cfg.OversampleH = font_cfg.OversampleV = 1; - font_cfg.PixelSnapH = true; - } - if (font_cfg.SizePixels <= 0.0f) - font_cfg.SizePixels = 13.0f * 1.0f; - if (font_cfg.Name[0] == '\0') - ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels); - font_cfg.EllipsisChar = (ImWchar)0x0085; - font_cfg.GlyphOffset.y = 1.0f * IM_FLOOR(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units - - const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85(); - const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault(); - ImFont* font = AddFontFromMemoryCompressedBase85TTF(ttf_compressed_base85, font_cfg.SizePixels, &font_cfg, glyph_ranges); - return font; -} - -ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) -{ - IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - size_t data_size = 0; - void* data = ImFileLoadToMemory(filename, "rb", &data_size, 0); - if (!data) - { - IM_ASSERT_USER_ERROR(0, "Could not load font file!"); - return NULL; - } - ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); - if (font_cfg.Name[0] == '\0') - { - // Store a short copy of filename into into the font name for convenience - const char* p; - for (p = filename + strlen(filename); p > filename && p[-1] != '/' && p[-1] != '\\'; p--) {} - ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "%s, %.0fpx", p, size_pixels); - } - return AddFontFromMemoryTTF(data, (int)data_size, size_pixels, &font_cfg, glyph_ranges); -} - -// NB: Transfer ownership of 'ttf_data' to ImFontAtlas, unless font_cfg_template->FontDataOwnedByAtlas == false. Owned TTF buffer will be deleted after Build(). -ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) -{ - IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); - IM_ASSERT(font_cfg.FontData == NULL); - font_cfg.FontData = ttf_data; - font_cfg.FontDataSize = ttf_size; - font_cfg.SizePixels = size_pixels > 0.0f ? size_pixels : font_cfg.SizePixels; - if (glyph_ranges) - font_cfg.GlyphRanges = glyph_ranges; - return AddFont(&font_cfg); -} - -ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_data, int compressed_ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) -{ - const unsigned int buf_decompressed_size = stb_decompress_length((const unsigned char*)compressed_ttf_data); - unsigned char* buf_decompressed_data = (unsigned char*)IM_ALLOC(buf_decompressed_size); - stb_decompress(buf_decompressed_data, (const unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size); - - ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); - IM_ASSERT(font_cfg.FontData == NULL); - font_cfg.FontDataOwnedByAtlas = true; - return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, &font_cfg, glyph_ranges); -} - -ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges) -{ - int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4; - void* compressed_ttf = IM_ALLOC((size_t)compressed_ttf_size); - Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf); - ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges); - IM_FREE(compressed_ttf); - return font; -} - -int ImFontAtlas::AddCustomRectRegular(int width, int height) -{ - IM_ASSERT(width > 0 && width <= 0xFFFF); - IM_ASSERT(height > 0 && height <= 0xFFFF); - ImFontAtlasCustomRect r; - r.Width = (unsigned short)width; - r.Height = (unsigned short)height; - CustomRects.push_back(r); - return CustomRects.Size - 1; // Return index -} - -int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset) -{ -#ifdef IMGUI_USE_WCHAR32 - IM_ASSERT(id <= IM_UNICODE_CODEPOINT_MAX); -#endif - IM_ASSERT(font != NULL); - IM_ASSERT(width > 0 && width <= 0xFFFF); - IM_ASSERT(height > 0 && height <= 0xFFFF); - ImFontAtlasCustomRect r; - r.Width = (unsigned short)width; - r.Height = (unsigned short)height; - r.GlyphID = id; - r.GlyphAdvanceX = advance_x; - r.GlyphOffset = offset; - r.Font = font; - CustomRects.push_back(r); - return CustomRects.Size - 1; // Return index -} - -void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const -{ - IM_ASSERT(TexWidth > 0 && TexHeight > 0); // Font atlas needs to be built before we can calculate UV coordinates - IM_ASSERT(rect->IsPacked()); // Make sure the rectangle has been packed - *out_uv_min = ImVec2((float)rect->X * TexUvScale.x, (float)rect->Y * TexUvScale.y); - *out_uv_max = ImVec2((float)(rect->X + rect->Width) * TexUvScale.x, (float)(rect->Y + rect->Height) * TexUvScale.y); -} - -bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]) -{ - if (cursor_type <= ImGuiMouseCursor_None || cursor_type >= ImGuiMouseCursor_COUNT) - return false; - if (Flags & ImFontAtlasFlags_NoMouseCursors) - return false; - - IM_ASSERT(PackIdMouseCursors != -1); - ImFontAtlasCustomRect* r = GetCustomRectByIndex(PackIdMouseCursors); - ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r->X, (float)r->Y); - ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][1]; - *out_size = size; - *out_offset = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][2]; - out_uv_border[0] = (pos) * TexUvScale; - out_uv_border[1] = (pos + size) * TexUvScale; - pos.x += FONT_ATLAS_DEFAULT_TEX_DATA_W + 1; - out_uv_fill[0] = (pos) * TexUvScale; - out_uv_fill[1] = (pos + size) * TexUvScale; - return true; -} - -bool ImFontAtlas::Build() -{ - IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - - // Default font is none are specified - if (ConfigData.Size == 0) - AddFontDefault(); - - // Select builder - // - Note that we do not reassign to atlas->FontBuilderIO, since it is likely to point to static data which - // may mess with some hot-reloading schemes. If you need to assign to this (for dynamic selection) AND are - // using a hot-reloading scheme that messes up static data, store your own instance of ImFontBuilderIO somewhere - // and point to it instead of pointing directly to return value of the GetBuilderXXX functions. - const ImFontBuilderIO* builder_io = FontBuilderIO; - if (builder_io == NULL) - { -#ifdef IMGUI_ENABLE_FREETYPE - builder_io = ImGuiFreeType::GetBuilderForFreeType(); -#elif defined(IMGUI_ENABLE_STB_TRUETYPE) - builder_io = ImFontAtlasGetBuilderForStbTruetype(); -#else - IM_ASSERT(0); // Invalid Build function -#endif - } - - // Build - return builder_io->FontBuilder_Build(this); -} - -void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_brighten_factor) -{ - for (unsigned int i = 0; i < 256; i++) - { - unsigned int value = (unsigned int)(i * in_brighten_factor); - out_table[i] = value > 255 ? 255 : (value & 0xFF); - } -} - -void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride) -{ - unsigned char* data = pixels + x + y * stride; - for (int j = h; j > 0; j--, data += stride) - for (int i = 0; i < w; i++) - data[i] = table[data[i]]; -} - -#ifdef IMGUI_ENABLE_STB_TRUETYPE -// Temporary data for one source font (multiple source fonts can be merged into one destination ImFont) -// (C++03 doesn't allow instancing ImVector<> with function-local types so we declare the type here.) -struct ImFontBuildSrcData -{ - stbtt_fontinfo FontInfo; - stbtt_pack_range PackRange; // Hold the list of codepoints to pack (essentially points to Codepoints.Data) - stbrp_rect* Rects; // Rectangle to pack. We first fill in their size and the packer will give us their position. - stbtt_packedchar* PackedChars; // Output glyphs - const ImWchar* SrcRanges; // Ranges as requested by user (user is allowed to request too much, e.g. 0x0020..0xFFFF) - int DstIndex; // Index into atlas->Fonts[] and dst_tmp_array[] - int GlyphsHighest; // Highest requested codepoint - int GlyphsCount; // Glyph count (excluding missing glyphs and glyphs already set by an earlier source font) - ImBitVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB) - ImVector GlyphsList; // Glyph codepoints list (flattened version of GlyphsMap) -}; - -// Temporary data for one destination ImFont* (multiple source fonts can be merged into one destination ImFont) -struct ImFontBuildDstData -{ - int SrcCount; // Number of source fonts targeting this destination font. - int GlyphsHighest; - int GlyphsCount; - ImBitVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font. -}; - -static void UnpackBitVectorToFlatIndexList(const ImBitVector* in, ImVector* out) -{ - IM_ASSERT(sizeof(in->Storage.Data[0]) == sizeof(int)); - const ImU32* it_begin = in->Storage.begin(); - const ImU32* it_end = in->Storage.end(); - for (const ImU32* it = it_begin; it < it_end; it++) - if (ImU32 entries_32 = *it) - for (ImU32 bit_n = 0; bit_n < 32; bit_n++) - if (entries_32 & ((ImU32)1 << bit_n)) - out->push_back((int)(((it - it_begin) << 5) + bit_n)); -} - -static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) -{ - IM_ASSERT(atlas->ConfigData.Size > 0); - - ImFontAtlasBuildInit(atlas); - - // Clear atlas - atlas->TexID = (ImTextureID)NULL; - atlas->TexWidth = atlas->TexHeight = 0; - atlas->TexUvScale = ImVec2(0.0f, 0.0f); - atlas->TexUvWhitePixel = ImVec2(0.0f, 0.0f); - atlas->ClearTexData(); - - // Temporary storage for building - ImVector src_tmp_array; - ImVector dst_tmp_array; - src_tmp_array.resize(atlas->ConfigData.Size); - dst_tmp_array.resize(atlas->Fonts.Size); - memset(src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes()); - memset(dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes()); - - // 1. Initialize font loading structure, check font data validity - for (int src_i = 0; src_i < atlas->ConfigData.Size; src_i++) - { - ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; - ImFontConfig& cfg = atlas->ConfigData[src_i]; - IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas)); - - // Find index from cfg.DstFont (we allow the user to set cfg.DstFont. Also it makes casual debugging nicer than when storing indices) - src_tmp.DstIndex = -1; - for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++) - if (cfg.DstFont == atlas->Fonts[output_i]) - src_tmp.DstIndex = output_i; - if (src_tmp.DstIndex == -1) - { - IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array? - return false; - } - // Initialize helper structure for font loading and verify that the TTF/OTF data is correct - const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); - IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found."); - if (!stbtt_InitFont(&src_tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset)) - return false; - - // Measure highest codepoints - ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; - src_tmp.SrcRanges = cfg.GlyphRanges ? cfg.GlyphRanges : atlas->GetGlyphRangesDefault(); - for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) - src_tmp.GlyphsHighest = ImMax(src_tmp.GlyphsHighest, (int)src_range[1]); - dst_tmp.SrcCount++; - dst_tmp.GlyphsHighest = ImMax(dst_tmp.GlyphsHighest, src_tmp.GlyphsHighest); - } - - // 2. For every requested codepoint, check for their presence in the font data, and handle redundancy or overlaps between source fonts to avoid unused glyphs. - int total_glyphs_count = 0; - for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) - { - ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; - ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; - src_tmp.GlyphsSet.Create(src_tmp.GlyphsHighest + 1); - if (dst_tmp.GlyphsSet.Storage.empty()) - dst_tmp.GlyphsSet.Create(dst_tmp.GlyphsHighest + 1); - - for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) - for (unsigned int codepoint = src_range[0]; codepoint <= src_range[1]; codepoint++) - { - if (dst_tmp.GlyphsSet.TestBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option for MergeMode (e.g. MergeOverwrite==true) - continue; - if (!stbtt_FindGlyphIndex(&src_tmp.FontInfo, codepoint)) // It is actually in the font? - continue; - - // Add to avail set/counters - src_tmp.GlyphsCount++; - dst_tmp.GlyphsCount++; - src_tmp.GlyphsSet.SetBit(codepoint); - dst_tmp.GlyphsSet.SetBit(codepoint); - total_glyphs_count++; - } - } - - // 3. Unpack our bit map into a flat list (we now have all the Unicode points that we know are requested _and_ available _and_ not overlapping another) - for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) - { - ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; - src_tmp.GlyphsList.reserve(src_tmp.GlyphsCount); - UnpackBitVectorToFlatIndexList(&src_tmp.GlyphsSet, &src_tmp.GlyphsList); - src_tmp.GlyphsSet.Clear(); - IM_ASSERT(src_tmp.GlyphsList.Size == src_tmp.GlyphsCount); - } - for (int dst_i = 0; dst_i < dst_tmp_array.Size; dst_i++) - dst_tmp_array[dst_i].GlyphsSet.Clear(); - dst_tmp_array.clear(); - - // Allocate packing character data and flag packed characters buffer as non-packed (x0=y0=x1=y1=0) - // (We technically don't need to zero-clear buf_rects, but let's do it for the sake of sanity) - ImVector buf_rects; - ImVector buf_packedchars; - buf_rects.resize(total_glyphs_count); - buf_packedchars.resize(total_glyphs_count); - memset(buf_rects.Data, 0, (size_t)buf_rects.size_in_bytes()); - memset(buf_packedchars.Data, 0, (size_t)buf_packedchars.size_in_bytes()); - - // 4. Gather glyphs sizes so we can pack them in our virtual canvas. - int total_surface = 0; - int buf_rects_out_n = 0; - int buf_packedchars_out_n = 0; - for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) - { - ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; - if (src_tmp.GlyphsCount == 0) - continue; - - src_tmp.Rects = &buf_rects[buf_rects_out_n]; - src_tmp.PackedChars = &buf_packedchars[buf_packedchars_out_n]; - buf_rects_out_n += src_tmp.GlyphsCount; - buf_packedchars_out_n += src_tmp.GlyphsCount; - - // Convert our ranges in the format stb_truetype wants - ImFontConfig& cfg = atlas->ConfigData[src_i]; - src_tmp.PackRange.font_size = cfg.SizePixels; - src_tmp.PackRange.first_unicode_codepoint_in_range = 0; - src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data; - src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size; - src_tmp.PackRange.chardata_for_range = src_tmp.PackedChars; - src_tmp.PackRange.h_oversample = (unsigned char)cfg.OversampleH; - src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV; - - // Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects) - const float scale = (cfg.SizePixels > 0) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels); - const int padding = atlas->TexGlyphPadding; - for (int glyph_i = 0; glyph_i < src_tmp.GlyphsList.Size; glyph_i++) - { - int x0, y0, x1, y1; - const int glyph_index_in_font = stbtt_FindGlyphIndex(&src_tmp.FontInfo, src_tmp.GlyphsList[glyph_i]); - IM_ASSERT(glyph_index_in_font != 0); - stbtt_GetGlyphBitmapBoxSubpixel(&src_tmp.FontInfo, glyph_index_in_font, scale * cfg.OversampleH, scale * cfg.OversampleV, 0, 0, &x0, &y0, &x1, &y1); - src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + padding + cfg.OversampleH - 1); - src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + padding + cfg.OversampleV - 1); - total_surface += src_tmp.Rects[glyph_i].w * src_tmp.Rects[glyph_i].h; - } - } - - // We need a width for the skyline algorithm, any width! - // The exact width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height. - // User can override TexDesiredWidth and TexGlyphPadding if they wish, otherwise we use a simple heuristic to select the width based on expected surface. - const int surface_sqrt = (int)ImSqrt((float)total_surface) + 1; - atlas->TexHeight = 0; - if (atlas->TexDesiredWidth > 0) - atlas->TexWidth = atlas->TexDesiredWidth; - else - atlas->TexWidth = (surface_sqrt >= 4096 * 0.7f) ? 4096 : (surface_sqrt >= 2048 * 0.7f) ? 2048 : (surface_sqrt >= 1024 * 0.7f) ? 1024 : 512; - - // 5. Start packing - // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). - const int TEX_HEIGHT_MAX = 1024 * 32; - stbtt_pack_context spc = {}; - stbtt_PackBegin(&spc, NULL, atlas->TexWidth, TEX_HEIGHT_MAX, 0, atlas->TexGlyphPadding, NULL); - ImFontAtlasBuildPackCustomRects(atlas, spc.pack_info); - - // 6. Pack each source font. No rendering yet, we are working with rectangles in an infinitely tall texture at this point. - for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) - { - ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; - if (src_tmp.GlyphsCount == 0) - continue; - - stbrp_pack_rects((stbrp_context*)spc.pack_info, src_tmp.Rects, src_tmp.GlyphsCount); - - // Extend texture height and mark missing glyphs as non-packed so we won't render them. - // FIXME: We are not handling packing failure here (would happen if we got off TEX_HEIGHT_MAX or if a single if larger than TexWidth?) - for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) - if (src_tmp.Rects[glyph_i].was_packed) - atlas->TexHeight = ImMax(atlas->TexHeight, src_tmp.Rects[glyph_i].y + src_tmp.Rects[glyph_i].h); - } - - // 7. Allocate texture - atlas->TexHeight = (atlas->Flags & ImFontAtlasFlags_NoPowerOfTwoHeight) ? (atlas->TexHeight + 1) : ImUpperPowerOfTwo(atlas->TexHeight); - atlas->TexUvScale = ImVec2(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight); - atlas->TexPixelsAlpha8 = (unsigned char*)IM_ALLOC(atlas->TexWidth * atlas->TexHeight); - memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight); - spc.pixels = atlas->TexPixelsAlpha8; - spc.height = atlas->TexHeight; - - // 8. Render/rasterize font characters into the texture - for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) - { - ImFontConfig& cfg = atlas->ConfigData[src_i]; - ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; - if (src_tmp.GlyphsCount == 0) - continue; - - stbtt_PackFontRangesRenderIntoRects(&spc, &src_tmp.FontInfo, &src_tmp.PackRange, 1, src_tmp.Rects); - - // Apply multiply operator - if (cfg.RasterizerMultiply != 1.0f) - { - unsigned char multiply_table[256]; - ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply); - stbrp_rect* r = &src_tmp.Rects[0]; - for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++, r++) - if (r->was_packed) - ImFontAtlasBuildMultiplyRectAlpha8(multiply_table, atlas->TexPixelsAlpha8, r->x, r->y, r->w, r->h, atlas->TexWidth * 1); - } - src_tmp.Rects = NULL; - } - - // End packing - stbtt_PackEnd(&spc); - buf_rects.clear(); - - // 9. Setup ImFont and glyphs for runtime - for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) - { - ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; - if (src_tmp.GlyphsCount == 0) - continue; - - // When merging fonts with MergeMode=true: - // - We can have multiple input fonts writing into a same destination font. - // - dst_font->ConfigData is != from cfg which is our source configuration. - ImFontConfig& cfg = atlas->ConfigData[src_i]; - ImFont* dst_font = cfg.DstFont; - - const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels); - int unscaled_ascent, unscaled_descent, unscaled_line_gap; - stbtt_GetFontVMetrics(&src_tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap); - - const float ascent = ImFloor(unscaled_ascent * font_scale + ((unscaled_ascent > 0.0f) ? +1 : -1)); - const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1)); - ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); - const float font_off_x = cfg.GlyphOffset.x; - const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); - - for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) - { - // Register glyph - const int codepoint = src_tmp.GlyphsList[glyph_i]; - const stbtt_packedchar& pc = src_tmp.PackedChars[glyph_i]; - stbtt_aligned_quad q; - float unused_x = 0.0f, unused_y = 0.0f; - stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &unused_x, &unused_y, &q, 0); - dst_font->AddGlyph(&cfg, (ImWchar)codepoint, q.x0 + font_off_x, q.y0 + font_off_y, q.x1 + font_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance); - } - } - - // Cleanup - src_tmp_array.clear_destruct(); - - ImFontAtlasBuildFinish(atlas); - return true; -} - -const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype() -{ - static ImFontBuilderIO io; - io.FontBuilder_Build = ImFontAtlasBuildWithStbTruetype; - return &io; -} - -#endif // IMGUI_ENABLE_STB_TRUETYPE - -void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent) -{ - if (!font_config->MergeMode) - { - font->ClearOutputData(); - font->FontSize = font_config->SizePixels; - font->ConfigData = font_config; - font->ConfigDataCount = 0; - font->ContainerAtlas = atlas; - font->Ascent = ascent; - font->Descent = descent; - } - font->ConfigDataCount++; -} - -void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque) -{ - stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque; - IM_ASSERT(pack_context != NULL); - - ImVector& user_rects = atlas->CustomRects; - IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong. - - ImVector pack_rects; - pack_rects.resize(user_rects.Size); - memset(pack_rects.Data, 0, (size_t)pack_rects.size_in_bytes()); - for (int i = 0; i < user_rects.Size; i++) - { - pack_rects[i].w = user_rects[i].Width; - pack_rects[i].h = user_rects[i].Height; - } - stbrp_pack_rects(pack_context, &pack_rects[0], pack_rects.Size); - for (int i = 0; i < pack_rects.Size; i++) - if (pack_rects[i].was_packed) - { - user_rects[i].X = (unsigned short)pack_rects[i].x; - user_rects[i].Y = (unsigned short)pack_rects[i].y; - IM_ASSERT(pack_rects[i].w == user_rects[i].Width && pack_rects[i].h == user_rects[i].Height); - atlas->TexHeight = ImMax(atlas->TexHeight, pack_rects[i].y + pack_rects[i].h); - } -} - -void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value) -{ - IM_ASSERT(x >= 0 && x + w <= atlas->TexWidth); - IM_ASSERT(y >= 0 && y + h <= atlas->TexHeight); - unsigned char* out_pixel = atlas->TexPixelsAlpha8 + x + (y * atlas->TexWidth); - for (int off_y = 0; off_y < h; off_y++, out_pixel += atlas->TexWidth, in_str += w) - for (int off_x = 0; off_x < w; off_x++) - out_pixel[off_x] = (in_str[off_x] == in_marker_char) ? in_marker_pixel_value : 0x00; -} - -void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value) -{ - IM_ASSERT(x >= 0 && x + w <= atlas->TexWidth); - IM_ASSERT(y >= 0 && y + h <= atlas->TexHeight); - unsigned int* out_pixel = atlas->TexPixelsRGBA32 + x + (y * atlas->TexWidth); - for (int off_y = 0; off_y < h; off_y++, out_pixel += atlas->TexWidth, in_str += w) - for (int off_x = 0; off_x < w; off_x++) - out_pixel[off_x] = (in_str[off_x] == in_marker_char) ? in_marker_pixel_value : IM_COL32_BLACK_TRANS; -} - -static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas) -{ - ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdMouseCursors); - IM_ASSERT(r->IsPacked()); - - const int w = atlas->TexWidth; - if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) - { - // Render/copy pixels - IM_ASSERT(r->Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r->Height == FONT_ATLAS_DEFAULT_TEX_DATA_H); - const int x_for_white = r->X; - const int x_for_black = r->X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1; - if (atlas->TexPixelsAlpha8 != NULL) - { - ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', 0xFF); - ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', 0xFF); - } - else - { - ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', IM_COL32_WHITE); - ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', IM_COL32_WHITE); - } - } - else - { - // Render 4 white pixels - IM_ASSERT(r->Width == 2 && r->Height == 2); - const int offset = (int)r->X + (int)r->Y * w; - if (atlas->TexPixelsAlpha8 != NULL) - { - atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF; - } - else - { - atlas->TexPixelsRGBA32[offset] = atlas->TexPixelsRGBA32[offset + 1] = atlas->TexPixelsRGBA32[offset + w] = atlas->TexPixelsRGBA32[offset + w + 1] = IM_COL32_WHITE; - } - } - atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y); -} - -static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas) -{ - if (atlas->Flags & ImFontAtlasFlags_NoBakedLines) - return; - - // This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them - ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdLines); - IM_ASSERT(r->IsPacked()); - for (unsigned int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row - { - // Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle - unsigned int y = n; - unsigned int line_width = n; - unsigned int pad_left = (r->Width - line_width) / 2; - unsigned int pad_right = r->Width - (pad_left + line_width); - - // Write each slice - IM_ASSERT(pad_left + line_width + pad_right == r->Width && y < r->Height); // Make sure we're inside the texture bounds before we start writing pixels - if (atlas->TexPixelsAlpha8 != NULL) - { - unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * atlas->TexWidth)]; - for (unsigned int i = 0; i < pad_left; i++) - *(write_ptr + i) = 0x00; - - for (unsigned int i = 0; i < line_width; i++) - *(write_ptr + pad_left + i) = 0xFF; - - for (unsigned int i = 0; i < pad_right; i++) - *(write_ptr + pad_left + line_width + i) = 0x00; - } - else - { - unsigned int* write_ptr = &atlas->TexPixelsRGBA32[r->X + ((r->Y + y) * atlas->TexWidth)]; - for (unsigned int i = 0; i < pad_left; i++) - *(write_ptr + i) = IM_COL32(255, 255, 255, 0); - - for (unsigned int i = 0; i < line_width; i++) - *(write_ptr + pad_left + i) = IM_COL32_WHITE; - - for (unsigned int i = 0; i < pad_right; i++) - *(write_ptr + pad_left + line_width + i) = IM_COL32(255, 255, 255, 0); - } - - // Calculate UVs for this line - ImVec2 uv0 = ImVec2((float)(r->X + pad_left - 1), (float)(r->Y + y)) * atlas->TexUvScale; - ImVec2 uv1 = ImVec2((float)(r->X + pad_left + line_width + 1), (float)(r->Y + y + 1)) * atlas->TexUvScale; - float half_v = (uv0.y + uv1.y) * 0.5f; // Calculate a constant V in the middle of the row to avoid sampling artifacts - atlas->TexUvLines[n] = ImVec4(uv0.x, half_v, uv1.x, half_v); - } -} - -// Note: this is called / shared by both the stb_truetype and the FreeType builder -void ImFontAtlasBuildInit(ImFontAtlas* atlas) -{ - // Register texture region for mouse cursors or standard white pixels - if (atlas->PackIdMouseCursors < 0) - { - if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) - atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1, FONT_ATLAS_DEFAULT_TEX_DATA_H); - else - atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(2, 2); - } - - // Register texture region for thick lines - // The +2 here is to give space for the end caps, whilst height +1 is to accommodate the fact we have a zero-width row - if (atlas->PackIdLines < 0) - { - if (!(atlas->Flags & ImFontAtlasFlags_NoBakedLines)) - atlas->PackIdLines = atlas->AddCustomRectRegular(IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2, IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1); - } -} - -// This is called/shared by both the stb_truetype and the FreeType builder. -void ImFontAtlasBuildFinish(ImFontAtlas* atlas) -{ - // Render into our custom data blocks - IM_ASSERT(atlas->TexPixelsAlpha8 != NULL || atlas->TexPixelsRGBA32 != NULL); - ImFontAtlasBuildRenderDefaultTexData(atlas); - ImFontAtlasBuildRenderLinesTexData(atlas); - - // Register custom rectangle glyphs - for (int i = 0; i < atlas->CustomRects.Size; i++) - { - const ImFontAtlasCustomRect* r = &atlas->CustomRects[i]; - if (r->Font == NULL || r->GlyphID == 0) - continue; - - // Will ignore ImFontConfig settings: GlyphMinAdvanceX, GlyphMinAdvanceY, GlyphExtraSpacing, PixelSnapH - IM_ASSERT(r->Font->ContainerAtlas == atlas); - ImVec2 uv0, uv1; - atlas->CalcCustomRectUV(r, &uv0, &uv1); - r->Font->AddGlyph(NULL, (ImWchar)r->GlyphID, r->GlyphOffset.x, r->GlyphOffset.y, r->GlyphOffset.x + r->Width, r->GlyphOffset.y + r->Height, uv0.x, uv0.y, uv1.x, uv1.y, r->GlyphAdvanceX); - } - - // Build all fonts lookup tables - for (int i = 0; i < atlas->Fonts.Size; i++) - if (atlas->Fonts[i]->DirtyLookupTables) - atlas->Fonts[i]->BuildLookupTable(); - - atlas->TexReady = true; -} - -// Retrieve list of range (2 int per range, values are inclusive) -const ImWchar* ImFontAtlas::GetGlyphRangesDefault() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0, - }; - return &ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesKorean() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x3131, 0x3163, // Korean alphabets - 0xAC00, 0xD7A3, // Korean characters - 0xFFFD, 0xFFFD, // Invalid - 0, - }; - return &ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesChineseFull() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x2000, 0x206F, // General Punctuation - 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana - 0x31F0, 0x31FF, // Katakana Phonetic Extensions - 0xFF00, 0xFFEF, // Half-width characters - 0xFFFD, 0xFFFD, // Invalid - 0x4e00, 0x9FAF, // CJK Ideograms - 0, - }; - return &ranges[0]; -} - -static void UnpackAccumulativeOffsetsIntoRanges(int base_codepoint, const short* accumulative_offsets, int accumulative_offsets_count, ImWchar* out_ranges) -{ - for (int n = 0; n < accumulative_offsets_count; n++, out_ranges += 2) - { - out_ranges[0] = out_ranges[1] = (ImWchar)(base_codepoint + accumulative_offsets[n]); - base_codepoint += accumulative_offsets[n]; - } - out_ranges[0] = 0; -} - -//------------------------------------------------------------------------- -// [SECTION] ImFontAtlas glyph ranges helpers -//------------------------------------------------------------------------- - -const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon() -{ - // Store 2500 regularly used characters for Simplified Chinese. - // Sourced from https://zh.wiktionary.org/wiki/%E9%99%84%E5%BD%95:%E7%8E%B0%E4%BB%A3%E6%B1%89%E8%AF%AD%E5%B8%B8%E7%94%A8%E5%AD%97%E8%A1%A8 - // This table covers 97.97% of all characters used during the month in July, 1987. - // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters. - // (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.) - static const short accumulative_offsets_from_0x4E00[] = - { - 0,1,2,4,1,1,1,1,2,1,3,2,1,2,2,1,1,1,1,1,5,2,1,2,3,3,3,2,2,4,1,1,1,2,1,5,2,3,1,2,1,2,1,1,2,1,1,2,2,1,4,1,1,1,1,5,10,1,2,19,2,1,2,1,2,1,2,1,2, - 1,5,1,6,3,2,1,2,2,1,1,1,4,8,5,1,1,4,1,1,3,1,2,1,5,1,2,1,1,1,10,1,1,5,2,4,6,1,4,2,2,2,12,2,1,1,6,1,1,1,4,1,1,4,6,5,1,4,2,2,4,10,7,1,1,4,2,4, - 2,1,4,3,6,10,12,5,7,2,14,2,9,1,1,6,7,10,4,7,13,1,5,4,8,4,1,1,2,28,5,6,1,1,5,2,5,20,2,2,9,8,11,2,9,17,1,8,6,8,27,4,6,9,20,11,27,6,68,2,2,1,1, - 1,2,1,2,2,7,6,11,3,3,1,1,3,1,2,1,1,1,1,1,3,1,1,8,3,4,1,5,7,2,1,4,4,8,4,2,1,2,1,1,4,5,6,3,6,2,12,3,1,3,9,2,4,3,4,1,5,3,3,1,3,7,1,5,1,1,1,1,2, - 3,4,5,2,3,2,6,1,1,2,1,7,1,7,3,4,5,15,2,2,1,5,3,22,19,2,1,1,1,1,2,5,1,1,1,6,1,1,12,8,2,9,18,22,4,1,1,5,1,16,1,2,7,10,15,1,1,6,2,4,1,2,4,1,6, - 1,1,3,2,4,1,6,4,5,1,2,1,1,2,1,10,3,1,3,2,1,9,3,2,5,7,2,19,4,3,6,1,1,1,1,1,4,3,2,1,1,1,2,5,3,1,1,1,2,2,1,1,2,1,1,2,1,3,1,1,1,3,7,1,4,1,1,2,1, - 1,2,1,2,4,4,3,8,1,1,1,2,1,3,5,1,3,1,3,4,6,2,2,14,4,6,6,11,9,1,15,3,1,28,5,2,5,5,3,1,3,4,5,4,6,14,3,2,3,5,21,2,7,20,10,1,2,19,2,4,28,28,2,3, - 2,1,14,4,1,26,28,42,12,40,3,52,79,5,14,17,3,2,2,11,3,4,6,3,1,8,2,23,4,5,8,10,4,2,7,3,5,1,1,6,3,1,2,2,2,5,28,1,1,7,7,20,5,3,29,3,17,26,1,8,4, - 27,3,6,11,23,5,3,4,6,13,24,16,6,5,10,25,35,7,3,2,3,3,14,3,6,2,6,1,4,2,3,8,2,1,1,3,3,3,4,1,1,13,2,2,4,5,2,1,14,14,1,2,2,1,4,5,2,3,1,14,3,12, - 3,17,2,16,5,1,2,1,8,9,3,19,4,2,2,4,17,25,21,20,28,75,1,10,29,103,4,1,2,1,1,4,2,4,1,2,3,24,2,2,2,1,1,2,1,3,8,1,1,1,2,1,1,3,1,1,1,6,1,5,3,1,1, - 1,3,4,1,1,5,2,1,5,6,13,9,16,1,1,1,1,3,2,3,2,4,5,2,5,2,2,3,7,13,7,2,2,1,1,1,1,2,3,3,2,1,6,4,9,2,1,14,2,14,2,1,18,3,4,14,4,11,41,15,23,15,23, - 176,1,3,4,1,1,1,1,5,3,1,2,3,7,3,1,1,2,1,2,4,4,6,2,4,1,9,7,1,10,5,8,16,29,1,1,2,2,3,1,3,5,2,4,5,4,1,1,2,2,3,3,7,1,6,10,1,17,1,44,4,6,2,1,1,6, - 5,4,2,10,1,6,9,2,8,1,24,1,2,13,7,8,8,2,1,4,1,3,1,3,3,5,2,5,10,9,4,9,12,2,1,6,1,10,1,1,7,7,4,10,8,3,1,13,4,3,1,6,1,3,5,2,1,2,17,16,5,2,16,6, - 1,4,2,1,3,3,6,8,5,11,11,1,3,3,2,4,6,10,9,5,7,4,7,4,7,1,1,4,2,1,3,6,8,7,1,6,11,5,5,3,24,9,4,2,7,13,5,1,8,82,16,61,1,1,1,4,2,2,16,10,3,8,1,1, - 6,4,2,1,3,1,1,1,4,3,8,4,2,2,1,1,1,1,1,6,3,5,1,1,4,6,9,2,1,1,1,2,1,7,2,1,6,1,5,4,4,3,1,8,1,3,3,1,3,2,2,2,2,3,1,6,1,2,1,2,1,3,7,1,8,2,1,2,1,5, - 2,5,3,5,10,1,2,1,1,3,2,5,11,3,9,3,5,1,1,5,9,1,2,1,5,7,9,9,8,1,3,3,3,6,8,2,3,2,1,1,32,6,1,2,15,9,3,7,13,1,3,10,13,2,14,1,13,10,2,1,3,10,4,15, - 2,15,15,10,1,3,9,6,9,32,25,26,47,7,3,2,3,1,6,3,4,3,2,8,5,4,1,9,4,2,2,19,10,6,2,3,8,1,2,2,4,2,1,9,4,4,4,6,4,8,9,2,3,1,1,1,1,3,5,5,1,3,8,4,6, - 2,1,4,12,1,5,3,7,13,2,5,8,1,6,1,2,5,14,6,1,5,2,4,8,15,5,1,23,6,62,2,10,1,1,8,1,2,2,10,4,2,2,9,2,1,1,3,2,3,1,5,3,3,2,1,3,8,1,1,1,11,3,1,1,4, - 3,7,1,14,1,2,3,12,5,2,5,1,6,7,5,7,14,11,1,3,1,8,9,12,2,1,11,8,4,4,2,6,10,9,13,1,1,3,1,5,1,3,2,4,4,1,18,2,3,14,11,4,29,4,2,7,1,3,13,9,2,2,5, - 3,5,20,7,16,8,5,72,34,6,4,22,12,12,28,45,36,9,7,39,9,191,1,1,1,4,11,8,4,9,2,3,22,1,1,1,1,4,17,1,7,7,1,11,31,10,2,4,8,2,3,2,1,4,2,16,4,32,2, - 3,19,13,4,9,1,5,2,14,8,1,1,3,6,19,6,5,1,16,6,2,10,8,5,1,2,3,1,5,5,1,11,6,6,1,3,3,2,6,3,8,1,1,4,10,7,5,7,7,5,8,9,2,1,3,4,1,1,3,1,3,3,2,6,16, - 1,4,6,3,1,10,6,1,3,15,2,9,2,10,25,13,9,16,6,2,2,10,11,4,3,9,1,2,6,6,5,4,30,40,1,10,7,12,14,33,6,3,6,7,3,1,3,1,11,14,4,9,5,12,11,49,18,51,31, - 140,31,2,2,1,5,1,8,1,10,1,4,4,3,24,1,10,1,3,6,6,16,3,4,5,2,1,4,2,57,10,6,22,2,22,3,7,22,6,10,11,36,18,16,33,36,2,5,5,1,1,1,4,10,1,4,13,2,7, - 5,2,9,3,4,1,7,43,3,7,3,9,14,7,9,1,11,1,1,3,7,4,18,13,1,14,1,3,6,10,73,2,2,30,6,1,11,18,19,13,22,3,46,42,37,89,7,3,16,34,2,2,3,9,1,7,1,1,1,2, - 2,4,10,7,3,10,3,9,5,28,9,2,6,13,7,3,1,3,10,2,7,2,11,3,6,21,54,85,2,1,4,2,2,1,39,3,21,2,2,5,1,1,1,4,1,1,3,4,15,1,3,2,4,4,2,3,8,2,20,1,8,7,13, - 4,1,26,6,2,9,34,4,21,52,10,4,4,1,5,12,2,11,1,7,2,30,12,44,2,30,1,1,3,6,16,9,17,39,82,2,2,24,7,1,7,3,16,9,14,44,2,1,2,1,2,3,5,2,4,1,6,7,5,3, - 2,6,1,11,5,11,2,1,18,19,8,1,3,24,29,2,1,3,5,2,2,1,13,6,5,1,46,11,3,5,1,1,5,8,2,10,6,12,6,3,7,11,2,4,16,13,2,5,1,1,2,2,5,2,28,5,2,23,10,8,4, - 4,22,39,95,38,8,14,9,5,1,13,5,4,3,13,12,11,1,9,1,27,37,2,5,4,4,63,211,95,2,2,2,1,3,5,2,1,1,2,2,1,1,1,3,2,4,1,2,1,1,5,2,2,1,1,2,3,1,3,1,1,1, - 3,1,4,2,1,3,6,1,1,3,7,15,5,3,2,5,3,9,11,4,2,22,1,6,3,8,7,1,4,28,4,16,3,3,25,4,4,27,27,1,4,1,2,2,7,1,3,5,2,28,8,2,14,1,8,6,16,25,3,3,3,14,3, - 3,1,1,2,1,4,6,3,8,4,1,1,1,2,3,6,10,6,2,3,18,3,2,5,5,4,3,1,5,2,5,4,23,7,6,12,6,4,17,11,9,5,1,1,10,5,12,1,1,11,26,33,7,3,6,1,17,7,1,5,12,1,11, - 2,4,1,8,14,17,23,1,2,1,7,8,16,11,9,6,5,2,6,4,16,2,8,14,1,11,8,9,1,1,1,9,25,4,11,19,7,2,15,2,12,8,52,7,5,19,2,16,4,36,8,1,16,8,24,26,4,6,2,9, - 5,4,36,3,28,12,25,15,37,27,17,12,59,38,5,32,127,1,2,9,17,14,4,1,2,1,1,8,11,50,4,14,2,19,16,4,17,5,4,5,26,12,45,2,23,45,104,30,12,8,3,10,2,2, - 3,3,1,4,20,7,2,9,6,15,2,20,1,3,16,4,11,15,6,134,2,5,59,1,2,2,2,1,9,17,3,26,137,10,211,59,1,2,4,1,4,1,1,1,2,6,2,3,1,1,2,3,2,3,1,3,4,4,2,3,3, - 1,4,3,1,7,2,2,3,1,2,1,3,3,3,2,2,3,2,1,3,14,6,1,3,2,9,6,15,27,9,34,145,1,1,2,1,1,1,1,2,1,1,1,1,2,2,2,3,1,2,1,1,1,2,3,5,8,3,5,2,4,1,3,2,2,2,12, - 4,1,1,1,10,4,5,1,20,4,16,1,15,9,5,12,2,9,2,5,4,2,26,19,7,1,26,4,30,12,15,42,1,6,8,172,1,1,4,2,1,1,11,2,2,4,2,1,2,1,10,8,1,2,1,4,5,1,2,5,1,8, - 4,1,3,4,2,1,6,2,1,3,4,1,2,1,1,1,1,12,5,7,2,4,3,1,1,1,3,3,6,1,2,2,3,3,3,2,1,2,12,14,11,6,6,4,12,2,8,1,7,10,1,35,7,4,13,15,4,3,23,21,28,52,5, - 26,5,6,1,7,10,2,7,53,3,2,1,1,1,2,163,532,1,10,11,1,3,3,4,8,2,8,6,2,2,23,22,4,2,2,4,2,1,3,1,3,3,5,9,8,2,1,2,8,1,10,2,12,21,20,15,105,2,3,1,1, - 3,2,3,1,1,2,5,1,4,15,11,19,1,1,1,1,5,4,5,1,1,2,5,3,5,12,1,2,5,1,11,1,1,15,9,1,4,5,3,26,8,2,1,3,1,1,15,19,2,12,1,2,5,2,7,2,19,2,20,6,26,7,5, - 2,2,7,34,21,13,70,2,128,1,1,2,1,1,2,1,1,3,2,2,2,15,1,4,1,3,4,42,10,6,1,49,85,8,1,2,1,1,4,4,2,3,6,1,5,7,4,3,211,4,1,2,1,2,5,1,2,4,2,2,6,5,6, - 10,3,4,48,100,6,2,16,296,5,27,387,2,2,3,7,16,8,5,38,15,39,21,9,10,3,7,59,13,27,21,47,5,21,6 - }; - static ImWchar base_ranges[] = // not zero-terminated - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x2000, 0x206F, // General Punctuation - 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana - 0x31F0, 0x31FF, // Katakana Phonetic Extensions - 0xFF00, 0xFFEF, // Half-width characters - 0xFFFD, 0xFFFD // Invalid - }; - static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(accumulative_offsets_from_0x4E00) * 2 + 1] = { 0 }; - if (!full_ranges[0]) - { - memcpy(full_ranges, base_ranges, sizeof(base_ranges)); - UnpackAccumulativeOffsetsIntoRanges(0x4E00, accumulative_offsets_from_0x4E00, IM_ARRAYSIZE(accumulative_offsets_from_0x4E00), full_ranges + IM_ARRAYSIZE(base_ranges)); - } - return &full_ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesJapanese() -{ - // 2999 ideograms code points for Japanese - // - 2136 Joyo (meaning "for regular use" or "for common use") Kanji code points - // - 863 Jinmeiyo (meaning "for personal name") Kanji code points - // - Sourced from the character information database of the Information-technology Promotion Agency, Japan - // - https://mojikiban.ipa.go.jp/mji/ - // - Available under the terms of the Creative Commons Attribution-ShareAlike 2.1 Japan (CC BY-SA 2.1 JP). - // - https://creativecommons.org/licenses/by-sa/2.1/jp/deed.en - // - https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode - // - You can generate this code by the script at: - // - https://github.com/vaiorabbit/everyday_use_kanji - // - References: - // - List of Joyo Kanji - // - (Official list by the Agency for Cultural Affairs) https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kakuki/14/tosin02/index.html - // - (Wikipedia) https://en.wikipedia.org/wiki/List_of_j%C5%8Dy%C5%8D_kanji - // - List of Jinmeiyo Kanji - // - (Official list by the Ministry of Justice) http://www.moj.go.jp/MINJI/minji86.html - // - (Wikipedia) https://en.wikipedia.org/wiki/Jinmeiy%C5%8D_kanji - // - Missing 1 Joyo Kanji: U+20B9F (Kun'yomi: Shikaru, On'yomi: Shitsu,shichi), see https://github.com/ocornut/imgui/pull/3627 for details. - // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters. - // (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.) - static const short accumulative_offsets_from_0x4E00[] = - { - 0,1,2,4,1,1,1,1,2,1,3,3,2,2,1,5,3,5,7,5,6,1,2,1,7,2,6,3,1,8,1,1,4,1,1,18,2,11,2,6,2,1,2,1,5,1,2,1,3,1,2,1,2,3,3,1,1,2,3,1,1,1,12,7,9,1,4,5,1, - 1,2,1,10,1,1,9,2,2,4,5,6,9,3,1,1,1,1,9,3,18,5,2,2,2,2,1,6,3,7,1,1,1,1,2,2,4,2,1,23,2,10,4,3,5,2,4,10,2,4,13,1,6,1,9,3,1,1,6,6,7,6,3,1,2,11,3, - 2,2,3,2,15,2,2,5,4,3,6,4,1,2,5,2,12,16,6,13,9,13,2,1,1,7,16,4,7,1,19,1,5,1,2,2,7,7,8,2,6,5,4,9,18,7,4,5,9,13,11,8,15,2,1,1,1,2,1,2,2,1,2,2,8, - 2,9,3,3,1,1,4,4,1,1,1,4,9,1,4,3,5,5,2,7,5,3,4,8,2,1,13,2,3,3,1,14,1,1,4,5,1,3,6,1,5,2,1,1,3,3,3,3,1,1,2,7,6,6,7,1,4,7,6,1,1,1,1,1,12,3,3,9,5, - 2,6,1,5,6,1,2,3,18,2,4,14,4,1,3,6,1,1,6,3,5,5,3,2,2,2,2,12,3,1,4,2,3,2,3,11,1,7,4,1,2,1,3,17,1,9,1,24,1,1,4,2,2,4,1,2,7,1,1,1,3,1,2,2,4,15,1, - 1,2,1,1,2,1,5,2,5,20,2,5,9,1,10,8,7,6,1,1,1,1,1,1,6,2,1,2,8,1,1,1,1,5,1,1,3,1,1,1,1,3,1,1,12,4,1,3,1,1,1,1,1,10,3,1,7,5,13,1,2,3,4,6,1,1,30, - 2,9,9,1,15,38,11,3,1,8,24,7,1,9,8,10,2,1,9,31,2,13,6,2,9,4,49,5,2,15,2,1,10,2,1,1,1,2,2,6,15,30,35,3,14,18,8,1,16,10,28,12,19,45,38,1,3,2,3, - 13,2,1,7,3,6,5,3,4,3,1,5,7,8,1,5,3,18,5,3,6,1,21,4,24,9,24,40,3,14,3,21,3,2,1,2,4,2,3,1,15,15,6,5,1,1,3,1,5,6,1,9,7,3,3,2,1,4,3,8,21,5,16,4, - 5,2,10,11,11,3,6,3,2,9,3,6,13,1,2,1,1,1,1,11,12,6,6,1,4,2,6,5,2,1,1,3,3,6,13,3,1,1,5,1,2,3,3,14,2,1,2,2,2,5,1,9,5,1,1,6,12,3,12,3,4,13,2,14, - 2,8,1,17,5,1,16,4,2,2,21,8,9,6,23,20,12,25,19,9,38,8,3,21,40,25,33,13,4,3,1,4,1,2,4,1,2,5,26,2,1,1,2,1,3,6,2,1,1,1,1,1,1,2,3,1,1,1,9,2,3,1,1, - 1,3,6,3,2,1,1,6,6,1,8,2,2,2,1,4,1,2,3,2,7,3,2,4,1,2,1,2,2,1,1,1,1,1,3,1,2,5,4,10,9,4,9,1,1,1,1,1,1,5,3,2,1,6,4,9,6,1,10,2,31,17,8,3,7,5,40,1, - 7,7,1,6,5,2,10,7,8,4,15,39,25,6,28,47,18,10,7,1,3,1,1,2,1,1,1,3,3,3,1,1,1,3,4,2,1,4,1,3,6,10,7,8,6,2,2,1,3,3,2,5,8,7,9,12,2,15,1,1,4,1,2,1,1, - 1,3,2,1,3,3,5,6,2,3,2,10,1,4,2,8,1,1,1,11,6,1,21,4,16,3,1,3,1,4,2,3,6,5,1,3,1,1,3,3,4,6,1,1,10,4,2,7,10,4,7,4,2,9,4,3,1,1,1,4,1,8,3,4,1,3,1, - 6,1,4,2,1,4,7,2,1,8,1,4,5,1,1,2,2,4,6,2,7,1,10,1,1,3,4,11,10,8,21,4,6,1,3,5,2,1,2,28,5,5,2,3,13,1,2,3,1,4,2,1,5,20,3,8,11,1,3,3,3,1,8,10,9,2, - 10,9,2,3,1,1,2,4,1,8,3,6,1,7,8,6,11,1,4,29,8,4,3,1,2,7,13,1,4,1,6,2,6,12,12,2,20,3,2,3,6,4,8,9,2,7,34,5,1,18,6,1,1,4,4,5,7,9,1,2,2,4,3,4,1,7, - 2,2,2,6,2,3,25,5,3,6,1,4,6,7,4,2,1,4,2,13,6,4,4,3,1,5,3,4,4,3,2,1,1,4,1,2,1,1,3,1,11,1,6,3,1,7,3,6,2,8,8,6,9,3,4,11,3,2,10,12,2,5,11,1,6,4,5, - 3,1,8,5,4,6,6,3,5,1,1,3,2,1,2,2,6,17,12,1,10,1,6,12,1,6,6,19,9,6,16,1,13,4,4,15,7,17,6,11,9,15,12,6,7,2,1,2,2,15,9,3,21,4,6,49,18,7,3,2,3,1, - 6,8,2,2,6,2,9,1,3,6,4,4,1,2,16,2,5,2,1,6,2,3,5,3,1,2,5,1,2,1,9,3,1,8,6,4,8,11,3,1,1,1,1,3,1,13,8,4,1,3,2,2,1,4,1,11,1,5,2,1,5,2,5,8,6,1,1,7, - 4,3,8,3,2,7,2,1,5,1,5,2,4,7,6,2,8,5,1,11,4,5,3,6,18,1,2,13,3,3,1,21,1,1,4,1,4,1,1,1,8,1,2,2,7,1,2,4,2,2,9,2,1,1,1,4,3,6,3,12,5,1,1,1,5,6,3,2, - 4,8,2,2,4,2,7,1,8,9,5,2,3,2,1,3,2,13,7,14,6,5,1,1,2,1,4,2,23,2,1,1,6,3,1,4,1,15,3,1,7,3,9,14,1,3,1,4,1,1,5,8,1,3,8,3,8,15,11,4,14,4,4,2,5,5, - 1,7,1,6,14,7,7,8,5,15,4,8,6,5,6,2,1,13,1,20,15,11,9,2,5,6,2,11,2,6,2,5,1,5,8,4,13,19,25,4,1,1,11,1,34,2,5,9,14,6,2,2,6,1,1,14,1,3,14,13,1,6, - 12,21,14,14,6,32,17,8,32,9,28,1,2,4,11,8,3,1,14,2,5,15,1,1,1,1,3,6,4,1,3,4,11,3,1,1,11,30,1,5,1,4,1,5,8,1,1,3,2,4,3,17,35,2,6,12,17,3,1,6,2, - 1,1,12,2,7,3,3,2,1,16,2,8,3,6,5,4,7,3,3,8,1,9,8,5,1,2,1,3,2,8,1,2,9,12,1,1,2,3,8,3,24,12,4,3,7,5,8,3,3,3,3,3,3,1,23,10,3,1,2,2,6,3,1,16,1,16, - 22,3,10,4,11,6,9,7,7,3,6,2,2,2,4,10,2,1,1,2,8,7,1,6,4,1,3,3,3,5,10,12,12,2,3,12,8,15,1,1,16,6,6,1,5,9,11,4,11,4,2,6,12,1,17,5,13,1,4,9,5,1,11, - 2,1,8,1,5,7,28,8,3,5,10,2,17,3,38,22,1,2,18,12,10,4,38,18,1,4,44,19,4,1,8,4,1,12,1,4,31,12,1,14,7,75,7,5,10,6,6,13,3,2,11,11,3,2,5,28,15,6,18, - 18,5,6,4,3,16,1,7,18,7,36,3,5,3,1,7,1,9,1,10,7,2,4,2,6,2,9,7,4,3,32,12,3,7,10,2,23,16,3,1,12,3,31,4,11,1,3,8,9,5,1,30,15,6,12,3,2,2,11,19,9, - 14,2,6,2,3,19,13,17,5,3,3,25,3,14,1,1,1,36,1,3,2,19,3,13,36,9,13,31,6,4,16,34,2,5,4,2,3,3,5,1,1,1,4,3,1,17,3,2,3,5,3,1,3,2,3,5,6,3,12,11,1,3, - 1,2,26,7,12,7,2,14,3,3,7,7,11,25,25,28,16,4,36,1,2,1,6,2,1,9,3,27,17,4,3,4,13,4,1,3,2,2,1,10,4,2,4,6,3,8,2,1,18,1,1,24,2,2,4,33,2,3,63,7,1,6, - 40,7,3,4,4,2,4,15,18,1,16,1,1,11,2,41,14,1,3,18,13,3,2,4,16,2,17,7,15,24,7,18,13,44,2,2,3,6,1,1,7,5,1,7,1,4,3,3,5,10,8,2,3,1,8,1,1,27,4,2,1, - 12,1,2,1,10,6,1,6,7,5,2,3,7,11,5,11,3,6,6,2,3,15,4,9,1,1,2,1,2,11,2,8,12,8,5,4,2,3,1,5,2,2,1,14,1,12,11,4,1,11,17,17,4,3,2,5,5,7,3,1,5,9,9,8, - 2,5,6,6,13,13,2,1,2,6,1,2,2,49,4,9,1,2,10,16,7,8,4,3,2,23,4,58,3,29,1,14,19,19,11,11,2,7,5,1,3,4,6,2,18,5,12,12,17,17,3,3,2,4,1,6,2,3,4,3,1, - 1,1,1,5,1,1,9,1,3,1,3,6,1,8,1,1,2,6,4,14,3,1,4,11,4,1,3,32,1,2,4,13,4,1,2,4,2,1,3,1,11,1,4,2,1,4,4,6,3,5,1,6,5,7,6,3,23,3,5,3,5,3,3,13,3,9,10, - 1,12,10,2,3,18,13,7,160,52,4,2,2,3,2,14,5,4,12,4,6,4,1,20,4,11,6,2,12,27,1,4,1,2,2,7,4,5,2,28,3,7,25,8,3,19,3,6,10,2,2,1,10,2,5,4,1,3,4,1,5, - 3,2,6,9,3,6,2,16,3,3,16,4,5,5,3,2,1,2,16,15,8,2,6,21,2,4,1,22,5,8,1,1,21,11,2,1,11,11,19,13,12,4,2,3,2,3,6,1,8,11,1,4,2,9,5,2,1,11,2,9,1,1,2, - 14,31,9,3,4,21,14,4,8,1,7,2,2,2,5,1,4,20,3,3,4,10,1,11,9,8,2,1,4,5,14,12,14,2,17,9,6,31,4,14,1,20,13,26,5,2,7,3,6,13,2,4,2,19,6,2,2,18,9,3,5, - 12,12,14,4,6,2,3,6,9,5,22,4,5,25,6,4,8,5,2,6,27,2,35,2,16,3,7,8,8,6,6,5,9,17,2,20,6,19,2,13,3,1,1,1,4,17,12,2,14,7,1,4,18,12,38,33,2,10,1,1, - 2,13,14,17,11,50,6,33,20,26,74,16,23,45,50,13,38,33,6,6,7,4,4,2,1,3,2,5,8,7,8,9,3,11,21,9,13,1,3,10,6,7,1,2,2,18,5,5,1,9,9,2,68,9,19,13,2,5, - 1,4,4,7,4,13,3,9,10,21,17,3,26,2,1,5,2,4,5,4,1,7,4,7,3,4,2,1,6,1,1,20,4,1,9,2,2,1,3,3,2,3,2,1,1,1,20,2,3,1,6,2,3,6,2,4,8,1,3,2,10,3,5,3,4,4, - 3,4,16,1,6,1,10,2,4,2,1,1,2,10,11,2,2,3,1,24,31,4,10,10,2,5,12,16,164,15,4,16,7,9,15,19,17,1,2,1,1,5,1,1,1,1,1,3,1,4,3,1,3,1,3,1,2,1,1,3,3,7, - 2,8,1,2,2,2,1,3,4,3,7,8,12,92,2,10,3,1,3,14,5,25,16,42,4,7,7,4,2,21,5,27,26,27,21,25,30,31,2,1,5,13,3,22,5,6,6,11,9,12,1,5,9,7,5,5,22,60,3,5, - 13,1,1,8,1,1,3,3,2,1,9,3,3,18,4,1,2,3,7,6,3,1,2,3,9,1,3,1,3,2,1,3,1,1,1,2,1,11,3,1,6,9,1,3,2,3,1,2,1,5,1,1,4,3,4,1,2,2,4,4,1,7,2,1,2,2,3,5,13, - 18,3,4,14,9,9,4,16,3,7,5,8,2,6,48,28,3,1,1,4,2,14,8,2,9,2,1,15,2,4,3,2,10,16,12,8,7,1,1,3,1,1,1,2,7,4,1,6,4,38,39,16,23,7,15,15,3,2,12,7,21, - 37,27,6,5,4,8,2,10,8,8,6,5,1,2,1,3,24,1,16,17,9,23,10,17,6,1,51,55,44,13,294,9,3,6,2,4,2,2,15,1,1,1,13,21,17,68,14,8,9,4,1,4,9,3,11,7,1,1,1, - 5,6,3,2,1,1,1,2,3,8,1,2,2,4,1,5,5,2,1,4,3,7,13,4,1,4,1,3,1,1,1,5,5,10,1,6,1,5,2,1,5,2,4,1,4,5,7,3,18,2,9,11,32,4,3,3,2,4,7,11,16,9,11,8,13,38, - 32,8,4,2,1,1,2,1,2,4,4,1,1,1,4,1,21,3,11,1,16,1,1,6,1,3,2,4,9,8,57,7,44,1,3,3,13,3,10,1,1,7,5,2,7,21,47,63,3,15,4,7,1,16,1,1,2,8,2,3,42,15,4, - 1,29,7,22,10,3,78,16,12,20,18,4,67,11,5,1,3,15,6,21,31,32,27,18,13,71,35,5,142,4,10,1,2,50,19,33,16,35,37,16,19,27,7,1,133,19,1,4,8,7,20,1,4, - 4,1,10,3,1,6,1,2,51,5,40,15,24,43,22928,11,1,13,154,70,3,1,1,7,4,10,1,2,1,1,2,1,2,1,2,2,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1, - 3,2,1,1,1,1,2,1,1, - }; - static ImWchar base_ranges[] = // not zero-terminated - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana - 0x31F0, 0x31FF, // Katakana Phonetic Extensions - 0xFF00, 0xFFEF, // Half-width characters - 0xFFFD, 0xFFFD // Invalid - }; - static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(accumulative_offsets_from_0x4E00)*2 + 1] = { 0 }; - if (!full_ranges[0]) - { - memcpy(full_ranges, base_ranges, sizeof(base_ranges)); - UnpackAccumulativeOffsetsIntoRanges(0x4E00, accumulative_offsets_from_0x4E00, IM_ARRAYSIZE(accumulative_offsets_from_0x4E00), full_ranges + IM_ARRAYSIZE(base_ranges)); - } - return &full_ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesCyrillic() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin + Latin Supplement - 0x0400, 0x052F, // Cyrillic + Cyrillic Supplement - 0x2DE0, 0x2DFF, // Cyrillic Extended-A - 0xA640, 0xA69F, // Cyrillic Extended-B - 0, - }; - return &ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesThai() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin - 0x2010, 0x205E, // Punctuations - 0x0E00, 0x0E7F, // Thai - 0, - }; - return &ranges[0]; -} - -const ImWchar* ImFontAtlas::GetGlyphRangesVietnamese() -{ - static const ImWchar ranges[] = - { - 0x0020, 0x00FF, // Basic Latin - 0x0102, 0x0103, - 0x0110, 0x0111, - 0x0128, 0x0129, - 0x0168, 0x0169, - 0x01A0, 0x01A1, - 0x01AF, 0x01B0, - 0x1EA0, 0x1EF9, - 0, - }; - return &ranges[0]; -} - -//----------------------------------------------------------------------------- -// [SECTION] ImFontGlyphRangesBuilder -//----------------------------------------------------------------------------- - -void ImFontGlyphRangesBuilder::AddText(const char* text, const char* text_end) -{ - while (text_end ? (text < text_end) : *text) - { - unsigned int c = 0; - int c_len = ImTextCharFromUtf8(&c, text, text_end); - text += c_len; - if (c_len == 0) - break; - AddChar((ImWchar)c); - } -} - -void ImFontGlyphRangesBuilder::AddRanges(const ImWchar* ranges) -{ - for (; ranges[0]; ranges += 2) - for (unsigned int c = ranges[0]; c <= ranges[1] && c <= IM_UNICODE_CODEPOINT_MAX; c++) //-V560 - AddChar((ImWchar)c); -} - -void ImFontGlyphRangesBuilder::BuildRanges(ImVector* out_ranges) -{ - const int max_codepoint = IM_UNICODE_CODEPOINT_MAX; - for (int n = 0; n <= max_codepoint; n++) - if (GetBit(n)) - { - out_ranges->push_back((ImWchar)n); - while (n < max_codepoint && GetBit(n + 1)) - n++; - out_ranges->push_back((ImWchar)n); - } - out_ranges->push_back(0); -} - -//----------------------------------------------------------------------------- -// [SECTION] ImFont -//----------------------------------------------------------------------------- - -ImFont::ImFont() -{ - FontSize = 0.0f; - FallbackAdvanceX = 0.0f; - FallbackChar = (ImWchar)-1; - EllipsisChar = (ImWchar)-1; - DotChar = (ImWchar)-1; - FallbackGlyph = NULL; - ContainerAtlas = NULL; - ConfigData = NULL; - ConfigDataCount = 0; - DirtyLookupTables = false; - Scale = 1.0f; - Ascent = Descent = 0.0f; - MetricsTotalSurface = 0; - memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap)); -} - -ImFont::~ImFont() -{ - ClearOutputData(); -} - -void ImFont::ClearOutputData() -{ - FontSize = 0.0f; - FallbackAdvanceX = 0.0f; - Glyphs.clear(); - IndexAdvanceX.clear(); - IndexLookup.clear(); - FallbackGlyph = NULL; - ContainerAtlas = NULL; - DirtyLookupTables = true; - Ascent = Descent = 0.0f; - MetricsTotalSurface = 0; -} - -static ImWchar FindFirstExistingGlyph(ImFont* font, const ImWchar* candidate_chars, int candidate_chars_count) -{ - for (int n = 0; n < candidate_chars_count; n++) - if (font->FindGlyphNoFallback(candidate_chars[n]) != NULL) - return candidate_chars[n]; - return (ImWchar)-1; -} - -void ImFont::BuildLookupTable() -{ - int max_codepoint = 0; - for (int i = 0; i != Glyphs.Size; i++) - max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); - - // Build lookup table - IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved - IndexAdvanceX.clear(); - IndexLookup.clear(); - DirtyLookupTables = false; - memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap)); - GrowIndex(max_codepoint + 1); - for (int i = 0; i < Glyphs.Size; i++) - { - int codepoint = (int)Glyphs[i].Codepoint; - IndexAdvanceX[codepoint] = Glyphs[i].AdvanceX; - IndexLookup[codepoint] = (ImWchar)i; - - // Mark 4K page as used - const int page_n = codepoint / 4096; - Used4kPagesMap[page_n >> 3] |= 1 << (page_n & 7); - } - - // Create a glyph to handle TAB - // FIXME: Needs proper TAB handling but it needs to be contextualized (or we could arbitrary say that each string starts at "column 0" ?) - if (FindGlyph((ImWchar)' ')) - { - if (Glyphs.back().Codepoint != '\t') // So we can call this function multiple times (FIXME: Flaky) - Glyphs.resize(Glyphs.Size + 1); - ImFontGlyph& tab_glyph = Glyphs.back(); - tab_glyph = *FindGlyph((ImWchar)' '); - tab_glyph.Codepoint = '\t'; - tab_glyph.AdvanceX *= IM_TABSIZE; - IndexAdvanceX[(int)tab_glyph.Codepoint] = (float)tab_glyph.AdvanceX; - IndexLookup[(int)tab_glyph.Codepoint] = (ImWchar)(Glyphs.Size - 1); - } - - // Mark special glyphs as not visible (note that AddGlyph already mark as non-visible glyphs with zero-size polygons) - SetGlyphVisible((ImWchar)' ', false); - SetGlyphVisible((ImWchar)'\t', false); - - // Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis). - // However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character. - // FIXME: Note that 0x2026 is rarely included in our font ranges. Because of this we are more likely to use three individual dots. - const ImWchar ellipsis_chars[] = { (ImWchar)0x2026, (ImWchar)0x0085 }; - const ImWchar dots_chars[] = { (ImWchar)'.', (ImWchar)0xFF0E }; - if (EllipsisChar == (ImWchar)-1) - EllipsisChar = FindFirstExistingGlyph(this, ellipsis_chars, IM_ARRAYSIZE(ellipsis_chars)); - if (DotChar == (ImWchar)-1) - DotChar = FindFirstExistingGlyph(this, dots_chars, IM_ARRAYSIZE(dots_chars)); - - // Setup fallback character - const ImWchar fallback_chars[] = { (ImWchar)IM_UNICODE_CODEPOINT_INVALID, (ImWchar)'?', (ImWchar)' ' }; - FallbackGlyph = FindGlyphNoFallback(FallbackChar); - if (FallbackGlyph == NULL) - { - FallbackChar = FindFirstExistingGlyph(this, fallback_chars, IM_ARRAYSIZE(fallback_chars)); - FallbackGlyph = FindGlyphNoFallback(FallbackChar); - if (FallbackGlyph == NULL) - { - FallbackGlyph = &Glyphs.back(); - FallbackChar = (ImWchar)FallbackGlyph->Codepoint; - } - } - - FallbackAdvanceX = FallbackGlyph->AdvanceX; - for (int i = 0; i < max_codepoint + 1; i++) - if (IndexAdvanceX[i] < 0.0f) - IndexAdvanceX[i] = FallbackAdvanceX; -} - -// API is designed this way to avoid exposing the 4K page size -// e.g. use with IsGlyphRangeUnused(0, 255) -bool ImFont::IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last) -{ - unsigned int page_begin = (c_begin / 4096); - unsigned int page_last = (c_last / 4096); - for (unsigned int page_n = page_begin; page_n <= page_last; page_n++) - if ((page_n >> 3) < sizeof(Used4kPagesMap)) - if (Used4kPagesMap[page_n >> 3] & (1 << (page_n & 7))) - return false; - return true; -} - -void ImFont::SetGlyphVisible(ImWchar c, bool visible) -{ - if (ImFontGlyph* glyph = (ImFontGlyph*)(void*)FindGlyph((ImWchar)c)) - glyph->Visible = visible ? 1 : 0; -} - -void ImFont::GrowIndex(int new_size) -{ - IM_ASSERT(IndexAdvanceX.Size == IndexLookup.Size); - if (new_size <= IndexLookup.Size) - return; - IndexAdvanceX.resize(new_size, -1.0f); - IndexLookup.resize(new_size, (ImWchar)-1); -} - -// x0/y0/x1/y1 are offset from the character upper-left layout position, in pixels. Therefore x0/y0 are often fairly close to zero. -// Not to be mistaken with texture coordinates, which are held by u0/v0/u1/v1 in normalized format (0.0..1.0 on each texture axis). -// 'cfg' is not necessarily == 'this->ConfigData' because multiple source fonts+configs can be used to build one target font. -void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x) -{ - if (cfg != NULL) - { - // Clamp & recenter if needed - const float advance_x_original = advance_x; - advance_x = ImClamp(advance_x, cfg->GlyphMinAdvanceX, cfg->GlyphMaxAdvanceX); - if (advance_x != advance_x_original) - { - float char_off_x = cfg->PixelSnapH ? ImFloor((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f; - x0 += char_off_x; - x1 += char_off_x; - } - - // Snap to pixel - if (cfg->PixelSnapH) - advance_x = IM_ROUND(advance_x); - - // Bake spacing - advance_x += cfg->GlyphExtraSpacing.x; - } - - Glyphs.resize(Glyphs.Size + 1); - ImFontGlyph& glyph = Glyphs.back(); - glyph.Codepoint = (unsigned int)codepoint; - glyph.Visible = (x0 != x1) && (y0 != y1); - glyph.Colored = false; - glyph.X0 = x0; - glyph.Y0 = y0; - glyph.X1 = x1; - glyph.Y1 = y1; - glyph.U0 = u0; - glyph.V0 = v0; - glyph.U1 = u1; - glyph.V1 = v1; - glyph.AdvanceX = advance_x; - - // Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round) - // We use (U1-U0)*TexWidth instead of X1-X0 to account for oversampling. - float pad = ContainerAtlas->TexGlyphPadding + 0.99f; - DirtyLookupTables = true; - MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + pad) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + pad); -} - -void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst) -{ - IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function. - unsigned int index_size = (unsigned int)IndexLookup.Size; - - if (dst < index_size && IndexLookup.Data[dst] == (ImWchar)-1 && !overwrite_dst) // 'dst' already exists - return; - if (src >= index_size && dst >= index_size) // both 'dst' and 'src' don't exist -> no-op - return; - - GrowIndex(dst + 1); - IndexLookup[dst] = (src < index_size) ? IndexLookup.Data[src] : (ImWchar)-1; - IndexAdvanceX[dst] = (src < index_size) ? IndexAdvanceX.Data[src] : 1.0f; -} - -const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const -{ - if (c >= (size_t)IndexLookup.Size) - return FallbackGlyph; - const ImWchar i = IndexLookup.Data[c]; - if (i == (ImWchar)-1) - return FallbackGlyph; - return &Glyphs.Data[i]; -} - -const ImFontGlyph* ImFont::FindGlyphNoFallback(ImWchar c) const -{ - if (c >= (size_t)IndexLookup.Size) - return NULL; - const ImWchar i = IndexLookup.Data[c]; - if (i == (ImWchar)-1) - return NULL; - return &Glyphs.Data[i]; -} - -const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const -{ - // Simple word-wrapping for English, not full-featured. Please submit failing cases! - // FIXME: Much possible improvements (don't cut things like "word !", "word!!!" but cut within "word,,,,", more sensible support for punctuations, support for Unicode punctuations, etc.) - - // For references, possible wrap point marked with ^ - // "aaa bbb, ccc,ddd. eee fff. ggg!" - // ^ ^ ^ ^ ^__ ^ ^ - - // List of hardcoded separators: .,;!?'" - - // Skip extra blanks after a line returns (that includes not counting them in width computation) - // e.g. "Hello world" --> "Hello" "World" - - // Cut words that cannot possibly fit within one line. - // e.g.: "The tropical fish" with ~5 characters worth of width --> "The tr" "opical" "fish" - - float line_width = 0.0f; - float word_width = 0.0f; - float blank_width = 0.0f; - wrap_width /= scale; // We work with unscaled widths to avoid scaling every characters - - const char* word_end = text; - const char* prev_word_end = NULL; - bool inside_word = true; - - const char* s = text; - while (s < text_end) - { - unsigned int c = (unsigned int)*s; - const char* next_s; - if (c < 0x80) - next_s = s + 1; - else - next_s = s + ImTextCharFromUtf8(&c, s, text_end); - if (c == 0) - break; - - if (c < 32) - { - if (c == '\n') - { - line_width = word_width = blank_width = 0.0f; - inside_word = true; - s = next_s; - continue; - } - if (c == '\r') - { - s = next_s; - continue; - } - } - - const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX); - if (ImCharIsBlankW(c)) - { - if (inside_word) - { - line_width += blank_width; - blank_width = 0.0f; - word_end = s; - } - blank_width += char_width; - inside_word = false; - } - else - { - word_width += char_width; - if (inside_word) - { - word_end = next_s; - } - else - { - prev_word_end = word_end; - line_width += word_width + blank_width; - word_width = blank_width = 0.0f; - } - - // Allow wrapping after punctuation. - inside_word = (c != '.' && c != ',' && c != ';' && c != '!' && c != '?' && c != '\"'); - } - - // We ignore blank width at the end of the line (they can be skipped) - if (line_width + word_width > wrap_width) - { - // Words that cannot possibly fit within an entire line will be cut anywhere. - if (word_width < wrap_width) - s = prev_word_end ? prev_word_end : word_end; - break; - } - - s = next_s; - } - - return s; -} - -ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** remaining) const -{ - if (!text_end) - text_end = text_begin + strlen(text_begin); // FIXME-OPT: Need to avoid this. - - const float line_height = size; - const float scale = size / FontSize; - - ImVec2 text_size = ImVec2(0, 0); - float line_width = 0.0f; - - const bool word_wrap_enabled = (wrap_width > 0.0f); - const char* word_wrap_eol = NULL; - - const char* s = text_begin; - while (s < text_end) - { - if (word_wrap_enabled) - { - // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature. - if (!word_wrap_eol) - { - word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - line_width); - if (word_wrap_eol == s) // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity. - word_wrap_eol++; // +1 may not be a character start point in UTF-8 but it's ok because we use s >= word_wrap_eol below - } - - if (s >= word_wrap_eol) - { - if (text_size.x < line_width) - text_size.x = line_width; - text_size.y += line_height; - line_width = 0.0f; - word_wrap_eol = NULL; - - // Wrapping skips upcoming blanks - while (s < text_end) - { - const char c = *s; - if (ImCharIsBlankA(c)) { s++; } else if (c == '\n') { s++; break; } else { break; } - } - continue; - } - } - - // Decode and advance source - const char* prev_s = s; - unsigned int c = (unsigned int)*s; - if (c < 0x80) - { - s += 1; - } - else - { - s += ImTextCharFromUtf8(&c, s, text_end); - if (c == 0) // Malformed UTF-8? - break; - } - - if (c < 32) - { - if (c == '\n') - { - text_size.x = ImMax(text_size.x, line_width); - text_size.y += line_height; - line_width = 0.0f; - continue; - } - if (c == '\r') - continue; - } - - const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX) * scale; - if (line_width + char_width >= max_width) - { - s = prev_s; - break; - } - - line_width += char_width; - } - - if (text_size.x < line_width) - text_size.x = line_width; - - if (line_width > 0 || text_size.y == 0.0f) - text_size.y += line_height; - - if (remaining) - *remaining = s; - - return text_size; -} - -// Note: as with every ImDrawList drawing function, this expects that the font atlas texture is bound. -void ImFont::RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c) const -{ - const ImFontGlyph* glyph = FindGlyph(c); - if (!glyph || !glyph->Visible) - return; - if (glyph->Colored) - col |= ~IM_COL32_A_MASK; - float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; - float x = IM_FLOOR(pos.x); - float y = IM_FLOOR(pos.y); - draw_list->PrimReserve(6, 4); - draw_list->PrimRectUV(ImVec2(x + glyph->X0 * scale, y + glyph->Y0 * scale), ImVec2(x + glyph->X1 * scale, y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); -} - -// Note: as with every ImDrawList drawing function, this expects that the font atlas texture is bound. -void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const -{ - if (!text_end) - text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls. - - // Align to be pixel perfect - float x = IM_FLOOR(pos.x); - float y = IM_FLOOR(pos.y); - if (y > clip_rect.w) - return; - - const float start_x = x; - const float scale = size / FontSize; - const float line_height = FontSize * scale; - const bool word_wrap_enabled = (wrap_width > 0.0f); - const char* word_wrap_eol = NULL; - - // Fast-forward to first visible line - const char* s = text_begin; - if (y + line_height < clip_rect.y && !word_wrap_enabled) - while (y + line_height < clip_rect.y && s < text_end) - { - s = (const char*)memchr(s, '\n', text_end - s); - s = s ? s + 1 : text_end; - y += line_height; - } - - // For large text, scan for the last visible line in order to avoid over-reserving in the call to PrimReserve() - // Note that very large horizontal line will still be affected by the issue (e.g. a one megabyte string buffer without a newline will likely crash atm) - if (text_end - s > 10000 && !word_wrap_enabled) - { - const char* s_end = s; - float y_end = y; - while (y_end < clip_rect.w && s_end < text_end) - { - s_end = (const char*)memchr(s_end, '\n', text_end - s_end); - s_end = s_end ? s_end + 1 : text_end; - y_end += line_height; - } - text_end = s_end; - } - if (s == text_end) - return; - - // Reserve vertices for remaining worse case (over-reserving is useful and easily amortized) - const int vtx_count_max = (int)(text_end - s) * 4; - const int idx_count_max = (int)(text_end - s) * 6; - const int idx_expected_size = draw_list->IdxBuffer.Size + idx_count_max; - draw_list->PrimReserve(idx_count_max, vtx_count_max); - - ImDrawVert* vtx_write = draw_list->_VtxWritePtr; - ImDrawIdx* idx_write = draw_list->_IdxWritePtr; - unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx; - - const ImU32 col_untinted = col | ~IM_COL32_A_MASK; - - while (s < text_end) - { - if (word_wrap_enabled) - { - // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature. - if (!word_wrap_eol) - { - word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - (x - start_x)); - if (word_wrap_eol == s) // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity. - word_wrap_eol++; // +1 may not be a character start point in UTF-8 but it's ok because we use s >= word_wrap_eol below - } - - if (s >= word_wrap_eol) - { - x = start_x; - y += line_height; - word_wrap_eol = NULL; - - // Wrapping skips upcoming blanks - while (s < text_end) - { - const char c = *s; - if (ImCharIsBlankA(c)) { s++; } else if (c == '\n') { s++; break; } else { break; } - } - continue; - } - } - - // Decode and advance source - unsigned int c = (unsigned int)*s; - if (c < 0x80) - { - s += 1; - } - else - { - s += ImTextCharFromUtf8(&c, s, text_end); - if (c == 0) // Malformed UTF-8? - break; - } - - if (c < 32) - { - if (c == '\n') - { - x = start_x; - y += line_height; - if (y > clip_rect.w) - break; // break out of main loop - continue; - } - if (c == '\r') - continue; - } - - const ImFontGlyph* glyph = FindGlyph((ImWchar)c); - if (glyph == NULL) - continue; - - float char_width = glyph->AdvanceX * scale; - if (glyph->Visible) - { - // We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w - float x1 = x + glyph->X0 * scale; - float x2 = x + glyph->X1 * scale; - float y1 = y + glyph->Y0 * scale; - float y2 = y + glyph->Y1 * scale; - if (x1 <= clip_rect.z && x2 >= clip_rect.x) - { - // Render a character - float u1 = glyph->U0; - float v1 = glyph->V0; - float u2 = glyph->U1; - float v2 = glyph->V1; - - // CPU side clipping used to fit text in their frame when the frame is too small. Only does clipping for axis aligned quads. - if (cpu_fine_clip) - { - if (x1 < clip_rect.x) - { - u1 = u1 + (1.0f - (x2 - clip_rect.x) / (x2 - x1)) * (u2 - u1); - x1 = clip_rect.x; - } - if (y1 < clip_rect.y) - { - v1 = v1 + (1.0f - (y2 - clip_rect.y) / (y2 - y1)) * (v2 - v1); - y1 = clip_rect.y; - } - if (x2 > clip_rect.z) - { - u2 = u1 + ((clip_rect.z - x1) / (x2 - x1)) * (u2 - u1); - x2 = clip_rect.z; - } - if (y2 > clip_rect.w) - { - v2 = v1 + ((clip_rect.w - y1) / (y2 - y1)) * (v2 - v1); - y2 = clip_rect.w; - } - if (y1 >= y2) - { - x += char_width; - continue; - } - } - - // Support for untinted glyphs - ImU32 glyph_col = glyph->Colored ? col_untinted : col; - - // We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug builds. Inlined here: - { - idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2); - idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3); - vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = glyph_col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1; - vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = glyph_col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1; - vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = glyph_col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2; - vtx_write[3].pos.x = x1; vtx_write[3].pos.y = y2; vtx_write[3].col = glyph_col; vtx_write[3].uv.x = u1; vtx_write[3].uv.y = v2; - vtx_write += 4; - vtx_current_idx += 4; - idx_write += 6; - } - } - } - x += char_width; - } - - // Give back unused vertices (clipped ones, blanks) ~ this is essentially a PrimUnreserve() action. - draw_list->VtxBuffer.Size = (int)(vtx_write - draw_list->VtxBuffer.Data); // Same as calling shrink() - draw_list->IdxBuffer.Size = (int)(idx_write - draw_list->IdxBuffer.Data); - draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); - draw_list->_VtxWritePtr = vtx_write; - draw_list->_IdxWritePtr = idx_write; - draw_list->_VtxCurrentIdx = vtx_current_idx; -} - -//----------------------------------------------------------------------------- -// [SECTION] ImGui Internal Render Helpers -//----------------------------------------------------------------------------- -// Vaguely redesigned to stop accessing ImGui global state: -// - RenderArrow() -// - RenderBullet() -// - RenderCheckMark() -// - RenderArrowPointingAt() -// - RenderRectFilledRangeH() -// - RenderRectFilledWithHole() -//----------------------------------------------------------------------------- -// Function in need of a redesign (legacy mess) -// - RenderColorRectWithAlphaCheckerboard() -//----------------------------------------------------------------------------- - -// Render an arrow aimed to be aligned with text (p_min is a position in the same space text would be positioned). To e.g. denote expanded/collapsed state -void ImGui::RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale) -{ - const float h = draw_list->_Data->FontSize * 1.00f; - float r = h * 0.40f * scale; - ImVec2 center = pos + ImVec2(h * 0.50f, h * 0.50f * scale); - - ImVec2 a, b, c; - switch (dir) - { - case ImGuiDir_Up: - case ImGuiDir_Down: - if (dir == ImGuiDir_Up) r = -r; - a = ImVec2(+0.000f, +0.750f) * r; - b = ImVec2(-0.866f, -0.750f) * r; - c = ImVec2(+0.866f, -0.750f) * r; - break; - case ImGuiDir_Left: - case ImGuiDir_Right: - if (dir == ImGuiDir_Left) r = -r; - a = ImVec2(+0.750f, +0.000f) * r; - b = ImVec2(-0.750f, +0.866f) * r; - c = ImVec2(-0.750f, -0.866f) * r; - break; - case ImGuiDir_None: - case ImGuiDir_COUNT: - IM_ASSERT(0); - break; - } - draw_list->AddTriangleFilled(center + a, center + b, center + c, col); -} - -void ImGui::RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col) -{ - draw_list->AddCircleFilled(pos, draw_list->_Data->FontSize * 0.20f, col, 8); -} - -void ImGui::RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz) -{ - float thickness = ImMax(sz / 5.0f, 1.0f); - sz -= thickness * 0.5f; - pos += ImVec2(thickness * 0.25f, thickness * 0.25f); - - float third = sz / 3.0f; - float bx = pos.x + third; - float by = pos.y + sz - third * 0.5f; - draw_list->PathLineTo(ImVec2(bx - third, by - third)); - draw_list->PathLineTo(ImVec2(bx, by)); - draw_list->PathLineTo(ImVec2(bx + third * 2.0f, by - third * 2.0f)); - draw_list->PathStroke(col, 0, thickness); -} - -// Render an arrow. 'pos' is position of the arrow tip. half_sz.x is length from base to tip. half_sz.y is length on each side. -void ImGui::RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col) -{ - switch (direction) - { - case ImGuiDir_Left: draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), pos, col); return; - case ImGuiDir_Right: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), pos, col); return; - case ImGuiDir_Up: draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), pos, col); return; - case ImGuiDir_Down: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), pos, col); return; - case ImGuiDir_None: case ImGuiDir_COUNT: break; // Fix warnings - } -} - -static inline float ImAcos01(float x) -{ - if (x <= 0.0f) return IM_PI * 0.5f; - if (x >= 1.0f) return 0.0f; - return ImAcos(x); - //return (-0.69813170079773212f * x * x - 0.87266462599716477f) * x + 1.5707963267948966f; // Cheap approximation, may be enough for what we do. -} - -// FIXME: Cleanup and move code to ImDrawList. -void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding) -{ - if (x_end_norm == x_start_norm) - return; - if (x_start_norm > x_end_norm) - ImSwap(x_start_norm, x_end_norm); - - ImVec2 p0 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_start_norm), rect.Min.y); - ImVec2 p1 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_end_norm), rect.Max.y); - if (rounding == 0.0f) - { - draw_list->AddRectFilled(p0, p1, col, 0.0f); - return; - } - - rounding = ImClamp(ImMin((rect.Max.x - rect.Min.x) * 0.5f, (rect.Max.y - rect.Min.y) * 0.5f) - 1.0f, 0.0f, rounding); - const float inv_rounding = 1.0f / rounding; - const float arc0_b = ImAcos01(1.0f - (p0.x - rect.Min.x) * inv_rounding); - const float arc0_e = ImAcos01(1.0f - (p1.x - rect.Min.x) * inv_rounding); - const float half_pi = IM_PI * 0.5f; // We will == compare to this because we know this is the exact value ImAcos01 can return. - const float x0 = ImMax(p0.x, rect.Min.x + rounding); - if (arc0_b == arc0_e) - { - draw_list->PathLineTo(ImVec2(x0, p1.y)); - draw_list->PathLineTo(ImVec2(x0, p0.y)); - } - else if (arc0_b == 0.0f && arc0_e == half_pi) - { - draw_list->PathArcToFast(ImVec2(x0, p1.y - rounding), rounding, 3, 6); // BL - draw_list->PathArcToFast(ImVec2(x0, p0.y + rounding), rounding, 6, 9); // TR - } - else - { - draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL - draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR - } - if (p1.x > rect.Min.x + rounding) - { - const float arc1_b = ImAcos01(1.0f - (rect.Max.x - p1.x) * inv_rounding); - const float arc1_e = ImAcos01(1.0f - (rect.Max.x - p0.x) * inv_rounding); - const float x1 = ImMin(p1.x, rect.Max.x - rounding); - if (arc1_b == arc1_e) - { - draw_list->PathLineTo(ImVec2(x1, p0.y)); - draw_list->PathLineTo(ImVec2(x1, p1.y)); - } - else if (arc1_b == 0.0f && arc1_e == half_pi) - { - draw_list->PathArcToFast(ImVec2(x1, p0.y + rounding), rounding, 9, 12); // TR - draw_list->PathArcToFast(ImVec2(x1, p1.y - rounding), rounding, 0, 3); // BR - } - else - { - draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR - draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR - } - } - draw_list->PathFillConvex(col); -} - -void ImGui::RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding) -{ - const bool fill_L = (inner.Min.x > outer.Min.x); - const bool fill_R = (inner.Max.x < outer.Max.x); - const bool fill_U = (inner.Min.y > outer.Min.y); - const bool fill_D = (inner.Max.y < outer.Max.y); - if (fill_L) draw_list->AddRectFilled(ImVec2(outer.Min.x, inner.Min.y), ImVec2(inner.Min.x, inner.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_U ? 0 : ImDrawFlags_RoundCornersTopLeft) | (fill_D ? 0 : ImDrawFlags_RoundCornersBottomLeft)); - if (fill_R) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Min.y), ImVec2(outer.Max.x, inner.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_U ? 0 : ImDrawFlags_RoundCornersTopRight) | (fill_D ? 0 : ImDrawFlags_RoundCornersBottomRight)); - if (fill_U) draw_list->AddRectFilled(ImVec2(inner.Min.x, outer.Min.y), ImVec2(inner.Max.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_L ? 0 : ImDrawFlags_RoundCornersTopLeft) | (fill_R ? 0 : ImDrawFlags_RoundCornersTopRight)); - if (fill_D) draw_list->AddRectFilled(ImVec2(inner.Min.x, inner.Max.y), ImVec2(inner.Max.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_L ? 0 : ImDrawFlags_RoundCornersBottomLeft) | (fill_R ? 0 : ImDrawFlags_RoundCornersBottomRight)); - if (fill_L && fill_U) draw_list->AddRectFilled(ImVec2(outer.Min.x, outer.Min.y), ImVec2(inner.Min.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersTopLeft); - if (fill_R && fill_U) draw_list->AddRectFilled(ImVec2(inner.Max.x, outer.Min.y), ImVec2(outer.Max.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersTopRight); - if (fill_L && fill_D) draw_list->AddRectFilled(ImVec2(outer.Min.x, inner.Max.y), ImVec2(inner.Min.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersBottomLeft); - if (fill_R && fill_D) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Max.y), ImVec2(outer.Max.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersBottomRight); -} - -// Helper for ColorPicker4() -// NB: This is rather brittle and will show artifact when rounding this enabled if rounded corners overlap multiple cells. Caller currently responsible for avoiding that. -// Spent a non reasonable amount of time trying to getting this right for ColorButton with rounding+anti-aliasing+ImGuiColorEditFlags_HalfAlphaPreview flag + various grid sizes and offsets, and eventually gave up... probably more reasonable to disable rounding altogether. -// FIXME: uses ImGui::GetColorU32 -void ImGui::RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 col, float grid_step, ImVec2 grid_off, float rounding, ImDrawFlags flags) -{ - if ((flags & ImDrawFlags_RoundCornersMask_) == 0) - flags = ImDrawFlags_RoundCornersDefault_; - if (((col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT) < 0xFF) - { - ImU32 col_bg1 = GetColorU32(ImAlphaBlendColors(IM_COL32(204, 204, 204, 255), col)); - ImU32 col_bg2 = GetColorU32(ImAlphaBlendColors(IM_COL32(128, 128, 128, 255), col)); - draw_list->AddRectFilled(p_min, p_max, col_bg1, rounding, flags); - - int yi = 0; - for (float y = p_min.y + grid_off.y; y < p_max.y; y += grid_step, yi++) - { - float y1 = ImClamp(y, p_min.y, p_max.y), y2 = ImMin(y + grid_step, p_max.y); - if (y2 <= y1) - continue; - for (float x = p_min.x + grid_off.x + (yi & 1) * grid_step; x < p_max.x; x += grid_step * 2.0f) - { - float x1 = ImClamp(x, p_min.x, p_max.x), x2 = ImMin(x + grid_step, p_max.x); - if (x2 <= x1) - continue; - ImDrawFlags cell_flags = ImDrawFlags_RoundCornersNone; - if (y1 <= p_min.y) { if (x1 <= p_min.x) cell_flags |= ImDrawFlags_RoundCornersTopLeft; if (x2 >= p_max.x) cell_flags |= ImDrawFlags_RoundCornersTopRight; } - if (y2 >= p_max.y) { if (x1 <= p_min.x) cell_flags |= ImDrawFlags_RoundCornersBottomLeft; if (x2 >= p_max.x) cell_flags |= ImDrawFlags_RoundCornersBottomRight; } - - // Combine flags - cell_flags = (flags == ImDrawFlags_RoundCornersNone || cell_flags == ImDrawFlags_RoundCornersNone) ? ImDrawFlags_RoundCornersNone : (cell_flags & flags); - draw_list->AddRectFilled(ImVec2(x1, y1), ImVec2(x2, y2), col_bg2, rounding, cell_flags); - } - } - } - else - { - draw_list->AddRectFilled(p_min, p_max, col, rounding, flags); - } -} - -//----------------------------------------------------------------------------- -// [SECTION] Decompression code -//----------------------------------------------------------------------------- -// Compressed with stb_compress() then converted to a C array and encoded as base85. -// Use the program in misc/fonts/binary_to_compressed_c.cpp to create the array from a TTF file. -// The purpose of encoding as base85 instead of "0x00,0x01,..." style is only save on _source code_ size. -// Decompression from stb.h (public domain) by Sean Barrett https://github.com/nothings/stb/blob/master/stb.h -//----------------------------------------------------------------------------- - -static unsigned int stb_decompress_length(const unsigned char *input) -{ - return (input[8] << 24) + (input[9] << 16) + (input[10] << 8) + input[11]; -} - -static unsigned char *stb__barrier_out_e, *stb__barrier_out_b; -static const unsigned char *stb__barrier_in_b; -static unsigned char *stb__dout; -static void stb__match(const unsigned char *data, unsigned int length) -{ - // INVERSE of memmove... write each byte before copying the next... - IM_ASSERT(stb__dout + length <= stb__barrier_out_e); - if (stb__dout + length > stb__barrier_out_e) { stb__dout += length; return; } - if (data < stb__barrier_out_b) { stb__dout = stb__barrier_out_e+1; return; } - while (length--) *stb__dout++ = *data++; -} - -static void stb__lit(const unsigned char *data, unsigned int length) -{ - IM_ASSERT(stb__dout + length <= stb__barrier_out_e); - if (stb__dout + length > stb__barrier_out_e) { stb__dout += length; return; } - if (data < stb__barrier_in_b) { stb__dout = stb__barrier_out_e+1; return; } - memcpy(stb__dout, data, length); - stb__dout += length; -} - -#define stb__in2(x) ((i[x] << 8) + i[(x)+1]) -#define stb__in3(x) ((i[x] << 16) + stb__in2((x)+1)) -#define stb__in4(x) ((i[x] << 24) + stb__in3((x)+1)) - -static const unsigned char *stb_decompress_token(const unsigned char *i) -{ - if (*i >= 0x20) { // use fewer if's for cases that expand small - if (*i >= 0x80) stb__match(stb__dout-i[1]-1, i[0] - 0x80 + 1), i += 2; - else if (*i >= 0x40) stb__match(stb__dout-(stb__in2(0) - 0x4000 + 1), i[2]+1), i += 3; - else /* *i >= 0x20 */ stb__lit(i+1, i[0] - 0x20 + 1), i += 1 + (i[0] - 0x20 + 1); - } else { // more ifs for cases that expand large, since overhead is amortized - if (*i >= 0x18) stb__match(stb__dout-(stb__in3(0) - 0x180000 + 1), i[3]+1), i += 4; - else if (*i >= 0x10) stb__match(stb__dout-(stb__in3(0) - 0x100000 + 1), stb__in2(3)+1), i += 5; - else if (*i >= 0x08) stb__lit(i+2, stb__in2(0) - 0x0800 + 1), i += 2 + (stb__in2(0) - 0x0800 + 1); - else if (*i == 0x07) stb__lit(i+3, stb__in2(1) + 1), i += 3 + (stb__in2(1) + 1); - else if (*i == 0x06) stb__match(stb__dout-(stb__in3(1)+1), i[4]+1), i += 5; - else if (*i == 0x04) stb__match(stb__dout-(stb__in3(1)+1), stb__in2(4)+1), i += 6; - } - return i; -} - -static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen) -{ - const unsigned long ADLER_MOD = 65521; - unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; - unsigned long blocklen = buflen % 5552; - - unsigned long i; - while (buflen) { - for (i=0; i + 7 < blocklen; i += 8) { - s1 += buffer[0], s2 += s1; - s1 += buffer[1], s2 += s1; - s1 += buffer[2], s2 += s1; - s1 += buffer[3], s2 += s1; - s1 += buffer[4], s2 += s1; - s1 += buffer[5], s2 += s1; - s1 += buffer[6], s2 += s1; - s1 += buffer[7], s2 += s1; - - buffer += 8; - } - - for (; i < blocklen; ++i) - s1 += *buffer++, s2 += s1; - - s1 %= ADLER_MOD, s2 %= ADLER_MOD; - buflen -= blocklen; - blocklen = 5552; - } - return (unsigned int)(s2 << 16) + (unsigned int)s1; -} - -static unsigned int stb_decompress(unsigned char *output, const unsigned char *i, unsigned int /*length*/) -{ - if (stb__in4(0) != 0x57bC0000) return 0; - if (stb__in4(4) != 0) return 0; // error! stream is > 4GB - const unsigned int olen = stb_decompress_length(i); - stb__barrier_in_b = i; - stb__barrier_out_e = output + olen; - stb__barrier_out_b = output; - i += 16; - - stb__dout = output; - for (;;) { - const unsigned char *old_i = i; - i = stb_decompress_token(i); - if (i == old_i) { - if (*i == 0x05 && i[1] == 0xfa) { - IM_ASSERT(stb__dout == output + olen); - if (stb__dout != output + olen) return 0; - if (stb_adler32(1, output, olen) != (unsigned int) stb__in4(2)) - return 0; - return olen; - } else { - IM_ASSERT(0); /* NOTREACHED */ - return 0; - } - } - IM_ASSERT(stb__dout <= output + olen); - if (stb__dout > output + olen) - return 0; - } -} - -//----------------------------------------------------------------------------- -// [SECTION] Default font data (ProggyClean.ttf) -//----------------------------------------------------------------------------- -// ProggyClean.ttf -// Copyright (c) 2004, 2005 Tristan Grimmer -// MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip) -// Download and more information at http://upperbounds.net -//----------------------------------------------------------------------------- -// File: 'ProggyClean.ttf' (41208 bytes) -// Exported using misc/fonts/binary_to_compressed_c.cpp (with compression + base85 string encoding). -// The purpose of encoding as base85 instead of "0x00,0x01,..." style is only save on _source code_ size. -//----------------------------------------------------------------------------- -static const char proggy_clean_ttf_compressed_data_base85[11980 + 1] = - "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/" - "2*>]b(MC;$jPfY.;h^`IWM9Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1=Ke$$'5F%)]0^#0X@U.a$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;--VsM.M0rJfLH2eTM`*oJMHRC`N" - "kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`�j@'DbG&#^$PG.Ll+DNa&VZ>1i%h1S9u5o@YaaW$e+bROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc." - "x]Ip.PH^'/aqUO/$1WxLoW0[iLAw=4h(9.`G" - "CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?Ggv:[7MI2k).'2($5FNP&EQ(,)" - "U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#" - "'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM" - "_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu" - "Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/" - "/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[Ket`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO" - "j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%" - "LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$MhLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]" - "%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et" - "Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:" - "a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VBpqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<-+k?'(^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M" - "D?@f&1'BW-)Ju#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX(" - "P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs" - "bIu)'Z,*[>br5fX^:FPAWr-m2KgLQ_nN6'8uTGT5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q" - "h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aege0jT6'N#(q%.O=?2S]u*(m<-" - "V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i" - "sZ88+dKQ)W6>J%CL`.d*(B`-n8D9oK-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P r+$%CE=68>K8r0=dSC%%(@p7" - ".m7jilQ02'0-VWAgTlGW'b)Tq7VT9q^*^$$.:&N@@" - "$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*" - "hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u" - "@-W$U%VEQ/,,>>#)D#%8cY#YZ?=,`Wdxu/ae&#" - "w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$so8lKN%5/$(vdfq7+ebA#" - "u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoFDoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8" - "6e%B/:=>)N4xeW.*wft-;$'58-ESqr#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#" - "b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjLV#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#SfD07&6D@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5" - "_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%" - "hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;" - "^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmLq9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:" - "+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3$U4O]GKx'm9)b@p7YsvK3w^YR-" - "CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*" - "hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdFTi1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IXSsDiWP,##P`%/L-" - "S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdFl*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj" - "M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#$(>.Z-I&J(Q0Hd5Q%7Co-b`-cP)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8WlA2);Sa" - ">gXm8YB`1d@K#n]76-a$U,mF%Ul:#/'xoFM9QX-$.QN'>" - "[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I" - "wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-uW%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)" - "i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo" - "1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P" - "iDDG)g,r%+?,$@?uou5tSe2aN_AQU*'IAO" - "URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#" - ";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T" - "w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4" - "A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#" - "/QHC#3^ZC#7jmC#;v)D#?,)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP" - "GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp" - "O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#"; - -static const char* GetDefaultCompressedFontDataTTFBase85() -{ - return proggy_clean_ttf_compressed_data_base85; -} - -#endif // #ifndef IMGUI_DISABLE diff --git a/dependencies/reboot/vendor/ImGui/imgui_impl_dx9.cpp b/dependencies/reboot/vendor/ImGui/imgui_impl_dx9.cpp deleted file mode 100644 index dfb13a4..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_impl_dx9.cpp +++ /dev/null @@ -1,378 +0,0 @@ -// dear imgui: Renderer Backend for DirectX9 -// This needs to be used along with a Platform Backend (e.g. Win32) - -// Implemented features: -// [X] Renderer: User texture binding. Use 'LPDIRECT3DTEXTURE9' as ImTextureID. Read the FAQ about ImTextureID! -// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices. - -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. -// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs - -// CHANGELOG -// (minor and older changes stripped away, please see git history for details) -// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). -// 2021-06-25: DirectX9: Explicitly disable texture state stages after >= 1. -// 2021-05-19: DirectX9: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) -// 2021-04-23: DirectX9: Explicitly setting up more graphics states to increase compatibility with unusual non-default states. -// 2021-03-18: DirectX9: Calling IDirect3DStateBlock9::Capture() after CreateStateBlock() as a workaround for state restoring issues (see #3857). -// 2021-03-03: DirectX9: Added support for IMGUI_USE_BGRA_PACKED_COLOR in user's imconfig file. -// 2021-02-18: DirectX9: Change blending equation to preserve alpha in output buffer. -// 2019-05-29: DirectX9: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. -// 2019-04-30: DirectX9: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. -// 2019-03-29: Misc: Fixed erroneous assert in ImGui_ImplDX9_InvalidateDeviceObjects(). -// 2019-01-16: Misc: Disabled fog before drawing UI's. Fixes issue #2288. -// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. -// 2018-06-08: Misc: Extracted imgui_impl_dx9.cpp/.h away from the old combined DX9+Win32 example. -// 2018-06-08: DirectX9: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. -// 2018-05-07: Render: Saving/restoring Transform because they don't seem to be included in the StateBlock. Setting shading mode to Gouraud. -// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX9_RenderDrawData() in the .h file so you can call it yourself. -// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. - -#include "imgui.h" -#include "imgui_impl_dx9.h" - -// DirectX -#include - -// DirectX data -struct ImGui_ImplDX9_Data -{ - LPDIRECT3DDEVICE9 pd3dDevice; - LPDIRECT3DVERTEXBUFFER9 pVB; - LPDIRECT3DINDEXBUFFER9 pIB; - LPDIRECT3DTEXTURE9 FontTexture; - int VertexBufferSize; - int IndexBufferSize; - - ImGui_ImplDX9_Data() { memset((void*)this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; } -}; - -struct CUSTOMVERTEX -{ - float pos[3]; - D3DCOLOR col; - float uv[2]; -}; -#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1) - -#ifdef IMGUI_USE_BGRA_PACKED_COLOR -#define IMGUI_COL_TO_DX9_ARGB(_COL) (_COL) -#else -#define IMGUI_COL_TO_DX9_ARGB(_COL) (((_COL) & 0xFF00FF00) | (((_COL) & 0xFF0000) >> 16) | (((_COL) & 0xFF) << 16)) -#endif - -// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts -// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. -static ImGui_ImplDX9_Data* ImGui_ImplDX9_GetBackendData() -{ - return ImGui::GetCurrentContext() ? (ImGui_ImplDX9_Data*)ImGui::GetIO().BackendRendererUserData : NULL; -} - -// Functions -static void ImGui_ImplDX9_SetupRenderState(ImDrawData* draw_data) -{ - ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); - - // Setup viewport - D3DVIEWPORT9 vp; - vp.X = vp.Y = 0; - vp.Width = (DWORD)draw_data->DisplaySize.x; - vp.Height = (DWORD)draw_data->DisplaySize.y; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - bd->pd3dDevice->SetViewport(&vp); - - // Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing, shade mode (for gradient), bilinear sampling. - bd->pd3dDevice->SetPixelShader(NULL); - bd->pd3dDevice->SetVertexShader(NULL); - bd->pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - bd->pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); - bd->pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - bd->pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - bd->pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - bd->pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE); - bd->pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - bd->pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); - bd->pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - bd->pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - bd->pd3dDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); - bd->pd3dDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE); - bd->pd3dDevice->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA); - bd->pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); - bd->pd3dDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); - bd->pd3dDevice->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE); - bd->pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, FALSE); - bd->pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); - bd->pd3dDevice->SetRenderState(D3DRS_CLIPPING, TRUE); - bd->pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); - bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); - bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); - bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); - bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); - bd->pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - bd->pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); - bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - - // Setup orthographic projection matrix - // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. - // Being agnostic of whether or can be used, we aren't relying on D3DXMatrixIdentity()/D3DXMatrixOrthoOffCenterLH() or DirectX::XMMatrixIdentity()/DirectX::XMMatrixOrthographicOffCenterLH() - { - float L = draw_data->DisplayPos.x + 0.5f; - float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x + 0.5f; - float T = draw_data->DisplayPos.y + 0.5f; - float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y + 0.5f; - D3DMATRIX mat_identity = { { { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } } }; - D3DMATRIX mat_projection = - { { { - 2.0f/(R-L), 0.0f, 0.0f, 0.0f, - 0.0f, 2.0f/(T-B), 0.0f, 0.0f, - 0.0f, 0.0f, 0.5f, 0.0f, - (L+R)/(L-R), (T+B)/(B-T), 0.5f, 1.0f - } } }; - bd->pd3dDevice->SetTransform(D3DTS_WORLD, &mat_identity); - bd->pd3dDevice->SetTransform(D3DTS_VIEW, &mat_identity); - bd->pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat_projection); - } -} - -// Render function. -void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data) -{ - // Avoid rendering when minimized - if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f) - return; - - // Create and grow buffers if needed - ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); - if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount) - { - if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; } - bd->VertexBufferSize = draw_data->TotalVtxCount + 5000; - if (bd->pd3dDevice->CreateVertexBuffer(bd->VertexBufferSize * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &bd->pVB, NULL) < 0) - return; - } - if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount) - { - if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; } - bd->IndexBufferSize = draw_data->TotalIdxCount + 10000; - if (bd->pd3dDevice->CreateIndexBuffer(bd->IndexBufferSize * sizeof(ImDrawIdx), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, sizeof(ImDrawIdx) == 2 ? D3DFMT_INDEX16 : D3DFMT_INDEX32, D3DPOOL_DEFAULT, &bd->pIB, NULL) < 0) - return; - } - - // Backup the DX9 state - IDirect3DStateBlock9* d3d9_state_block = NULL; - if (bd->pd3dDevice->CreateStateBlock(D3DSBT_ALL, &d3d9_state_block) < 0) - return; - if (d3d9_state_block->Capture() < 0) - { - d3d9_state_block->Release(); - return; - } - - // Backup the DX9 transform (DX9 documentation suggests that it is included in the StateBlock but it doesn't appear to) - D3DMATRIX last_world, last_view, last_projection; - bd->pd3dDevice->GetTransform(D3DTS_WORLD, &last_world); - bd->pd3dDevice->GetTransform(D3DTS_VIEW, &last_view); - bd->pd3dDevice->GetTransform(D3DTS_PROJECTION, &last_projection); - - // Allocate buffers - CUSTOMVERTEX* vtx_dst; - ImDrawIdx* idx_dst; - if (bd->pVB->Lock(0, (UINT)(draw_data->TotalVtxCount * sizeof(CUSTOMVERTEX)), (void**)&vtx_dst, D3DLOCK_DISCARD) < 0) - { - d3d9_state_block->Release(); - return; - } - if (bd->pIB->Lock(0, (UINT)(draw_data->TotalIdxCount * sizeof(ImDrawIdx)), (void**)&idx_dst, D3DLOCK_DISCARD) < 0) - { - bd->pVB->Unlock(); - d3d9_state_block->Release(); - return; - } - - // Copy and convert all vertices into a single contiguous buffer, convert colors to DX9 default format. - // FIXME-OPT: This is a minor waste of resource, the ideal is to use imconfig.h and - // 1) to avoid repacking colors: #define IMGUI_USE_BGRA_PACKED_COLOR - // 2) to avoid repacking vertices: #define IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT struct ImDrawVert { ImVec2 pos; float z; ImU32 col; ImVec2 uv; } - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawList* cmd_list = draw_data->CmdLists[n]; - const ImDrawVert* vtx_src = cmd_list->VtxBuffer.Data; - for (int i = 0; i < cmd_list->VtxBuffer.Size; i++) - { - vtx_dst->pos[0] = vtx_src->pos.x; - vtx_dst->pos[1] = vtx_src->pos.y; - vtx_dst->pos[2] = 0.0f; - vtx_dst->col = IMGUI_COL_TO_DX9_ARGB(vtx_src->col); - vtx_dst->uv[0] = vtx_src->uv.x; - vtx_dst->uv[1] = vtx_src->uv.y; - vtx_dst++; - vtx_src++; - } - memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); - idx_dst += cmd_list->IdxBuffer.Size; - } - bd->pVB->Unlock(); - bd->pIB->Unlock(); - bd->pd3dDevice->SetStreamSource(0, bd->pVB, 0, sizeof(CUSTOMVERTEX)); - bd->pd3dDevice->SetIndices(bd->pIB); - bd->pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); - - // Setup desired DX state - ImGui_ImplDX9_SetupRenderState(draw_data); - - // Render command lists - // (Because we merged all buffers into a single one, we maintain our own offset into them) - int global_vtx_offset = 0; - int global_idx_offset = 0; - ImVec2 clip_off = draw_data->DisplayPos; - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawList* cmd_list = draw_data->CmdLists[n]; - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) - { - const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; - if (pcmd->UserCallback != NULL) - { - // User callback, registered via ImDrawList::AddCallback() - // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) - if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) - ImGui_ImplDX9_SetupRenderState(draw_data); - else - pcmd->UserCallback(cmd_list, pcmd); - } - else - { - // Project scissor/clipping rectangles into framebuffer space - ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); - ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); - if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) - continue; - - // Apply Scissor/clipping rectangle, Bind texture, Draw - const RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y }; - const LPDIRECT3DTEXTURE9 texture = (LPDIRECT3DTEXTURE9)pcmd->GetTexID(); - bd->pd3dDevice->SetTexture(0, texture); - bd->pd3dDevice->SetScissorRect(&r); - bd->pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, pcmd->VtxOffset + global_vtx_offset, 0, (UINT)cmd_list->VtxBuffer.Size, pcmd->IdxOffset + global_idx_offset, pcmd->ElemCount / 3); - } - } - global_idx_offset += cmd_list->IdxBuffer.Size; - global_vtx_offset += cmd_list->VtxBuffer.Size; - } - - // Restore the DX9 transform - bd->pd3dDevice->SetTransform(D3DTS_WORLD, &last_world); - bd->pd3dDevice->SetTransform(D3DTS_VIEW, &last_view); - bd->pd3dDevice->SetTransform(D3DTS_PROJECTION, &last_projection); - - // Restore the DX9 state - d3d9_state_block->Apply(); - d3d9_state_block->Release(); -} - -bool ImGui_ImplDX9_Init(IDirect3DDevice9* device) -{ - ImGuiIO& io = ImGui::GetIO(); - IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!"); - - // Setup backend capabilities flags - ImGui_ImplDX9_Data* bd = IM_NEW(ImGui_ImplDX9_Data)(); - io.BackendRendererUserData = (void*)bd; - io.BackendRendererName = "imgui_impl_dx9"; - io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. - - bd->pd3dDevice = device; - bd->pd3dDevice->AddRef(); - - return true; -} - -void ImGui_ImplDX9_Shutdown() -{ - ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); - IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?"); - ImGuiIO& io = ImGui::GetIO(); - - ImGui_ImplDX9_InvalidateDeviceObjects(); - if (bd->pd3dDevice) { bd->pd3dDevice->Release(); } - io.BackendRendererName = NULL; - io.BackendRendererUserData = NULL; - IM_DELETE(bd); -} - -static bool ImGui_ImplDX9_CreateFontsTexture() -{ - // Build texture atlas - ImGuiIO& io = ImGui::GetIO(); - ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); - unsigned char* pixels; - int width, height, bytes_per_pixel; - io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, &bytes_per_pixel); - - // Convert RGBA32 to BGRA32 (because RGBA32 is not well supported by DX9 devices) -#ifndef IMGUI_USE_BGRA_PACKED_COLOR - if (io.Fonts->TexPixelsUseColors) - { - ImU32* dst_start = (ImU32*)ImGui::MemAlloc((size_t)width * height * bytes_per_pixel); - for (ImU32* src = (ImU32*)pixels, *dst = dst_start, *dst_end = dst_start + (size_t)width * height; dst < dst_end; src++, dst++) - *dst = IMGUI_COL_TO_DX9_ARGB(*src); - pixels = (unsigned char*)dst_start; - } -#endif - - // Upload texture to graphics system - bd->FontTexture = NULL; - if (bd->pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bd->FontTexture, NULL) < 0) - return false; - D3DLOCKED_RECT tex_locked_rect; - if (bd->FontTexture->LockRect(0, &tex_locked_rect, NULL, 0) != D3D_OK) - return false; - for (int y = 0; y < height; y++) - memcpy((unsigned char*)tex_locked_rect.pBits + (size_t)tex_locked_rect.Pitch * y, pixels + (size_t)width * bytes_per_pixel * y, (size_t)width * bytes_per_pixel); - bd->FontTexture->UnlockRect(0); - - // Store our identifier - io.Fonts->SetTexID((ImTextureID)bd->FontTexture); - -#ifndef IMGUI_USE_BGRA_PACKED_COLOR - if (io.Fonts->TexPixelsUseColors) - ImGui::MemFree(pixels); -#endif - - return true; -} - -bool ImGui_ImplDX9_CreateDeviceObjects() -{ - ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); - if (!bd || !bd->pd3dDevice) - return false; - if (!ImGui_ImplDX9_CreateFontsTexture()) - return false; - return true; -} - -void ImGui_ImplDX9_InvalidateDeviceObjects() -{ - ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); - if (!bd || !bd->pd3dDevice) - return; - if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; } - if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; } - if (bd->FontTexture) { bd->FontTexture->Release(); bd->FontTexture = NULL; ImGui::GetIO().Fonts->SetTexID(NULL); } // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well. -} - -void ImGui_ImplDX9_NewFrame() -{ - ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); - IM_ASSERT(bd != NULL && "Did you call ImGui_ImplDX9_Init()?"); - - if (!bd->FontTexture) - ImGui_ImplDX9_CreateDeviceObjects(); -} diff --git a/dependencies/reboot/vendor/ImGui/imgui_impl_dx9.h b/dependencies/reboot/vendor/ImGui/imgui_impl_dx9.h deleted file mode 100644 index 6dc805b..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_impl_dx9.h +++ /dev/null @@ -1,25 +0,0 @@ -// dear imgui: Renderer Backend for DirectX9 -// This needs to be used along with a Platform Backend (e.g. Win32) - -// Implemented features: -// [X] Renderer: User texture binding. Use 'LPDIRECT3DTEXTURE9' as ImTextureID. Read the FAQ about ImTextureID! -// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices. - -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. -// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs - -#pragma once -#include "imgui.h" // IMGUI_IMPL_API - -struct IDirect3DDevice9; - -IMGUI_IMPL_API bool ImGui_ImplDX9_Init(IDirect3DDevice9* device); -IMGUI_IMPL_API void ImGui_ImplDX9_Shutdown(); -IMGUI_IMPL_API void ImGui_ImplDX9_NewFrame(); -IMGUI_IMPL_API void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data); - -// Use if you want to reset your rendering device without losing Dear ImGui state. -IMGUI_IMPL_API bool ImGui_ImplDX9_CreateDeviceObjects(); -IMGUI_IMPL_API void ImGui_ImplDX9_InvalidateDeviceObjects(); diff --git a/dependencies/reboot/vendor/ImGui/imgui_impl_win32.cpp b/dependencies/reboot/vendor/ImGui/imgui_impl_win32.cpp deleted file mode 100644 index d98ca43..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_impl_win32.cpp +++ /dev/null @@ -1,791 +0,0 @@ -// dear imgui: Platform Backend for Windows (standard windows API for 32 and 64 bits applications) -// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) - -// Implemented features: -// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui) -// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] -// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. -// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. - -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. -// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs - -#include "imgui.h" -#include "imgui_impl_win32.h" -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include // GET_X_LPARAM(), GET_Y_LPARAM() -#include -#include - -// Configuration flags to add in your imconfig.h file: -//#define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD // Disable gamepad support. This was meaningful before <1.81 but we now load XInput dynamically so the option is now less relevant. - -// Using XInput for gamepad (will load DLL dynamically) -#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD -#include -typedef DWORD (WINAPI *PFN_XInputGetCapabilities)(DWORD, DWORD, XINPUT_CAPABILITIES*); -typedef DWORD (WINAPI *PFN_XInputGetState)(DWORD, XINPUT_STATE*); -#endif - -// CHANGELOG -// (minor and older changes stripped away, please see git history for details) -// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago)with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. -// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[]. -// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). -// 2022-01-17: Inputs: always update key mods next and before a key event (not in NewFrame) to fix input queue with very low framerates. -// 2022-01-12: Inputs: Update mouse inputs using WM_MOUSEMOVE/WM_MOUSELEAVE + fallback to provide it when focused but not hovered/captured. More standard and will allow us to pass it to future input queue API. -// 2022-01-12: Inputs: Maintain our own copy of MouseButtonsDown mask instead of using ImGui::IsAnyMouseDown() which will be obsoleted. -// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. -// 2021-12-16: Inputs: Fill VK_LCONTROL/VK_RCONTROL/VK_LSHIFT/VK_RSHIFT/VK_LMENU/VK_RMENU for completeness. -// 2021-08-17: Calling io.AddFocusEvent() on WM_SETFOCUS/WM_KILLFOCUS messages. -// 2021-08-02: Inputs: Fixed keyboard modifiers being reported when host window doesn't have focus. -// 2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using TrackMouseEvent() to receive WM_MOUSELEAVE events). -// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). -// 2021-06-08: Fixed ImGui_ImplWin32_EnableDpiAwareness() and ImGui_ImplWin32_GetDpiScaleForMonitor() to handle Windows 8.1/10 features without a manifest (per-monitor DPI, and properly calls SetProcessDpiAwareness() on 8.1). -// 2021-03-23: Inputs: Clearing keyboard down array when losing focus (WM_KILLFOCUS). -// 2021-02-18: Added ImGui_ImplWin32_EnableAlphaCompositing(). Non Visual Studio users will need to link with dwmapi.lib (MinGW/gcc: use -ldwmapi). -// 2021-02-17: Fixed ImGui_ImplWin32_EnableDpiAwareness() attempting to get SetProcessDpiAwareness from shcore.dll on Windows 8 whereas it is only supported on Windows 8.1. -// 2021-01-25: Inputs: Dynamically loading XInput DLL. -// 2020-12-04: Misc: Fixed setting of io.DisplaySize to invalid/uninitialized data when after hwnd has been closed. -// 2020-03-03: Inputs: Calling AddInputCharacterUTF16() to support surrogate pairs leading to codepoint >= 0x10000 (for more complete CJK inputs) -// 2020-02-17: Added ImGui_ImplWin32_EnableDpiAwareness(), ImGui_ImplWin32_GetDpiScaleForHwnd(), ImGui_ImplWin32_GetDpiScaleForMonitor() helper functions. -// 2020-01-14: Inputs: Added support for #define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD/IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT. -// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor. -// 2019-05-11: Inputs: Don't filter value from WM_CHAR before calling AddInputCharacter(). -// 2019-01-17: Misc: Using GetForegroundWindow()+IsChild() instead of GetActiveWindow() to be compatible with windows created in a different thread or parent. -// 2019-01-17: Inputs: Added support for mouse buttons 4 and 5 via WM_XBUTTON* messages. -// 2019-01-15: Inputs: Added support for XInput gamepads (if ImGuiConfigFlags_NavEnableGamepad is set by user application). -// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window. -// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor. -// 2018-06-10: Inputs: Fixed handling of mouse wheel messages to support fine position messages (typically sent by track-pads). -// 2018-06-08: Misc: Extracted imgui_impl_win32.cpp/.h away from the old combined DX9/DX10/DX11/DX12 examples. -// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors and ImGuiBackendFlags_HasSetMousePos flags + honor ImGuiConfigFlags_NoMouseCursorChange flag. -// 2018-02-20: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value and WM_SETCURSOR message handling). -// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space. -// 2018-02-06: Inputs: Honoring the io.WantSetMousePos by repositioning the mouse (when using navigation and ImGuiConfigFlags_NavMoveMouse is set). -// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. -// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support. -// 2018-01-08: Inputs: Added mapping for ImGuiKey_Insert. -// 2018-01-05: Inputs: Added WM_LBUTTONDBLCLK double-click handlers for window classes with the CS_DBLCLKS flag. -// 2017-10-23: Inputs: Added WM_SYSKEYDOWN / WM_SYSKEYUP handlers so e.g. the VK_MENU key can be read. -// 2017-10-23: Inputs: Using Win32 ::SetCapture/::GetCapture() to retrieve mouse positions outside the client area when dragging. -// 2016-11-12: Inputs: Only call Win32 ::SetCursor(NULL) when io.MouseDrawCursor is set. - -struct ImGui_ImplWin32_Data -{ - HWND hWnd; - HWND MouseHwnd; - bool MouseTracked; - int MouseButtonsDown; - INT64 Time; - INT64 TicksPerSecond; - ImGuiMouseCursor LastMouseCursor; - bool HasGamepad; - bool WantUpdateHasGamepad; - -#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD - HMODULE XInputDLL; - PFN_XInputGetCapabilities XInputGetCapabilities; - PFN_XInputGetState XInputGetState; -#endif - - ImGui_ImplWin32_Data() { memset((void*)this, 0, sizeof(*this)); } -}; - -// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts -// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. -// FIXME: multi-context support is not well tested and probably dysfunctional in this backend. -// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context. -static ImGui_ImplWin32_Data* ImGui_ImplWin32_GetBackendData() -{ - return ImGui::GetCurrentContext() ? (ImGui_ImplWin32_Data*)ImGui::GetIO().BackendPlatformUserData : NULL; -} - -// Functions -bool ImGui_ImplWin32_Init(void* hwnd) -{ - ImGuiIO& io = ImGui::GetIO(); - IM_ASSERT(io.BackendPlatformUserData == NULL && "Already initialized a platform backend!"); - - INT64 perf_frequency, perf_counter; - if (!::QueryPerformanceFrequency((LARGE_INTEGER*)&perf_frequency)) - return false; - if (!::QueryPerformanceCounter((LARGE_INTEGER*)&perf_counter)) - return false; - - // Setup backend capabilities flags - ImGui_ImplWin32_Data* bd = IM_NEW(ImGui_ImplWin32_Data)(); - io.BackendPlatformUserData = (void*)bd; - io.BackendPlatformName = "imgui_impl_win32"; - io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) - io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) - - bd->hWnd = (HWND)hwnd; - bd->WantUpdateHasGamepad = true; - bd->TicksPerSecond = perf_frequency; - bd->Time = perf_counter; - bd->LastMouseCursor = ImGuiMouseCursor_COUNT; - - // Set platform dependent data in viewport - ImGui::GetMainViewport()->PlatformHandleRaw = (void*)hwnd; - - // Dynamically load XInput library -#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD - const char* xinput_dll_names[] = - { - "xinput1_4.dll", // Windows 8+ - "xinput1_3.dll", // DirectX SDK - "xinput9_1_0.dll", // Windows Vista, Windows 7 - "xinput1_2.dll", // DirectX SDK - "xinput1_1.dll" // DirectX SDK - }; - for (int n = 0; n < IM_ARRAYSIZE(xinput_dll_names); n++) - if (HMODULE dll = ::LoadLibraryA(xinput_dll_names[n])) - { - bd->XInputDLL = dll; - bd->XInputGetCapabilities = (PFN_XInputGetCapabilities)::GetProcAddress(dll, "XInputGetCapabilities"); - bd->XInputGetState = (PFN_XInputGetState)::GetProcAddress(dll, "XInputGetState"); - break; - } -#endif // IMGUI_IMPL_WIN32_DISABLE_GAMEPAD - - return true; -} - -void ImGui_ImplWin32_Shutdown() -{ - ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); - IM_ASSERT(bd != NULL && "No platform backend to shutdown, or already shutdown?"); - ImGuiIO& io = ImGui::GetIO(); - - // Unload XInput library -#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD - if (bd->XInputDLL) - ::FreeLibrary(bd->XInputDLL); -#endif // IMGUI_IMPL_WIN32_DISABLE_GAMEPAD - - io.BackendPlatformName = NULL; - io.BackendPlatformUserData = NULL; - IM_DELETE(bd); -} - -static bool ImGui_ImplWin32_UpdateMouseCursor() -{ - ImGuiIO& io = ImGui::GetIO(); - if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) - return false; - - ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor(); - if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor) - { - // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor - ::SetCursor(NULL); - } - else - { - // Show OS mouse cursor - LPTSTR win32_cursor = IDC_ARROW; - switch (imgui_cursor) - { - case ImGuiMouseCursor_Arrow: win32_cursor = IDC_ARROW; break; - case ImGuiMouseCursor_TextInput: win32_cursor = IDC_IBEAM; break; - case ImGuiMouseCursor_ResizeAll: win32_cursor = IDC_SIZEALL; break; - case ImGuiMouseCursor_ResizeEW: win32_cursor = IDC_SIZEWE; break; - case ImGuiMouseCursor_ResizeNS: win32_cursor = IDC_SIZENS; break; - case ImGuiMouseCursor_ResizeNESW: win32_cursor = IDC_SIZENESW; break; - case ImGuiMouseCursor_ResizeNWSE: win32_cursor = IDC_SIZENWSE; break; - case ImGuiMouseCursor_Hand: win32_cursor = IDC_HAND; break; - case ImGuiMouseCursor_NotAllowed: win32_cursor = IDC_NO; break; - } - ::SetCursor(::LoadCursor(NULL, win32_cursor)); - } - return true; -} - -static bool IsVkDown(int vk) -{ - return (::GetKeyState(vk) & 0x8000) != 0; -} - -static void ImGui_ImplWin32_AddKeyEvent(ImGuiKey key, bool down, int native_keycode, int native_scancode = -1) -{ - ImGuiIO& io = ImGui::GetIO(); - io.AddKeyEvent(key, down); - io.SetKeyEventNativeData(key, native_keycode, native_scancode); // To support legacy indexing (<1.87 user code) - IM_UNUSED(native_scancode); -} - -static void ImGui_ImplWin32_ProcessKeyEventsWorkarounds() -{ - // Left & right Shift keys: when both are pressed together, Windows tend to not generate the WM_KEYUP event for the first released one. - if (ImGui::IsKeyDown(ImGuiKey_LeftShift) && !IsVkDown(VK_LSHIFT)) - ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftShift, false, VK_LSHIFT); - if (ImGui::IsKeyDown(ImGuiKey_RightShift) && !IsVkDown(VK_RSHIFT)) - ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightShift, false, VK_RSHIFT); - - // Sometimes WM_KEYUP for Win key is not passed down to the app (e.g. for Win+V on some setups, according to GLFW). - if (ImGui::IsKeyDown(ImGuiKey_LeftSuper) && !IsVkDown(VK_LWIN)) - ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftSuper, false, VK_LWIN); - if (ImGui::IsKeyDown(ImGuiKey_RightSuper) && !IsVkDown(VK_RWIN)) - ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightSuper, false, VK_RWIN); -} - -static void ImGui_ImplWin32_UpdateKeyModifiers() -{ - ImGuiIO& io = ImGui::GetIO(); - io.AddKeyEvent(ImGuiKey_ModCtrl, IsVkDown(VK_CONTROL)); - io.AddKeyEvent(ImGuiKey_ModShift, IsVkDown(VK_SHIFT)); - io.AddKeyEvent(ImGuiKey_ModAlt, IsVkDown(VK_MENU)); - io.AddKeyEvent(ImGuiKey_ModSuper, IsVkDown(VK_APPS)); -} - -static void ImGui_ImplWin32_UpdateMouseData() -{ - ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); - ImGuiIO& io = ImGui::GetIO(); - IM_ASSERT(bd->hWnd != 0); - - const bool is_app_focused = (::GetForegroundWindow() == bd->hWnd); - if (is_app_focused) - { - // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) - if (io.WantSetMousePos) - { - POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y }; - if (::ClientToScreen(bd->hWnd, &pos)) - ::SetCursorPos(pos.x, pos.y); - } - - // (Optional) Fallback to provide mouse position when focused (WM_MOUSEMOVE already provides this when hovered or captured) - if (!io.WantSetMousePos && !bd->MouseTracked) - { - POINT pos; - if (::GetCursorPos(&pos) && ::ScreenToClient(bd->hWnd, &pos)) - io.AddMousePosEvent((float)pos.x, (float)pos.y); - } - } -} - -// Gamepad navigation mapping -static void ImGui_ImplWin32_UpdateGamepads() -{ -#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD - ImGuiIO& io = ImGui::GetIO(); - ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); - //if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0) // FIXME: Technically feeding gamepad shouldn't depend on this now that they are regular inputs. - // return; - - // Calling XInputGetState() every frame on disconnected gamepads is unfortunately too slow. - // Instead we refresh gamepad availability by calling XInputGetCapabilities() _only_ after receiving WM_DEVICECHANGE. - if (bd->WantUpdateHasGamepad) - { - XINPUT_CAPABILITIES caps = {}; - bd->HasGamepad = bd->XInputGetCapabilities ? (bd->XInputGetCapabilities(0, XINPUT_FLAG_GAMEPAD, &caps) == ERROR_SUCCESS) : false; - bd->WantUpdateHasGamepad = false; - } - - io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad; - XINPUT_STATE xinput_state; - XINPUT_GAMEPAD& gamepad = xinput_state.Gamepad; - if (!bd->HasGamepad || bd->XInputGetState == NULL || bd->XInputGetState(0, &xinput_state) != ERROR_SUCCESS) - return; - io.BackendFlags |= ImGuiBackendFlags_HasGamepad; - - #define IM_SATURATE(V) (V < 0.0f ? 0.0f : V > 1.0f ? 1.0f : V) - #define MAP_BUTTON(KEY_NO, BUTTON_ENUM) { io.AddKeyEvent(KEY_NO, (gamepad.wButtons & BUTTON_ENUM) != 0); } - #define MAP_ANALOG(KEY_NO, VALUE, V0, V1) { float vn = (float)(VALUE - V0) / (float)(V1 - V0); io.AddKeyAnalogEvent(KEY_NO, vn > 0.10f, IM_SATURATE(vn)); } - MAP_BUTTON(ImGuiKey_GamepadStart, XINPUT_GAMEPAD_START); - MAP_BUTTON(ImGuiKey_GamepadBack, XINPUT_GAMEPAD_BACK); - MAP_BUTTON(ImGuiKey_GamepadFaceLeft, XINPUT_GAMEPAD_X); - MAP_BUTTON(ImGuiKey_GamepadFaceRight, XINPUT_GAMEPAD_B); - MAP_BUTTON(ImGuiKey_GamepadFaceUp, XINPUT_GAMEPAD_Y); - MAP_BUTTON(ImGuiKey_GamepadFaceDown, XINPUT_GAMEPAD_A); - MAP_BUTTON(ImGuiKey_GamepadDpadLeft, XINPUT_GAMEPAD_DPAD_LEFT); - MAP_BUTTON(ImGuiKey_GamepadDpadRight, XINPUT_GAMEPAD_DPAD_RIGHT); - MAP_BUTTON(ImGuiKey_GamepadDpadUp, XINPUT_GAMEPAD_DPAD_UP); - MAP_BUTTON(ImGuiKey_GamepadDpadDown, XINPUT_GAMEPAD_DPAD_DOWN); - MAP_BUTTON(ImGuiKey_GamepadL1, XINPUT_GAMEPAD_LEFT_SHOULDER); - MAP_BUTTON(ImGuiKey_GamepadR1, XINPUT_GAMEPAD_RIGHT_SHOULDER); - MAP_ANALOG(ImGuiKey_GamepadL2, gamepad.bLeftTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD, 255); - MAP_ANALOG(ImGuiKey_GamepadR2, gamepad.bRightTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD, 255); - MAP_BUTTON(ImGuiKey_GamepadL3, XINPUT_GAMEPAD_LEFT_THUMB); - MAP_BUTTON(ImGuiKey_GamepadR3, XINPUT_GAMEPAD_RIGHT_THUMB); - MAP_ANALOG(ImGuiKey_GamepadLStickLeft, gamepad.sThumbLX, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768); - MAP_ANALOG(ImGuiKey_GamepadLStickRight, gamepad.sThumbLX, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767); - MAP_ANALOG(ImGuiKey_GamepadLStickUp, gamepad.sThumbLY, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767); - MAP_ANALOG(ImGuiKey_GamepadLStickDown, gamepad.sThumbLY, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768); - MAP_ANALOG(ImGuiKey_GamepadRStickLeft, gamepad.sThumbRX, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768); - MAP_ANALOG(ImGuiKey_GamepadRStickRight, gamepad.sThumbRX, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767); - MAP_ANALOG(ImGuiKey_GamepadRStickUp, gamepad.sThumbRY, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767); - MAP_ANALOG(ImGuiKey_GamepadRStickDown, gamepad.sThumbRY, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768); - #undef MAP_BUTTON - #undef MAP_ANALOG -#endif // #ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD -} - -void ImGui_ImplWin32_NewFrame() -{ - ImGuiIO& io = ImGui::GetIO(); - ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); - IM_ASSERT(bd != NULL && "Did you call ImGui_ImplWin32_Init()?"); - - // Setup display size (every frame to accommodate for window resizing) - RECT rect = { 0, 0, 0, 0 }; - ::GetClientRect(bd->hWnd, &rect); - io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top)); - - // Setup time step - INT64 current_time = 0; - ::QueryPerformanceCounter((LARGE_INTEGER*)¤t_time); - io.DeltaTime = (float)(current_time - bd->Time) / bd->TicksPerSecond; - bd->Time = current_time; - - // Update OS mouse position - ImGui_ImplWin32_UpdateMouseData(); - - // Process workarounds for known Windows key handling issues - ImGui_ImplWin32_ProcessKeyEventsWorkarounds(); - - // Update OS mouse cursor with the cursor requested by imgui - ImGuiMouseCursor mouse_cursor = io.MouseDrawCursor ? ImGuiMouseCursor_None : ImGui::GetMouseCursor(); - if (bd->LastMouseCursor != mouse_cursor) - { - bd->LastMouseCursor = mouse_cursor; - ImGui_ImplWin32_UpdateMouseCursor(); - } - - // Update game controllers (if enabled and available) - ImGui_ImplWin32_UpdateGamepads(); -} - -// There is no distinct VK_xxx for keypad enter, instead it is VK_RETURN + KF_EXTENDED, we assign it an arbitrary value to make code more readable (VK_ codes go up to 255) -#define IM_VK_KEYPAD_ENTER (VK_RETURN + 256) - -// Map VK_xxx to ImGuiKey_xxx. -static ImGuiKey ImGui_ImplWin32_VirtualKeyToImGuiKey(WPARAM wParam) -{ - switch (wParam) - { - case VK_TAB: return ImGuiKey_Tab; - case VK_LEFT: return ImGuiKey_LeftArrow; - case VK_RIGHT: return ImGuiKey_RightArrow; - case VK_UP: return ImGuiKey_UpArrow; - case VK_DOWN: return ImGuiKey_DownArrow; - case VK_PRIOR: return ImGuiKey_PageUp; - case VK_NEXT: return ImGuiKey_PageDown; - case VK_HOME: return ImGuiKey_Home; - case VK_END: return ImGuiKey_End; - case VK_INSERT: return ImGuiKey_Insert; - case VK_DELETE: return ImGuiKey_Delete; - case VK_BACK: return ImGuiKey_Backspace; - case VK_SPACE: return ImGuiKey_Space; - case VK_RETURN: return ImGuiKey_Enter; - case VK_ESCAPE: return ImGuiKey_Escape; - case VK_OEM_7: return ImGuiKey_Apostrophe; - case VK_OEM_COMMA: return ImGuiKey_Comma; - case VK_OEM_MINUS: return ImGuiKey_Minus; - case VK_OEM_PERIOD: return ImGuiKey_Period; - case VK_OEM_2: return ImGuiKey_Slash; - case VK_OEM_1: return ImGuiKey_Semicolon; - case VK_OEM_PLUS: return ImGuiKey_Equal; - case VK_OEM_4: return ImGuiKey_LeftBracket; - case VK_OEM_5: return ImGuiKey_Backslash; - case VK_OEM_6: return ImGuiKey_RightBracket; - case VK_OEM_3: return ImGuiKey_GraveAccent; - case VK_CAPITAL: return ImGuiKey_CapsLock; - case VK_SCROLL: return ImGuiKey_ScrollLock; - case VK_NUMLOCK: return ImGuiKey_NumLock; - case VK_SNAPSHOT: return ImGuiKey_PrintScreen; - case VK_PAUSE: return ImGuiKey_Pause; - case VK_NUMPAD0: return ImGuiKey_Keypad0; - case VK_NUMPAD1: return ImGuiKey_Keypad1; - case VK_NUMPAD2: return ImGuiKey_Keypad2; - case VK_NUMPAD3: return ImGuiKey_Keypad3; - case VK_NUMPAD4: return ImGuiKey_Keypad4; - case VK_NUMPAD5: return ImGuiKey_Keypad5; - case VK_NUMPAD6: return ImGuiKey_Keypad6; - case VK_NUMPAD7: return ImGuiKey_Keypad7; - case VK_NUMPAD8: return ImGuiKey_Keypad8; - case VK_NUMPAD9: return ImGuiKey_Keypad9; - case VK_DECIMAL: return ImGuiKey_KeypadDecimal; - case VK_DIVIDE: return ImGuiKey_KeypadDivide; - case VK_MULTIPLY: return ImGuiKey_KeypadMultiply; - case VK_SUBTRACT: return ImGuiKey_KeypadSubtract; - case VK_ADD: return ImGuiKey_KeypadAdd; - case IM_VK_KEYPAD_ENTER: return ImGuiKey_KeypadEnter; - case VK_LSHIFT: return ImGuiKey_LeftShift; - case VK_LCONTROL: return ImGuiKey_LeftCtrl; - case VK_LMENU: return ImGuiKey_LeftAlt; - case VK_LWIN: return ImGuiKey_LeftSuper; - case VK_RSHIFT: return ImGuiKey_RightShift; - case VK_RCONTROL: return ImGuiKey_RightCtrl; - case VK_RMENU: return ImGuiKey_RightAlt; - case VK_RWIN: return ImGuiKey_RightSuper; - case VK_APPS: return ImGuiKey_Menu; - case '0': return ImGuiKey_0; - case '1': return ImGuiKey_1; - case '2': return ImGuiKey_2; - case '3': return ImGuiKey_3; - case '4': return ImGuiKey_4; - case '5': return ImGuiKey_5; - case '6': return ImGuiKey_6; - case '7': return ImGuiKey_7; - case '8': return ImGuiKey_8; - case '9': return ImGuiKey_9; - case 'A': return ImGuiKey_A; - case 'B': return ImGuiKey_B; - case 'C': return ImGuiKey_C; - case 'D': return ImGuiKey_D; - case 'E': return ImGuiKey_E; - case 'F': return ImGuiKey_F; - case 'G': return ImGuiKey_G; - case 'H': return ImGuiKey_H; - case 'I': return ImGuiKey_I; - case 'J': return ImGuiKey_J; - case 'K': return ImGuiKey_K; - case 'L': return ImGuiKey_L; - case 'M': return ImGuiKey_M; - case 'N': return ImGuiKey_N; - case 'O': return ImGuiKey_O; - case 'P': return ImGuiKey_P; - case 'Q': return ImGuiKey_Q; - case 'R': return ImGuiKey_R; - case 'S': return ImGuiKey_S; - case 'T': return ImGuiKey_T; - case 'U': return ImGuiKey_U; - case 'V': return ImGuiKey_V; - case 'W': return ImGuiKey_W; - case 'X': return ImGuiKey_X; - case 'Y': return ImGuiKey_Y; - case 'Z': return ImGuiKey_Z; - case VK_F1: return ImGuiKey_F1; - case VK_F2: return ImGuiKey_F2; - case VK_F3: return ImGuiKey_F3; - case VK_F4: return ImGuiKey_F4; - case VK_F5: return ImGuiKey_F5; - case VK_F6: return ImGuiKey_F6; - case VK_F7: return ImGuiKey_F7; - case VK_F8: return ImGuiKey_F8; - case VK_F9: return ImGuiKey_F9; - case VK_F10: return ImGuiKey_F10; - case VK_F11: return ImGuiKey_F11; - case VK_F12: return ImGuiKey_F12; - default: return ImGuiKey_None; - } -} - -// Allow compilation with old Windows SDK. MinGW doesn't have default _WIN32_WINNT/WINVER versions. -#ifndef WM_MOUSEHWHEEL -#define WM_MOUSEHWHEEL 0x020E -#endif -#ifndef DBT_DEVNODES_CHANGED -#define DBT_DEVNODES_CHANGED 0x0007 -#endif - -// Win32 message handler (process Win32 mouse/keyboard inputs, etc.) -// Call from your application's message handler. Keep calling your message handler unless this function returns TRUE. -// When implementing your own backend, you can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if Dear ImGui wants to use your inputs. -// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. -// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. -// Generally you may always pass all inputs to Dear ImGui, and hide them from your application based on those two flags. -// PS: In this Win32 handler, we use the capture API (GetCapture/SetCapture/ReleaseCapture) to be able to read mouse coordinates when dragging mouse outside of our window bounds. -// PS: We treat DBLCLK messages as regular mouse down messages, so this code will work on windows classes that have the CS_DBLCLKS flag set. Our own example app code doesn't set this flag. -#if 0 -// Copy this line into your .cpp file to forward declare the function. -extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); -#endif -IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - if (ImGui::GetCurrentContext() == NULL) - return 0; - - ImGuiIO& io = ImGui::GetIO(); - ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); - - switch (msg) - { - case WM_MOUSEMOVE: - // We need to call TrackMouseEvent in order to receive WM_MOUSELEAVE events - bd->MouseHwnd = hwnd; - if (!bd->MouseTracked) - { - TRACKMOUSEEVENT tme = { sizeof(tme), TME_LEAVE, hwnd, 0 }; - ::TrackMouseEvent(&tme); - bd->MouseTracked = true; - } - io.AddMousePosEvent((float)GET_X_LPARAM(lParam), (float)GET_Y_LPARAM(lParam)); - break; - case WM_MOUSELEAVE: - if (bd->MouseHwnd == hwnd) - bd->MouseHwnd = NULL; - bd->MouseTracked = false; - io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); - break; - case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: - case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: - case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: - case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK: - { - int button = 0; - if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; } - if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; } - if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; } - if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } - if (bd->MouseButtonsDown == 0 && ::GetCapture() == NULL) - ::SetCapture(hwnd); - bd->MouseButtonsDown |= 1 << button; - io.AddMouseButtonEvent(button, true); - return 0; - } - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - case WM_XBUTTONUP: - { - int button = 0; - if (msg == WM_LBUTTONUP) { button = 0; } - if (msg == WM_RBUTTONUP) { button = 1; } - if (msg == WM_MBUTTONUP) { button = 2; } - if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } - bd->MouseButtonsDown &= ~(1 << button); - if (bd->MouseButtonsDown == 0 && ::GetCapture() == hwnd) - ::ReleaseCapture(); - io.AddMouseButtonEvent(button, false); - return 0; - } - case WM_MOUSEWHEEL: - io.AddMouseWheelEvent(0.0f, (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA); - return 0; - case WM_MOUSEHWHEEL: - io.AddMouseWheelEvent((float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA, 0.0f); - return 0; - case WM_KEYDOWN: - case WM_KEYUP: - case WM_SYSKEYDOWN: - case WM_SYSKEYUP: - { - const bool is_key_down = (msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN); - if (wParam < 256) - { - // Submit modifiers - ImGui_ImplWin32_UpdateKeyModifiers(); - - // Obtain virtual key code - // (keypad enter doesn't have its own... VK_RETURN with KF_EXTENDED flag means keypad enter, see IM_VK_KEYPAD_ENTER definition for details, it is mapped to ImGuiKey_KeyPadEnter.) - int vk = (int)wParam; - if ((wParam == VK_RETURN) && (HIWORD(lParam) & KF_EXTENDED)) - vk = IM_VK_KEYPAD_ENTER; - - // Submit key event - const ImGuiKey key = ImGui_ImplWin32_VirtualKeyToImGuiKey(vk); - const int scancode = (int)LOBYTE(HIWORD(lParam)); - if (key != ImGuiKey_None) - ImGui_ImplWin32_AddKeyEvent(key, is_key_down, vk, scancode); - - // Submit individual left/right modifier events - if (vk == VK_SHIFT) - { - // Important: Shift keys tend to get stuck when pressed together, missing key-up events are corrected in ImGui_ImplWin32_ProcessKeyEventsWorkarounds() - if (IsVkDown(VK_LSHIFT) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftShift, is_key_down, VK_LSHIFT, scancode); } - if (IsVkDown(VK_RSHIFT) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightShift, is_key_down, VK_RSHIFT, scancode); } - } - else if (vk == VK_CONTROL) - { - if (IsVkDown(VK_LCONTROL) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftCtrl, is_key_down, VK_LCONTROL, scancode); } - if (IsVkDown(VK_RCONTROL) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightCtrl, is_key_down, VK_RCONTROL, scancode); } - } - else if (vk == VK_MENU) - { - if (IsVkDown(VK_LMENU) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftAlt, is_key_down, VK_LMENU, scancode); } - if (IsVkDown(VK_RMENU) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightAlt, is_key_down, VK_RMENU, scancode); } - } - } - return 0; - } - case WM_SETFOCUS: - case WM_KILLFOCUS: - io.AddFocusEvent(msg == WM_SETFOCUS); - return 0; - case WM_CHAR: - // You can also use ToAscii()+GetKeyboardState() to retrieve characters. - if (wParam > 0 && wParam < 0x10000) - io.AddInputCharacterUTF16((unsigned short)wParam); - return 0; - case WM_SETCURSOR: - // This is required to restore cursor when transitioning from e.g resize borders to client area. - if (LOWORD(lParam) == HTCLIENT && ImGui_ImplWin32_UpdateMouseCursor()) - return 1; - return 0; - case WM_DEVICECHANGE: - if ((UINT)wParam == DBT_DEVNODES_CHANGED) - bd->WantUpdateHasGamepad = true; - return 0; - } - return 0; -} - - -//-------------------------------------------------------------------------------------------------------- -// DPI-related helpers (optional) -//-------------------------------------------------------------------------------------------------------- -// - Use to enable DPI awareness without having to create an application manifest. -// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps. -// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc. -// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime, -// neither we want to require the user to have. So we dynamically select and load those functions to avoid dependencies. -//--------------------------------------------------------------------------------------------------------- -// This is the scheme successfully used by GLFW (from which we borrowed some of the code) and other apps aiming to be highly portable. -// ImGui_ImplWin32_EnableDpiAwareness() is just a helper called by main.cpp, we don't call it automatically. -// If you are trying to implement your own backend for your own engine, you may ignore that noise. -//--------------------------------------------------------------------------------------------------------- - -// Perform our own check with RtlVerifyVersionInfo() instead of using functions from as they -// require a manifest to be functional for checks above 8.1. See https://github.com/ocornut/imgui/issues/4200 -static BOOL _IsWindowsVersionOrGreater(WORD major, WORD minor, WORD) -{ - typedef LONG(WINAPI* PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*, ULONG, ULONGLONG); - static PFN_RtlVerifyVersionInfo RtlVerifyVersionInfoFn = NULL; - if (RtlVerifyVersionInfoFn == NULL) - if (HMODULE ntdllModule = ::GetModuleHandleA("ntdll.dll")) - RtlVerifyVersionInfoFn = (PFN_RtlVerifyVersionInfo)GetProcAddress(ntdllModule, "RtlVerifyVersionInfo"); - if (RtlVerifyVersionInfoFn == NULL) - return FALSE; - - RTL_OSVERSIONINFOEXW versionInfo = { }; - ULONGLONG conditionMask = 0; - versionInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); - versionInfo.dwMajorVersion = major; - versionInfo.dwMinorVersion = minor; - VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); - return (RtlVerifyVersionInfoFn(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, conditionMask) == 0) ? TRUE : FALSE; -} - -#define _IsWindowsVistaOrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0600), LOBYTE(0x0600), 0) // _WIN32_WINNT_VISTA -#define _IsWindows8OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0602), LOBYTE(0x0602), 0) // _WIN32_WINNT_WIN8 -#define _IsWindows8Point1OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0603), LOBYTE(0x0603), 0) // _WIN32_WINNT_WINBLUE -#define _IsWindows10OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0A00), LOBYTE(0x0A00), 0) // _WIN32_WINNT_WINTHRESHOLD / _WIN32_WINNT_WIN10 - -#ifndef DPI_ENUMS_DECLARED -typedef enum { PROCESS_DPI_UNAWARE = 0, PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2 } PROCESS_DPI_AWARENESS; -typedef enum { MDT_EFFECTIVE_DPI = 0, MDT_ANGULAR_DPI = 1, MDT_RAW_DPI = 2, MDT_DEFAULT = MDT_EFFECTIVE_DPI } MONITOR_DPI_TYPE; -#endif -#ifndef _DPI_AWARENESS_CONTEXTS_ -DECLARE_HANDLE(DPI_AWARENESS_CONTEXT); -#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE (DPI_AWARENESS_CONTEXT)-3 -#endif -#ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 -#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 (DPI_AWARENESS_CONTEXT)-4 -#endif -typedef HRESULT(WINAPI* PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS); // Shcore.lib + dll, Windows 8.1+ -typedef HRESULT(WINAPI* PFN_GetDpiForMonitor)(HMONITOR, MONITOR_DPI_TYPE, UINT*, UINT*); // Shcore.lib + dll, Windows 8.1+ -typedef DPI_AWARENESS_CONTEXT(WINAPI* PFN_SetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT); // User32.lib + dll, Windows 10 v1607+ (Creators Update) - -// Helper function to enable DPI awareness without setting up a manifest -void ImGui_ImplWin32_EnableDpiAwareness() -{ - if (_IsWindows10OrGreater()) - { - static HINSTANCE user32_dll = ::LoadLibraryA("user32.dll"); // Reference counted per-process - if (PFN_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContextFn = (PFN_SetThreadDpiAwarenessContext)::GetProcAddress(user32_dll, "SetThreadDpiAwarenessContext")) - { - SetThreadDpiAwarenessContextFn(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); - return; - } - } - if (_IsWindows8Point1OrGreater()) - { - static HINSTANCE shcore_dll = ::LoadLibraryA("shcore.dll"); // Reference counted per-process - if (PFN_SetProcessDpiAwareness SetProcessDpiAwarenessFn = (PFN_SetProcessDpiAwareness)::GetProcAddress(shcore_dll, "SetProcessDpiAwareness")) - { - SetProcessDpiAwarenessFn(PROCESS_PER_MONITOR_DPI_AWARE); - return; - } - } -#if _WIN32_WINNT >= 0x0600 - ::SetProcessDPIAware(); -#endif -} - -#if defined(_MSC_VER) && !defined(NOGDI) -#pragma comment(lib, "gdi32") // Link with gdi32.lib for GetDeviceCaps(). MinGW will require linking with '-lgdi32' -#endif - -float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor) -{ - UINT xdpi = 96, ydpi = 96; - if (_IsWindows8Point1OrGreater()) - { - static HINSTANCE shcore_dll = ::LoadLibraryA("shcore.dll"); // Reference counted per-process - static PFN_GetDpiForMonitor GetDpiForMonitorFn = NULL; - if (GetDpiForMonitorFn == NULL && shcore_dll != NULL) - GetDpiForMonitorFn = (PFN_GetDpiForMonitor)::GetProcAddress(shcore_dll, "GetDpiForMonitor"); - if (GetDpiForMonitorFn != NULL) - { - GetDpiForMonitorFn((HMONITOR)monitor, MDT_EFFECTIVE_DPI, &xdpi, &ydpi); - IM_ASSERT(xdpi == ydpi); // Please contact me if you hit this assert! - return xdpi / 96.0f; - } - } -#ifndef NOGDI - const HDC dc = ::GetDC(NULL); - xdpi = ::GetDeviceCaps(dc, LOGPIXELSX); - ydpi = ::GetDeviceCaps(dc, LOGPIXELSY); - IM_ASSERT(xdpi == ydpi); // Please contact me if you hit this assert! - ::ReleaseDC(NULL, dc); -#endif - return xdpi / 96.0f; -} - -float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd) -{ - HMONITOR monitor = ::MonitorFromWindow((HWND)hwnd, MONITOR_DEFAULTTONEAREST); - return ImGui_ImplWin32_GetDpiScaleForMonitor(monitor); -} - -//--------------------------------------------------------------------------------------------------------- -// Transparency related helpers (optional) -//-------------------------------------------------------------------------------------------------------- - -#if defined(_MSC_VER) -#pragma comment(lib, "dwmapi") // Link with dwmapi.lib. MinGW will require linking with '-ldwmapi' -#endif - -// [experimental] -// Borrowed from GLFW's function updateFramebufferTransparency() in src/win32_window.c -// (the Dwm* functions are Vista era functions but we are borrowing logic from GLFW) -void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd) -{ - if (!_IsWindowsVistaOrGreater()) - return; - - BOOL composition; - if (FAILED(::DwmIsCompositionEnabled(&composition)) || !composition) - return; - - BOOL opaque; - DWORD color; - if (_IsWindows8OrGreater() || (SUCCEEDED(::DwmGetColorizationColor(&color, &opaque)) && !opaque)) - { - HRGN region = ::CreateRectRgn(0, 0, -1, -1); - DWM_BLURBEHIND bb = {}; - bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; - bb.hRgnBlur = region; - bb.fEnable = TRUE; - ::DwmEnableBlurBehindWindow((HWND)hwnd, &bb); - ::DeleteObject(region); - } - else - { - DWM_BLURBEHIND bb = {}; - bb.dwFlags = DWM_BB_ENABLE; - ::DwmEnableBlurBehindWindow((HWND)hwnd, &bb); - } -} - -//--------------------------------------------------------------------------------------------------------- diff --git a/dependencies/reboot/vendor/ImGui/imgui_impl_win32.h b/dependencies/reboot/vendor/ImGui/imgui_impl_win32.h deleted file mode 100644 index 082461d..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_impl_win32.h +++ /dev/null @@ -1,44 +0,0 @@ -// dear imgui: Platform Backend for Windows (standard windows API for 32 and 64 bits applications) -// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) - -// Implemented features: -// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui) -// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] -// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. -// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. - -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. -// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs - -#pragma once -#include "imgui.h" // IMGUI_IMPL_API - -IMGUI_IMPL_API bool ImGui_ImplWin32_Init(void* hwnd); -IMGUI_IMPL_API void ImGui_ImplWin32_Shutdown(); -IMGUI_IMPL_API void ImGui_ImplWin32_NewFrame(); - -// Win32 message handler your application need to call. -// - Intentionally commented out in a '#if 0' block to avoid dragging dependencies on from this helper. -// - You should COPY the line below into your .cpp code to forward declare the function and then you can call it. -// - Call from your application's message handler. Keep calling your message handler unless this function returns TRUE. - -#if 0 -extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); -#endif - -// DPI-related helpers (optional) -// - Use to enable DPI awareness without having to create an application manifest. -// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps. -// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc. -// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime, -// neither we want to require the user to have. So we dynamically select and load those functions to avoid dependencies. -IMGUI_IMPL_API void ImGui_ImplWin32_EnableDpiAwareness(); -IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd); // HWND hwnd -IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor); // HMONITOR monitor - -// Transparency related helpers (optional) [experimental] -// - Use to enable alpha compositing transparency with the desktop. -// - Use together with e.g. clearing your framebuffer with zero-alpha. -IMGUI_IMPL_API void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd); // HWND hwnd diff --git a/dependencies/reboot/vendor/ImGui/imgui_internal.h b/dependencies/reboot/vendor/ImGui/imgui_internal.h deleted file mode 100644 index 50dcbc6..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_internal.h +++ /dev/null @@ -1,2994 +0,0 @@ -// dear imgui, v1.89 WIP -// (internal structures/api) - -// 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) - -/* - -Index of this file: - -// [SECTION] Header mess -// [SECTION] Forward declarations -// [SECTION] Context pointer -// [SECTION] STB libraries includes -// [SECTION] Macros -// [SECTION] Generic helpers -// [SECTION] ImDrawList support -// [SECTION] Widgets support: flags, enums, data structures -// [SECTION] Inputs support -// [SECTION] Clipper support -// [SECTION] Navigation support -// [SECTION] Columns support -// [SECTION] Multi-select support -// [SECTION] Docking support -// [SECTION] Viewport support -// [SECTION] Settings support -// [SECTION] Metrics, Debug tools -// [SECTION] Generic context hooks -// [SECTION] ImGuiContext (main imgui context) -// [SECTION] ImGuiWindowTempData, ImGuiWindow -// [SECTION] Tab bar, Tab item support -// [SECTION] Table support -// [SECTION] ImGui internal API -// [SECTION] ImFontAtlas internal API -// [SECTION] Test Engine specific hooks (imgui_test_engine) - -*/ - -#pragma once -#ifndef IMGUI_DISABLE - -//----------------------------------------------------------------------------- -// [SECTION] Header mess -//----------------------------------------------------------------------------- - -#ifndef IMGUI_VERSION -#include "imgui.h" -#endif - -#include // FILE*, sscanf -#include // NULL, malloc, free, qsort, atoi, atof -#include // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf -#include // INT_MIN, INT_MAX - -// Enable SSE intrinsics if available -#if (defined __SSE__ || defined __x86_64__ || defined _M_X64) && !defined(IMGUI_DISABLE_SSE) -#define IMGUI_ENABLE_SSE -#include -#endif - -// Visual Studio warnings -#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) -#pragma warning (disable: 26812) // The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer) -#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). -#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later -#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types -#endif -#endif - -// Clang/GCC warnings with -Weverything -#if defined(__clang__) -#pragma clang diagnostic push -#if __has_warning("-Wunknown-warning-option") -#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' -#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned() -#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" -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" -#pragma clang diagnostic ignored "-Wdouble-promotion" -#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision -#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn' -#elif defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind -#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#endif - -// Legacy defines -#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74 -#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS -#endif -#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74 -#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS -#endif - -// Enable stb_truetype by default unless FreeType is enabled. -// You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together. -#ifndef IMGUI_ENABLE_FREETYPE -#define IMGUI_ENABLE_STB_TRUETYPE -#endif - -//----------------------------------------------------------------------------- -// [SECTION] Forward declarations -//----------------------------------------------------------------------------- - -struct ImBitVector; // Store 1-bit per value -struct ImRect; // An axis-aligned rectangle (2 points) -struct ImDrawDataBuilder; // Helper to build a ImDrawData instance -struct ImDrawListSharedData; // Data shared between all ImDrawList instances -struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it -struct ImGuiContext; // Main Dear ImGui context -struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine -struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum -struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() -struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box -struct ImGuiLastItemData; // Status storage for last submitted items -struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only -struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result -struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions -struct ImGuiNextWindowData; // Storage for SetNextWindow** functions -struct ImGuiNextItemData; // Storage for SetNextItem** functions -struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api -struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api -struct ImGuiPopupData; // Storage for current popup stack -struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file -struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting -struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it -struct ImGuiTabBar; // Storage for a tab bar -struct ImGuiTabItem; // Storage for a tab item (within a tab bar) -struct ImGuiTable; // Storage for a table -struct ImGuiTableColumn; // Storage for one column of a table -struct ImGuiTableInstanceData; // Storage for one instance of a same table -struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables. -struct ImGuiTableSettings; // Storage for a table .ini settings -struct ImGuiTableColumnsSettings; // Storage for a column .ini settings -struct ImGuiWindow; // Storage for one window -struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window) -struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) - -// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists. -typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical -typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later) -typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags -typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressedEx() -typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag() -typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags -typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns() -typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight() -typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests -typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions -typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions -typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // Flags: for ScrollToItem() and navigation requests -typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx() -typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() -typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx() - -typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...); - -//----------------------------------------------------------------------------- -// [SECTION] Context pointer -// See implementation of this variable in imgui.cpp for comments and details. -//----------------------------------------------------------------------------- - -#ifndef GImGui -extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer -#endif - -//------------------------------------------------------------------------- -// [SECTION] STB libraries includes -//------------------------------------------------------------------------- - -namespace ImStb -{ - -#undef STB_TEXTEDIT_STRING -#undef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_STRING ImGuiInputTextState -#define STB_TEXTEDIT_CHARTYPE ImWchar -#define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) -#define STB_TEXTEDIT_UNDOSTATECOUNT 99 -#define STB_TEXTEDIT_UNDOCHARCOUNT 999 -#include "imstb_textedit.h" - -} // namespace ImStb - -//----------------------------------------------------------------------------- -// [SECTION] Macros -//----------------------------------------------------------------------------- - -// Debug Printing Into TTY -// (since IMGUI_VERSION_NUM >= 18729: IMGUI_DEBUG_LOG was reworked into IMGUI_DEBUG_PRINTF (and removed framecount from it). If you were using a #define IMGUI_DEBUG_LOG please rename) -#ifndef IMGUI_DEBUG_PRINTF -#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS -#define IMGUI_DEBUG_PRINTF(_FMT,...) printf(_FMT, __VA_ARGS__) -#else -#define IMGUI_DEBUG_PRINTF(_FMT,...) -#endif -#endif - -// Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam. -#define IMGUI_DEBUG_LOG(...) ImGui::DebugLog(__VA_ARGS__); -#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) - -// Static Asserts -#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "") - -// "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much. -// We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code. -//#define IMGUI_DEBUG_PARANOID -#ifdef IMGUI_DEBUG_PARANOID -#define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR) -#else -#define IM_ASSERT_PARANOID(_EXPR) -#endif - -// Error handling -// Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults. -#ifndef IM_ASSERT_USER_ERROR -#define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error -#endif - -// Misc Macros -#define IM_PI 3.14159265358979323846f -#ifdef _WIN32 -#define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!) -#else -#define IM_NEWLINE "\n" -#endif -#define IM_TABSIZE (4) -#define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8 -#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose -#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 -#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds -#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // - -// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall -#ifdef _MSC_VER -#define IMGUI_CDECL __cdecl -#else -#define IMGUI_CDECL -#endif - -// Warnings -#if defined(_MSC_VER) && !defined(__clang__) -#define IM_MSVC_WARNING_SUPPRESS(XXXX) __pragma(warning(suppress: XXXX)) -#else -#define IM_MSVC_WARNING_SUPPRESS(XXXX) -#endif - -// Debug Tools -// Use 'Metrics/Debugger->Tools->Item Picker' to break into the call-stack of a specific item. -// This will call IM_DEBUG_BREAK() which you may redefine yourself. See https://github.com/scottt/debugbreak for more reference. -#ifndef IM_DEBUG_BREAK -#if defined (_MSC_VER) -#define IM_DEBUG_BREAK() __debugbreak() -#elif defined(__clang__) -#define IM_DEBUG_BREAK() __builtin_debugtrap() -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -#define IM_DEBUG_BREAK() __asm__ volatile("int $0x03") -#elif defined(__GNUC__) && defined(__thumb__) -#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01") -#elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__) -#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0"); -#else -#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger! -#endif -#endif // #ifndef IM_DEBUG_BREAK - -//----------------------------------------------------------------------------- -// [SECTION] Generic helpers -// Note that the ImXXX helpers functions are lower-level than ImGui functions. -// ImGui functions or the ImGui context are never called/used from other ImXXX functions. -//----------------------------------------------------------------------------- -// - Helpers: Hashing -// - Helpers: Sorting -// - Helpers: Bit manipulation -// - Helpers: String -// - Helpers: Formatting -// - Helpers: UTF-8 <> wchar conversions -// - Helpers: ImVec2/ImVec4 operators -// - Helpers: Maths -// - Helpers: Geometry -// - Helper: ImVec1 -// - Helper: ImVec2ih -// - Helper: ImRect -// - Helper: ImBitArray -// - Helper: ImBitVector -// - Helper: ImSpan<>, ImSpanAllocator<> -// - Helper: ImPool<> -// - Helper: ImChunkStream<> -//----------------------------------------------------------------------------- - -// Helpers: Hashing -IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImU32 seed = 0); -IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0); - -// Helpers: Sorting -#ifndef ImQsort -static inline void ImQsort(void* base, size_t count, size_t size_of_element, int(IMGUI_CDECL *compare_func)(void const*, void const*)) { if (count > 1) qsort(base, count, size_of_element, compare_func); } -#endif - -// Helpers: Color Blending -IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b); - -// Helpers: Bit manipulation -static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; } -static inline bool ImIsPowerOfTwo(ImU64 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: 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* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); -IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); -IMGUI_API int ImStrlenW(const ImWchar* str); -IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line -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 void ImStrTrimBlanks(char* str); -IMGUI_API const char* ImStrSkipBlank(const char* str); -static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } -static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; } - -// Helpers: Formatting -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); -IMGUI_API void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) IM_FMTARGS(3); -IMGUI_API void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) IM_FMTLIST(3); -IMGUI_API const char* ImParseFormatFindStart(const char* format); -IMGUI_API const char* ImParseFormatFindEnd(const char* format); -IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size); -IMGUI_API void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size); -IMGUI_API const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size); -IMGUI_API int ImParseFormatPrecision(const char* format, int default_value); - -// Helpers: UTF-8 <> wchar conversions -IMGUI_API const char* ImTextCharToUtf8(char out_buf[5], unsigned int c); // return out_buf -IMGUI_API int ImTextStrToUtf8(char* out_buf, int out_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); // read one character. return input UTF-8 bytes count -IMGUI_API int ImTextStrFromUtf8(ImWchar* out_buf, int out_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 ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 -IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 - -// Helpers: ImVec2/ImVec4 operators -// We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.) -// We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself. -#ifdef IMGUI_DEFINE_MATH_OPERATORS -IM_MSVC_RUNTIME_CHECKS_OFF -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 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 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 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 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); } -IM_MSVC_RUNTIME_CHECKS_RESTORE -#endif - -// Helpers: File System -#ifdef IMGUI_DISABLE_FILE_FUNCTIONS -#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS -typedef void* ImFileHandle; -static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; } -static inline bool ImFileClose(ImFileHandle) { return false; } -static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; } -static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; } -static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; } -#endif -#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS -typedef FILE* ImFileHandle; -IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode); -IMGUI_API bool ImFileClose(ImFileHandle file); -IMGUI_API ImU64 ImFileGetSize(ImFileHandle file); -IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file); -IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file); -#else -#define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions -#endif -IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0); - -// Helpers: Maths -IM_MSVC_RUNTIME_CHECKS_OFF -// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy) -#ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS -#define ImFabs(X) fabsf(X) -#define ImSqrt(X) sqrtf(X) -#define ImFmod(X, Y) fmodf((X), (Y)) -#define ImCos(X) cosf(X) -#define ImSin(X) sinf(X) -#define ImAcos(X) acosf(X) -#define ImAtan2(Y, X) atan2f((Y), (X)) -#define ImAtof(STR) atof(STR) -//#define ImFloorStd(X) floorf(X) // We use our own, see ImFloor() and ImFloorSigned() -#define ImCeil(X) ceilf(X) -static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision -static inline double ImPow(double x, double y) { return pow(x, y); } -static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision -static inline double ImLog(double x) { return log(x); } -static inline int ImAbs(int x) { return x < 0 ? -x : x; } -static inline float ImAbs(float x) { return fabsf(x); } -static inline double ImAbs(double x) { return fabs(x); } -static inline float ImSign(float x) { return (x < 0.0f) ? -1.0f : (x > 0.0f) ? 1.0f : 0.0f; } // Sign operator - returns -1, 0 or 1 based on sign of argument -static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : (x > 0.0) ? 1.0 : 0.0; } -#ifdef IMGUI_ENABLE_SSE -static inline float ImRsqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); } -#else -static inline float ImRsqrt(float x) { return 1.0f / sqrtf(x); } -#endif -static inline double ImRsqrt(double x) { return 1.0 / sqrt(x); } -#endif -// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double -// (Exceptionally using templates here but we could also redefine them for those types) -template static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; } -template static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; } -template static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } -template static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); } -template static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; } -template static inline T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; } -template static inline T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; } -// - Misc maths helpers -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 ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); } -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 ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; } -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 ImRsqrt(d); return fail_value; } -static inline float ImFloor(float f) { return (float)(int)(f); } -static inline float ImFloorSigned(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf() -static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } -static inline ImVec2 ImFloorSigned(const ImVec2& v) { return ImVec2(ImFloorSigned(v.x), ImFloorSigned(v.y)); } -static inline int ImModPositive(int a, int b) { return (a + b) % b; } -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); } -static inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; } -IM_MSVC_RUNTIME_CHECKS_RESTORE - -// Helpers: Geometry -IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t); -IMGUI_API ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments); // For curves with explicit number of segments -IMGUI_API ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol -IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t); -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); -inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } -IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy); - -// Helper: ImVec1 (1D vector) -// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) -IM_MSVC_RUNTIME_CHECKS_OFF -struct ImVec1 -{ - float x; - constexpr ImVec1() : x(0.0f) { } - constexpr ImVec1(float _x) : x(_x) { } -}; - -// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage) -struct ImVec2ih -{ - short x, y; - constexpr ImVec2ih() : x(0), y(0) {} - constexpr ImVec2ih(short _x, short _y) : x(_x), y(_y) {} - constexpr explicit ImVec2ih(const ImVec2& rhs) : x((short)rhs.x), y((short)rhs.y) {} -}; - -// Helper: ImRect (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 - - constexpr ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {} - constexpr ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {} - constexpr ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {} - constexpr 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; } - float GetArea() const { return (Max.x - Min.x) * (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& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; } - void TranslateX(float dx) { Min.x += dx; Max.x += dx; } - void TranslateY(float dy) { Min.y += dy; Max.y += dy; } - 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 = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); } - bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } - ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); } -}; -IM_MSVC_RUNTIME_CHECKS_RESTORE - -// Helper: ImBitArray -inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; } -inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; } -inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; } -inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2) -{ - n2--; - while (n <= n2) - { - int a_mod = (n & 31); - int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1; - ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1); - arr[n >> 5] |= mask; - n = (n + 32) & ~31; - } -} - -// Helper: ImBitArray class (wrapper over ImBitArray functions) -// Store 1-bit per value. -template -struct ImBitArray -{ - ImU32 Storage[(BITCOUNT + 31) >> 5]; - ImBitArray() { ClearAllBits(); } - void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); } - void SetAllBits() { memset(Storage, 255, sizeof(Storage)); } - bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } - void SetBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Storage, n); } - void ClearBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Storage, n); } - void SetBitRange(int n, int n2) { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2) - bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } -}; - -// Helper: ImBitVector -// Store 1-bit per value. -struct IMGUI_API ImBitVector -{ - ImVector Storage; - void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); } - void Clear() { Storage.clear(); } - bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); } - void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); } - void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); } -}; - -// Helper: ImSpan<> -// Pointing to a span of data we don't own. -template -struct ImSpan -{ - T* Data; - T* DataEnd; - - // Constructors, destructor - inline ImSpan() { Data = DataEnd = NULL; } - inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; } - inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; } - - inline void set(T* data, int size) { Data = data; DataEnd = data + size; } - inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; } - inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); } - inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); } - inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } - inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } - - inline T* begin() { return Data; } - inline const T* begin() const { return Data; } - inline T* end() { return DataEnd; } - inline const T* end() const { return DataEnd; } - - // Utilities - inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; } -}; - -// Helper: ImSpanAllocator<> -// Facilitate storing multiple chunks into a single large block (the "arena") -// - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges. -template -struct ImSpanAllocator -{ - char* BasePtr; - int CurrOff; - int CurrIdx; - int Offsets[CHUNKS]; - int Sizes[CHUNKS]; - - ImSpanAllocator() { memset(this, 0, sizeof(*this)); } - inline void Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; } - inline int GetArenaSizeInBytes() { return CurrOff; } - inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; } - inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); } - inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); } - template - inline void GetSpan(int n, ImSpan* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); } -}; - -// Helper: ImPool<> -// Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer, -// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object. -typedef int ImPoolIdx; -template -struct ImPool -{ - ImVector Buf; // Contiguous data - ImGuiStorage Map; // ID->Index - ImPoolIdx FreeIdx; // Next free idx to use - ImPoolIdx AliveCount; // Number of active/alive items (for display purpose) - - ImPool() { FreeIdx = AliveCount = 0; } - ~ImPool() { Clear(); } - T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; } - T* GetByIndex(ImPoolIdx n) { return &Buf[n]; } - ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); } - T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); } - bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); } - void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = AliveCount = 0; } - T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); AliveCount++; return &Buf[idx]; } - void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); } - void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; } - void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); } - - // To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... } - // Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize() - int GetAliveCount() const { return AliveCount; } // Number of active/alive items in the pool (for display purpose) - int GetBufSize() const { return Buf.Size; } - int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere - T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); } -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - int GetSize() { return GetMapSize(); } // For ImPlot: should use GetMapSize() from (IMGUI_VERSION_NUM >= 18304) -#endif -}; - -// Helper: ImChunkStream<> -// Build and iterate a contiguous stream of variable-sized structures. -// This is used by Settings to store persistent data while reducing allocation count. -// We store the chunk size first, and align the final size on 4 bytes boundaries. -// The tedious/zealous amount of casting is to avoid -Wcast-align warnings. -template -struct ImChunkStream -{ - ImVector Buf; - - void clear() { Buf.clear(); } - bool empty() const { return Buf.Size == 0; } - int size() const { return Buf.Size; } - T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); } - T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); } - T* next_chunk(T* p) { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; } - int chunk_size(const T* p) { return ((const int*)p)[-1]; } - T* end() { return (T*)(void*)(Buf.Data + Buf.Size); } - int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; } - T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); } - void swap(ImChunkStream& rhs) { rhs.Buf.swap(Buf); } - -}; - -//----------------------------------------------------------------------------- -// [SECTION] ImDrawList support -//----------------------------------------------------------------------------- - -// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value. -// Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693 -// Number of segments (N) is calculated using equation: -// N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r -// Our equation is significantly simpler that one in the post thanks for choosing segment that is -// perpendicular to X axis. Follow steps in the article from this starting condition and you will -// will get this result. -// -// Rendering circles with an odd number of segments, while mathematically correct will produce -// asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.) -#define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2) -#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4 -#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512 -#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX) - -// Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'. -#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI)))) -#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD)) - -// ImDrawList: Lookup table size for adaptive arc drawing, cover full circle. -#ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE -#define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table. -#endif -#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle. - -// Data shared between all ImDrawList instances -// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure. -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; // Tessellation tolerance when using PathBezierCurveTo() - float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc - ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen() - ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards) - - // [Internal] Lookup tables - ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle. - float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo() - ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead) - const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas - - ImDrawListSharedData(); - void SetCircleTessellationMaxError(float max_error); -}; - -struct ImDrawDataBuilder -{ - ImVector 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(); } - int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; } - IMGUI_API void FlattenIntoSingleLayer(); -}; - -//----------------------------------------------------------------------------- -// [SECTION] Widgets support: flags, enums, data structures -//----------------------------------------------------------------------------- - -// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin(). -// This is going to be exposed in imgui.h when stabilized enough. -enum ImGuiItemFlags_ -{ - // Controlled by user - ImGuiItemFlags_None = 0, - ImGuiItemFlags_NoTabStop = 1 << 0, // false // Disable keyboard tabbing (FIXME: should merge with _NoNav) - ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings. - ImGuiItemFlags_Disabled = 1 << 2, // false // Disable interactions but doesn't affect visuals. See BeginDisabled()/EndDisabled(). See github.com/ocornut/imgui/issues/211 - ImGuiItemFlags_NoNav = 1 << 3, // false // Disable keyboard/gamepad directional navigation (FIXME: should merge with _NoTabStop) - ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false // Disable item being a candidate for default focus (e.g. used by title bar items) - ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // Disable MenuItem/Selectable() automatically closing their popup window - ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets) - ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed. - - // Controlled by widget code - ImGuiItemFlags_Inputable = 1 << 8, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature. -}; - -// Storage for LastItem data -enum ImGuiItemStatusFlags_ -{ - ImGuiItemStatusFlags_None = 0, - ImGuiItemStatusFlags_HoveredRect = 1 << 0, // Mouse position is within item rectangle (does NOT mean that the window is in correct z-order and can be hovered!, this is only one part of the most-common IsItemHovered test) - ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // g.LastItemData.DisplayRect is valid - ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) - ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected", only state changes, in order to easily handle clipping with less issues. - ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state. - ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag. - ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. - ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing. - ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8, // Set when the Focusable item just got focused by Tabbing (FIXME: to be removed soon) - -#ifdef IMGUI_ENABLE_TEST_ENGINE - ImGuiItemStatusFlags_Openable = 1 << 20, // Item is an openable (e.g. TreeNode) - ImGuiItemStatusFlags_Opened = 1 << 21, // - ImGuiItemStatusFlags_Checkable = 1 << 22, // Item is a checkable (e.g. CheckBox, MenuItem) - ImGuiItemStatusFlags_Checked = 1 << 23, // -#endif -}; - -// Extend ImGuiInputTextFlags_ -enum ImGuiInputTextFlagsPrivate_ -{ - // [Internal] - ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline() - ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data - ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match. -}; - -// Extend ImGuiButtonFlags_ -enum ImGuiButtonFlagsPrivate_ -{ - ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event) - ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using - ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item - ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release) - ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release) - ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) - ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat - ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping - ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() - ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED] - //ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled - ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // 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 << 16, // disable mouse interaction if a key modifier is held - ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) - ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated - ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item - ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold, - ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease, -}; - -// Extend ImGuiComboFlags_ -enum ImGuiComboFlagsPrivate_ -{ - ImGuiComboFlags_CustomPreview = 1 << 20, // enable BeginComboPreview() -}; - -// Extend ImGuiSliderFlags_ -enum ImGuiSliderFlagsPrivate_ -{ - ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically? - ImGuiSliderFlags_ReadOnly = 1 << 21, -}; - -// Extend ImGuiSelectableFlags_ -enum ImGuiSelectableFlagsPrivate_ -{ - // NB: need to be in sync with last value of ImGuiSelectableFlags_ - ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20, - ImGuiSelectableFlags_SelectOnNav = 1 << 21, // (WIP) Auto-select when moved into. This is not exposed in public API as to handle multi-select and modifiers we will need user to explicitly control focus scope. May be replaced with a BeginSelection() API. - ImGuiSelectableFlags_SelectOnClick = 1 << 22, // Override button behavior to react on Click (default is Click+Release) - ImGuiSelectableFlags_SelectOnRelease = 1 << 23, // Override button behavior to react on Release (default is Click+Release) - ImGuiSelectableFlags_SpanAvailWidth = 1 << 24, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus) - ImGuiSelectableFlags_DrawHoveredWhenHeld = 1 << 25, // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow. - ImGuiSelectableFlags_SetNavIdOnHover = 1 << 26, // Set Nav/Focus ID on mouse hover (used by MenuItem) - ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 27, // Disable padding each side with ItemSpacing * 0.5f -}; - -// Extend ImGuiTreeNodeFlags_ -enum ImGuiTreeNodeFlagsPrivate_ -{ - ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20, -}; - -enum ImGuiSeparatorFlags_ -{ - ImGuiSeparatorFlags_None = 0, - ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar - ImGuiSeparatorFlags_Vertical = 1 << 1, - ImGuiSeparatorFlags_SpanAllColumns = 1 << 2, -}; - -enum ImGuiTextFlags_ -{ - ImGuiTextFlags_None = 0, - ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0, -}; - -enum ImGuiTooltipFlags_ -{ - ImGuiTooltipFlags_None = 0, - ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0, // Override will clear/ignore previously submitted tooltip (defaults to append) -}; - -// FIXME: this is in development, not exposed/functional as a generic feature yet. -// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2 -enum ImGuiLayoutType_ -{ - ImGuiLayoutType_Horizontal = 0, - ImGuiLayoutType_Vertical = 1 -}; - -enum ImGuiLogType -{ - ImGuiLogType_None = 0, - ImGuiLogType_TTY, - ImGuiLogType_File, - ImGuiLogType_Buffer, - ImGuiLogType_Clipboard, -}; - -// X/Y enums are fixed to 0/1 so they may be used to index ImVec2 -enum ImGuiAxis -{ - ImGuiAxis_None = -1, - ImGuiAxis_X = 0, - ImGuiAxis_Y = 1 -}; - -enum ImGuiPlotType -{ - ImGuiPlotType_Lines, - ImGuiPlotType_Histogram, -}; - -enum ImGuiPopupPositionPolicy -{ - ImGuiPopupPositionPolicy_Default, - ImGuiPopupPositionPolicy_ComboBox, - ImGuiPopupPositionPolicy_Tooltip, -}; - -struct ImGuiDataTypeTempStorage -{ - ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT -}; - -// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). -struct ImGuiDataTypeInfo -{ - size_t Size; // Size in bytes - const char* Name; // Short descriptive name for the type, for debugging - const char* PrintFmt; // Default printf format for the type - const char* ScanFmt; // Default scanf format for the type -}; - -// Extend ImGuiDataType_ -enum ImGuiDataTypePrivate_ -{ - ImGuiDataType_String = ImGuiDataType_COUNT + 1, - ImGuiDataType_Pointer, - ImGuiDataType_ID, -}; - -// Stacked color modifier, backup of modified data so we can restore it -struct ImGuiColorMod -{ - 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; } -}; - -// Storage data for BeginComboPreview()/EndComboPreview() -struct IMGUI_API ImGuiComboPreviewData -{ - ImRect PreviewRect; - ImVec2 BackupCursorPos; - ImVec2 BackupCursorMaxPos; - ImVec2 BackupCursorPosPrevLine; - float BackupPrevLineTextBaseOffset; - ImGuiLayoutType BackupLayout; - - ImGuiComboPreviewData() { memset(this, 0, sizeof(*this)); } -}; - -// Stacked storage data for BeginGroup()/EndGroup() -struct IMGUI_API ImGuiGroupData -{ - ImGuiID WindowID; - ImVec2 BackupCursorPos; - ImVec2 BackupCursorMaxPos; - ImVec1 BackupIndent; - ImVec1 BackupGroupOffset; - ImVec2 BackupCurrLineSize; - float BackupCurrLineTextBaseOffset; - ImGuiID BackupActiveIdIsAlive; - bool BackupActiveIdPreviousFrameIsAlive; - bool BackupHoveredIdIsAlive; - bool EmitItem; -}; - -// 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 -{ - ImU32 TotalWidth; - ImU32 NextTotalWidth; - ImU16 Spacing; - ImU16 OffsetIcon; // Always zero for now - ImU16 OffsetLabel; // Offsets are locked in Update() - ImU16 OffsetShortcut; - ImU16 OffsetMark; - ImU16 Widths[4]; // Width of: Icon, Label, Shortcut, Mark (accumulators for current frame) - - ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); } - void Update(float spacing, bool window_reappearing); - float DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark); - void CalcNextTotalWidth(bool update_offsets); -}; - -// Internal state of the currently focused/edited text input box -// For a given item ID, access with ImGui::GetInputTextState() -struct IMGUI_API ImGuiInputTextState -{ - ImGuiID ID; // widget id owning the text state - int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not. - ImVector TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer. - ImVector TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. - ImVector InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) - bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) - int BufCapacityA; // end-user buffer capacity - float ScrollX; // horizontal scrolling/offset - ImStb::STB_TexteditState Stb; // state for stb_textedit.h - float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately - bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!) - bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection - bool Edited; // edited this frame - ImGuiInputTextFlags Flags; // copy of InputText() flags - - ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } - void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); } - void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } - int GetUndoAvailCount() const { return Stb.undostate.undo_point; } - int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } - void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation - - // Cursor & Selection - void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking - void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); } - bool HasSelection() const { return Stb.select_start != Stb.select_end; } - void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; } - int GetCursorPos() const { return Stb.cursor; } - int GetSelectionStart() const { return Stb.select_start; } - int GetSelectionEnd() const { return Stb.select_end; } - void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } -}; - -// Storage for current popup stack -struct ImGuiPopupData -{ - ImGuiID PopupId; // Set on OpenPopup() - ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() - ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup - int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value - int OpenFrameCount; // Set on OpenPopup() - ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate 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 - - ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; } -}; - -enum ImGuiNextWindowDataFlags_ -{ - ImGuiNextWindowDataFlags_None = 0, - ImGuiNextWindowDataFlags_HasPos = 1 << 0, - ImGuiNextWindowDataFlags_HasSize = 1 << 1, - ImGuiNextWindowDataFlags_HasContentSize = 1 << 2, - ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3, - ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4, - ImGuiNextWindowDataFlags_HasFocus = 1 << 5, - ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6, - ImGuiNextWindowDataFlags_HasScroll = 1 << 7, -}; - -// Storage for SetNexWindow** functions -struct ImGuiNextWindowData -{ - ImGuiNextWindowDataFlags Flags; - ImGuiCond PosCond; - ImGuiCond SizeCond; - ImGuiCond CollapsedCond; - ImVec2 PosVal; - ImVec2 PosPivotVal; - ImVec2 SizeVal; - ImVec2 ContentSizeVal; - ImVec2 ScrollVal; - bool CollapsedVal; - ImRect SizeConstraintRect; - ImGuiSizeCallback SizeCallback; - void* SizeCallbackUserData; - float BgAlphaVal; // Override background alpha - ImVec2 MenuBarOffsetMinVal; // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?) - - ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } - inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } -}; - -enum ImGuiNextItemDataFlags_ -{ - ImGuiNextItemDataFlags_None = 0, - ImGuiNextItemDataFlags_HasWidth = 1 << 0, - ImGuiNextItemDataFlags_HasOpen = 1 << 1, -}; - -struct ImGuiNextItemData -{ - ImGuiNextItemDataFlags Flags; - float Width; // Set by SetNextItemWidth() - ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging) - ImGuiCond OpenCond; - bool OpenVal; // Set by SetNextItemOpen() - - ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } - inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()! -}; - -// Status storage for the last submitted item -struct ImGuiLastItemData -{ - ImGuiID ID; - ImGuiItemFlags InFlags; // See ImGuiItemFlags_ - ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_ - ImRect Rect; // Full rectangle - ImRect NavRect; // Navigation scoring rectangle (not displayed) - ImRect DisplayRect; // Display rectangle (only if ImGuiItemStatusFlags_HasDisplayRect is set) - - ImGuiLastItemData() { memset(this, 0, sizeof(*this)); } -}; - -struct IMGUI_API ImGuiStackSizes -{ - short SizeOfIDStack; - short SizeOfColorStack; - short SizeOfStyleVarStack; - short SizeOfFontStack; - short SizeOfFocusScopeStack; - short SizeOfGroupStack; - short SizeOfItemFlagsStack; - short SizeOfBeginPopupStack; - short SizeOfDisabledStack; - - ImGuiStackSizes() { memset(this, 0, sizeof(*this)); } - void SetToCurrentState(); - void CompareWithCurrentState(); -}; - -// Data saved for each window pushed into the stack -struct ImGuiWindowStackData -{ - ImGuiWindow* Window; - ImGuiLastItemData ParentLastItemDataBackup; - ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting -}; - -struct ImGuiShrinkWidthItem -{ - int Index; - float Width; - float InitialWidth; -}; - -struct ImGuiPtrOrIndex -{ - void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool. - int Index; // Usually index in a main pool. - - ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; } - ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Inputs support -//----------------------------------------------------------------------------- - -typedef ImBitArray ImBitArrayForNamedKeys; - -// Extend ImGuiKey_ -enum ImGuiKeyPrivate_ -{ - ImGuiKey_LegacyNativeKey_BEGIN = 0, - ImGuiKey_LegacyNativeKey_END = 512, - ImGuiKey_Gamepad_BEGIN = ImGuiKey_GamepadStart, - ImGuiKey_Gamepad_END = ImGuiKey_GamepadRStickDown + 1, - ImGuiKey_Aliases_BEGIN = ImGuiKey_MouseLeft, - ImGuiKey_Aliases_END = ImGuiKey_COUNT, - - // [Internal] Named shortcuts for Navigation - ImGuiKey_NavKeyboardTweakSlow = ImGuiKey_ModCtrl, - ImGuiKey_NavKeyboardTweakFast = ImGuiKey_ModShift, - ImGuiKey_NavGamepadTweakSlow = ImGuiKey_GamepadL1, - ImGuiKey_NavGamepadTweakFast = ImGuiKey_GamepadR1, - ImGuiKey_NavGamepadActivate = ImGuiKey_GamepadFaceDown, - ImGuiKey_NavGamepadCancel = ImGuiKey_GamepadFaceRight, - ImGuiKey_NavGamepadMenu = ImGuiKey_GamepadFaceLeft, - ImGuiKey_NavGamepadInput = ImGuiKey_GamepadFaceUp, -}; - -enum ImGuiInputEventType -{ - ImGuiInputEventType_None = 0, - ImGuiInputEventType_MousePos, - ImGuiInputEventType_MouseWheel, - ImGuiInputEventType_MouseButton, - ImGuiInputEventType_Key, - ImGuiInputEventType_Text, - ImGuiInputEventType_Focus, - ImGuiInputEventType_COUNT -}; - -enum ImGuiInputSource -{ - ImGuiInputSource_None = 0, - ImGuiInputSource_Mouse, - ImGuiInputSource_Keyboard, - ImGuiInputSource_Gamepad, - ImGuiInputSource_Clipboard, // Currently only used by InputText() - ImGuiInputSource_Nav, // Stored in g.ActiveIdSource only - ImGuiInputSource_COUNT -}; - -// FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension? -// Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor' -struct ImGuiInputEventMousePos { float PosX, PosY; }; -struct ImGuiInputEventMouseWheel { float WheelX, WheelY; }; -struct ImGuiInputEventMouseButton { int Button; bool Down; }; -struct ImGuiInputEventKey { ImGuiKey Key; bool Down; float AnalogValue; }; -struct ImGuiInputEventText { unsigned int Char; }; -struct ImGuiInputEventAppFocused { bool Focused; }; - -struct ImGuiInputEvent -{ - ImGuiInputEventType Type; - ImGuiInputSource Source; - union - { - ImGuiInputEventMousePos MousePos; // if Type == ImGuiInputEventType_MousePos - ImGuiInputEventMouseWheel MouseWheel; // if Type == ImGuiInputEventType_MouseWheel - ImGuiInputEventMouseButton MouseButton; // if Type == ImGuiInputEventType_MouseButton - ImGuiInputEventKey Key; // if Type == ImGuiInputEventType_Key - ImGuiInputEventText Text; // if Type == ImGuiInputEventType_Text - ImGuiInputEventAppFocused AppFocused; // if Type == ImGuiInputEventType_Focus - }; - bool AddedByTestEngine; - - ImGuiInputEvent() { memset(this, 0, sizeof(*this)); } -}; - -// Flags for IsKeyPressedEx(). In upcoming feature this will be used more (and IsKeyPressedEx() renamed) -// Don't mistake with ImGuiInputTextFlags! (for ImGui::InputText() function) -enum ImGuiInputFlags_ -{ - // Flags for IsKeyPressedEx() - ImGuiInputFlags_None = 0, - ImGuiInputFlags_Repeat = 1 << 0, // Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1. - ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default) - ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast - ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster - ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak, -}; - -//----------------------------------------------------------------------------- -// [SECTION] Clipper support -//----------------------------------------------------------------------------- - -struct ImGuiListClipperRange -{ - int Min; - int Max; - bool PosToIndexConvert; // Begin/End are absolute position (will be converted to indices later) - ImS8 PosToIndexOffsetMin; // Add to Min after converting to indices - ImS8 PosToIndexOffsetMax; // Add to Min after converting to indices - - static ImGuiListClipperRange FromIndices(int min, int max) { ImGuiListClipperRange r = { min, max, false, 0, 0 }; return r; } - static ImGuiListClipperRange FromPositions(float y1, float y2, int off_min, int off_max) { ImGuiListClipperRange r = { (int)y1, (int)y2, true, (ImS8)off_min, (ImS8)off_max }; return r; } -}; - -// Temporary clipper data, buffers shared/reused between instances -struct ImGuiListClipperData -{ - ImGuiListClipper* ListClipper; - float LossynessOffset; - int StepNo; - int ItemsFrozen; - ImVector Ranges; - - ImGuiListClipperData() { memset(this, 0, sizeof(*this)); } - void Reset(ImGuiListClipper* clipper) { ListClipper = clipper; StepNo = ItemsFrozen = 0; Ranges.resize(0); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Navigation support -//----------------------------------------------------------------------------- - -enum ImGuiActivateFlags_ -{ - ImGuiActivateFlags_None = 0, - ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default if keyboard is available. - ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default if keyboard is not available. - ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection) -}; - -// Early work-in-progress API for ScrollToItem() -enum ImGuiScrollFlags_ -{ - ImGuiScrollFlags_None = 0, - ImGuiScrollFlags_KeepVisibleEdgeX = 1 << 0, // If item is not visible: scroll as little as possible on X axis to bring item back into view [default for X axis] - ImGuiScrollFlags_KeepVisibleEdgeY = 1 << 1, // If item is not visible: scroll as little as possible on Y axis to bring item back into view [default for Y axis for windows that are already visible] - ImGuiScrollFlags_KeepVisibleCenterX = 1 << 2, // If item is not visible: scroll to make the item centered on X axis [rarely used] - ImGuiScrollFlags_KeepVisibleCenterY = 1 << 3, // If item is not visible: scroll to make the item centered on Y axis - ImGuiScrollFlags_AlwaysCenterX = 1 << 4, // Always center the result item on X axis [rarely used] - ImGuiScrollFlags_AlwaysCenterY = 1 << 5, // Always center the result item on Y axis [default for Y axis for appearing window) - ImGuiScrollFlags_NoScrollParent = 1 << 6, // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to). - ImGuiScrollFlags_MaskX_ = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX, - ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY, -}; - -enum ImGuiNavHighlightFlags_ -{ - ImGuiNavHighlightFlags_None = 0, - ImGuiNavHighlightFlags_TypeDefault = 1 << 0, - ImGuiNavHighlightFlags_TypeThin = 1 << 1, - ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. - ImGuiNavHighlightFlags_NoRounding = 1 << 3, -}; - -enum ImGuiNavMoveFlags_ -{ - ImGuiNavMoveFlags_None = 0, - ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side - ImGuiNavMoveFlags_LoopY = 1 << 1, - ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left) - ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful but provided for completeness - ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place) - ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown) - ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary - ImGuiNavMoveFlags_Forwarded = 1 << 7, - ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result - ImGuiNavMoveFlags_FocusApi = 1 << 9, - ImGuiNavMoveFlags_Tabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight - ImGuiNavMoveFlags_Activate = 1 << 11, - ImGuiNavMoveFlags_DontSetNavHighlight = 1 << 12, // Do not alter the visible state of keyboard vs mouse nav highlight -}; - -enum ImGuiNavLayer -{ - ImGuiNavLayer_Main = 0, // Main scrolling layer - ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt) - ImGuiNavLayer_COUNT -}; - -struct ImGuiNavItemData -{ - ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window) - ImGuiID ID; // Init,Move // Best candidate item ID - ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID - ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space - ImGuiItemFlags InFlags; // ????,Move // Best candidate item flags - float DistBox; // Move // Best candidate box distance to current NavId - float DistCenter; // Move // Best candidate center distance to current NavId - float DistAxial; // Move // Best candidate axial distance to current NavId - - ImGuiNavItemData() { Clear(); } - void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Columns support -//----------------------------------------------------------------------------- - -// Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays! -enum ImGuiOldColumnFlags_ -{ - ImGuiOldColumnFlags_None = 0, - ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers - ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers - ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns - ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window - ImGuiOldColumnFlags_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. - - // Obsolete names (will be removed) -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, - ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, - ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, - ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, - ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, - ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize, -#endif -}; - -struct ImGuiOldColumnData -{ - float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right) - float OffsetNormBeforeResize; - ImGuiOldColumnFlags Flags; // Not exposed - ImRect ClipRect; - - ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); } -}; - -struct ImGuiOldColumns -{ - ImGuiID ID; - ImGuiOldColumnFlags Flags; - bool IsFirstFrame; - bool IsBeingResized; - int Current; - int Count; - float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x - float LineMinY, LineMaxY; - float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns() - float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns() - ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns() - ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground() - ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns() - ImVector Columns; - ImDrawListSplitter Splitter; - - ImGuiOldColumns() { memset(this, 0, sizeof(*this)); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Multi-select support -//----------------------------------------------------------------------------- - -#ifdef IMGUI_HAS_MULTI_SELECT -// -#endif // #ifdef IMGUI_HAS_MULTI_SELECT - -//----------------------------------------------------------------------------- -// [SECTION] Docking support -//----------------------------------------------------------------------------- - -#ifdef IMGUI_HAS_DOCK -// -#endif // #ifdef IMGUI_HAS_DOCK - -//----------------------------------------------------------------------------- -// [SECTION] Viewport support -//----------------------------------------------------------------------------- - -// ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!) -// Every instance of ImGuiViewport is in fact a ImGuiViewportP. -struct ImGuiViewportP : public ImGuiViewport -{ - int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used - ImDrawList* DrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. - ImDrawData DrawDataP; - ImDrawDataBuilder DrawDataBuilder; - - ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!) - ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height). - ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f. - ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f. - - ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; } - ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); } - - // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect) - ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); } - ImVec2 CalcWorkRectSize(const ImVec2& off_min, const ImVec2& off_max) const { return ImVec2(ImMax(0.0f, Size.x - off_min.x + off_max.x), ImMax(0.0f, Size.y - off_min.y + off_max.y)); } - void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkOffsetMin); WorkSize = CalcWorkRectSize(WorkOffsetMin, WorkOffsetMax); } // Update public fields - - // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry) - ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } - ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); } - ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkOffsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkOffsetMin, BuildWorkOffsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Settings support -//----------------------------------------------------------------------------- - -// Windows data saved in imgui.ini file -// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily. -// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure) -struct ImGuiWindowSettings -{ - ImGuiID ID; - ImVec2ih Pos; - ImVec2ih Size; - bool Collapsed; - bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) - - ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); } - char* GetName() { return (char*)(this + 1); } -}; - -struct ImGuiSettingsHandler -{ - const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']' - ImGuiID TypeHash; // == ImHashStr(TypeName) - void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data - void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order) - void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]" - void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry - void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order) - void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf' - void* UserData; - - ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Metrics, Debug Tools -//----------------------------------------------------------------------------- - -enum ImGuiDebugLogFlags_ -{ - // Event types - ImGuiDebugLogFlags_None = 0, - ImGuiDebugLogFlags_EventActiveId = 1 << 0, - ImGuiDebugLogFlags_EventFocus = 1 << 1, - ImGuiDebugLogFlags_EventPopup = 1 << 2, - ImGuiDebugLogFlags_EventNav = 1 << 3, - ImGuiDebugLogFlags_EventIO = 1 << 4, - ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventIO, - ImGuiDebugLogFlags_OutputToTTY = 1 << 10, // Also send output to TTY -}; - -struct ImGuiMetricsConfig -{ - bool ShowDebugLog; - bool ShowStackTool; - bool ShowWindowsRects; - bool ShowWindowsBeginOrder; - bool ShowTablesRects; - bool ShowDrawCmdMesh; - bool ShowDrawCmdBoundingBoxes; - int ShowWindowsRectsType; - int ShowTablesRectsType; - - ImGuiMetricsConfig() - { - ShowDebugLog = ShowStackTool = ShowWindowsRects = ShowWindowsBeginOrder = ShowTablesRects = false; - ShowDrawCmdMesh = true; - ShowDrawCmdBoundingBoxes = true; - ShowWindowsRectsType = ShowTablesRectsType = -1; - } -}; - -struct ImGuiStackLevelInfo -{ - ImGuiID ID; - ImS8 QueryFrameCount; // >= 1: Query in progress - bool QuerySuccess; // Obtained result from DebugHookIdInfo() - ImGuiDataType DataType : 8; - char Desc[57]; // Arbitrarily sized buffer to hold a result (FIXME: could replace Results[] with a chunk stream?) FIXME: Now that we added CTRL+C this should be fixed. - - ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); } -}; - -// State for Stack tool queries -struct ImGuiStackTool -{ - int LastActiveFrame; - int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level - ImGuiID QueryId; // ID to query details for - ImVector Results; - bool CopyToClipboardOnCtrlC; - float CopyToClipboardLastTime; - - ImGuiStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Generic context hooks -//----------------------------------------------------------------------------- - -typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook); -enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ }; - -struct ImGuiContextHook -{ - ImGuiID HookId; // A unique ID assigned by AddContextHook() - ImGuiContextHookType Type; - ImGuiID Owner; - ImGuiContextHookCallback Callback; - void* UserData; - - ImGuiContextHook() { memset(this, 0, sizeof(*this)); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] ImGuiContext (main Dear ImGui context) -//----------------------------------------------------------------------------- - -struct ImGuiContext -{ - bool Initialized; - bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it. - ImGuiIO IO; - ImVector InputEventsQueue; // Input events which will be tricked/written into IO structure. - ImVector InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail. - 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; - double Time; - int FrameCount; - int FrameCountEnded; - int FrameCountRendered; - bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame() - bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed - bool WithinEndChild; // Set within EndChild() - bool GcCompactAll; // Request full GC - bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log() - void* TestEngine; // Test engine user data - - // Windows state - ImVector Windows; // Windows, sorted in display order, back to front - ImVector WindowsFocusOrder; // Root windows, sorted in focus order, back to front. - ImVector WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child - ImVector CurrentWindowStack; - ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow* - int WindowsActiveCount; // Number of unique windows submitted by frame - ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING) - ImGuiWindow* CurrentWindow; // Window being drawn into - ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs. - ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set. - ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow. - ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window. - ImVec2 WheelingWindowRefMousePos; - float WheelingWindowTimer; - - // Item/widgets state and tracking information - ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line] - ImGuiID HoveredId; // Hovered widget, filled during the frame - ImGuiID HoveredIdPreviousFrame; - bool HoveredIdAllowOverlap; - bool HoveredIdUsingMouseWheel; // Hovered widget will use mouse wheel. Blocks scrolling the underlying window. - bool HoveredIdPreviousFrameUsingMouseWheel; - bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0. - float HoveredIdTimer; // Measure contiguous hovering time - float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active - ImGuiID ActiveId; // Active widget - ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame) - float ActiveIdTimer; - 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) - bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused. - bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. - bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state. - bool ActiveIdHasBeenEditedThisFrame; - ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) - ImGuiWindow* ActiveIdWindow; - ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard) - int ActiveIdMouseButton; - ImGuiID ActiveIdPreviousFrame; - bool ActiveIdPreviousFrameIsAlive; - bool ActiveIdPreviousFrameHasBeenEditedBefore; - ImGuiWindow* ActiveIdPreviousFrameWindow; - ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. - float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. - - // Input Ownership - ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it) - ImBitArrayForNamedKeys ActiveIdUsingKeyInputMask; // Active widget will want to read those key inputs. When we grow the ImGuiKey enum we'll need to either to order the enum to make useful keys come first, either redesign this into e.g. a small array. -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - ImU32 ActiveIdUsingNavInputMask; // If you used this. Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes 'SetActiveIdUsingKey(ImGuiKey_Escape); SetActiveIdUsingKey(ImGuiKey_NavGamepadCancel);' -#endif - - // Next window/item data - ImGuiItemFlags CurrentItemFlags; // == g.ItemFlagsStack.back() - ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions - ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd) - ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions - - // Shared stacks - ImVector ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() - ImVector StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() - ImVector FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() - ImVector FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - not inherited by Begin(), unless child window - ImVectorItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() - ImVectorGroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() - ImVectorOpenPopupStack; // Which popups are open (persistent) - ImVectorBeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) - int BeginMenuCount; - - // Viewports - ImVector Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData. - - // Gamepad/keyboard Navigation - ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow' - ImGuiID NavId; // Focused item for navigation - ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set) - ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem() - ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0 - ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat) - ImGuiID NavActivateInputId; // ~~ IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadInput) ? NavId : 0; ImGuiActivateFlags_PreferInput will be set and NavActivateId will be 0. - ImGuiActivateFlags NavActivateFlags; - ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). - ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest). - ImGuiModFlags NavJustMovedToKeyMods; - ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame. - ImGuiActivateFlags NavNextActivateFlags; - ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. - ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later. - bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid - bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) - bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover) - bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again. - - // Navigation: Init & Move Requests - bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd() - bool NavInitRequest; // Init request for appearing window to select first item - bool NavInitRequestFromMove; - ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called) - ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window) - bool NavMoveSubmitted; // Move request submitted, will process result on next NewFrame() - bool NavMoveScoringItems; // Move request submitted, still scoring incoming items - bool NavMoveForwardToNextFrame; - ImGuiNavMoveFlags NavMoveFlags; - ImGuiScrollFlags NavMoveScrollFlags; - ImGuiModFlags NavMoveKeyMods; - ImGuiDir NavMoveDir; // Direction of the move request (left/right/up/down) - ImGuiDir NavMoveDirForDebug; - ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename? - ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring. - ImRect NavScoringNoClipRect; // Some nav operations (such as PageUp/PageDown) enforce a region which clipper will attempt to always keep submitted - int NavScoringDebugCount; // Metrics for debugging - int NavTabbingDir; // Generally -1 or +1, 0 when tabbing without a nav id - int NavTabbingCounter; // >0 when counting items for tabbing - ImGuiNavItemData NavMoveResultLocal; // Best move request candidate within NavWindow - ImGuiNavItemData NavMoveResultLocalVisible; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag) - ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag) - ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy - - // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize) - ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most! - ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it. - ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents - float NavWindowingTimer; - float NavWindowingHighlightAlpha; - bool NavWindowingToggleLayer; - ImVec2 NavWindowingAccumDeltaPos; - ImVec2 NavWindowingAccumDeltaSize; - - // Render - float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) - ImGuiMouseCursor MouseCursor; - - // Drag and Drop - bool DragDropActive; - bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source. - bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target. - ImGuiDragDropFlags DragDropSourceFlags; - int DragDropSourceFrameCount; - int DragDropMouseButton; - ImGuiPayload DragDropPayload; - ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping) - ImGuiID DragDropTargetId; - ImGuiDragDropFlags DragDropAcceptFlags; - float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) - 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 - ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press. - ImVector DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size - unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads - - // Clipper - int ClipperTempDataStacked; - ImVector ClipperTempData; - - // Tables - ImGuiTable* CurrentTable; - int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size) - ImVector TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting) - ImPool Tables; // Persistent table data - ImVector TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC) - ImVector DrawChannelsTempMergeBuffer; - - // Tab bars - ImGuiTabBar* CurrentTabBar; - ImPool TabBars; - ImVector CurrentTabBarStack; - ImVector ShrinkWidthBuffer; - - // Widget state - ImVec2 MouseLastValidPos; - ImGuiInputTextState InputTextState; - ImFont InputTextPasswordFont; - ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc. - ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets - float ColorEditLastHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips - float ColorEditLastSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips - ImU32 ColorEditLastColor; // RGB value with alpha set to 0. - ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker. - ImGuiComboPreviewData ComboPreviewData; - float SliderGrabClickOffset; - float SliderCurrentAccum; // Accumulated slider delta when using navigation controls. - bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it? - bool DragCurrentAccumDirty; - float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings - float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio - float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? - float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled() - short DisabledStackSize; - short TooltipOverrideCount; - float TooltipSlowDelay; // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work) - ImVector ClipboardHandlerData; // If no custom clipboard handler is defined - ImVector MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once - - // Platform support - ImGuiPlatformImeData PlatformImeData; // Data updated by current frame - ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data (when changing we will call io.SetPlatformImeDataFn - char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point - - // Settings - bool SettingsLoaded; - float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero - ImGuiTextBuffer SettingsIniData; // In memory .ini settings - ImVector SettingsHandlers; // List of .ini settings handlers - ImChunkStream SettingsWindows; // ImGuiWindow .ini settings entries - ImChunkStream SettingsTables; // ImGuiTable .ini settings entries - ImVector Hooks; // Hooks for extensions (e.g. test engine) - ImGuiID HookIdNext; // Next available HookId - - // Capture/Logging - bool LogEnabled; // Currently capturing - ImGuiLogType LogType; // Capture target - ImFileHandle LogFile; // If != NULL log to stdout/ file - ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators. - const char* LogNextPrefix; - const char* LogNextSuffix; - float LogLinePosY; - bool LogLineFirstItem; - int LogDepthRef; - int LogDepthToExpand; - int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. - - // Debug Tools - ImGuiDebugLogFlags DebugLogFlags; - ImGuiTextBuffer DebugLogBuf; - bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker()) - ImU8 DebugItemPickerMouseButton; - ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID - ImGuiMetricsConfig DebugMetricsConfig; - ImGuiStackTool DebugStackTool; - - // Misc - float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames.. - int FramerateSecPerFrameIdx; - int FramerateSecPerFrameCount; - float FramerateSecPerFrameAccum; - int WantCaptureMouseNextFrame; // Explicit capture override via SetNextFrameWantCaptureMouse()/SetNextFrameWantCaptureKeyboard(). Default to -1. - int WantCaptureKeyboardNextFrame; // " - int WantTextInputNextFrame; - ImVector TempBuffer; // Temporary text buffer - - ImGuiContext(ImFontAtlas* shared_font_atlas) - { - Initialized = false; - FontAtlasOwnedByContext = shared_font_atlas ? false : true; - Font = NULL; - FontSize = FontBaseSize = 0.0f; - IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); - Time = 0.0f; - FrameCount = 0; - FrameCountEnded = FrameCountRendered = -1; - WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false; - GcCompactAll = false; - TestEngineHookItems = false; - TestEngine = NULL; - - WindowsActiveCount = 0; - CurrentWindow = NULL; - HoveredWindow = NULL; - HoveredWindowUnderMovingWindow = NULL; - MovingWindow = NULL; - WheelingWindow = NULL; - WheelingWindowTimer = 0.0f; - - DebugHookIdInfo = 0; - HoveredId = HoveredIdPreviousFrame = 0; - HoveredIdAllowOverlap = false; - HoveredIdUsingMouseWheel = HoveredIdPreviousFrameUsingMouseWheel = false; - HoveredIdDisabled = false; - HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f; - ActiveId = 0; - ActiveIdIsAlive = 0; - ActiveIdTimer = 0.0f; - ActiveIdIsJustActivated = false; - ActiveIdAllowOverlap = false; - ActiveIdNoClearOnFocusLoss = false; - ActiveIdHasBeenPressedBefore = false; - ActiveIdHasBeenEditedBefore = false; - ActiveIdHasBeenEditedThisFrame = false; - ActiveIdClickOffset = ImVec2(-1, -1); - ActiveIdWindow = NULL; - ActiveIdSource = ImGuiInputSource_None; - ActiveIdMouseButton = -1; - ActiveIdPreviousFrame = 0; - ActiveIdPreviousFrameIsAlive = false; - ActiveIdPreviousFrameHasBeenEditedBefore = false; - ActiveIdPreviousFrameWindow = NULL; - LastActiveId = 0; - LastActiveIdTimer = 0.0f; - - ActiveIdUsingNavDirMask = 0x00; - ActiveIdUsingKeyInputMask.ClearAllBits(); -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - ActiveIdUsingNavInputMask = 0x00; -#endif - - CurrentItemFlags = ImGuiItemFlags_None; - BeginMenuCount = 0; - - NavWindow = NULL; - NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavActivateInputId = 0; - NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0; - NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None; - NavJustMovedToKeyMods = ImGuiModFlags_None; - NavInputSource = ImGuiInputSource_None; - NavLayer = ImGuiNavLayer_Main; - NavIdIsAlive = false; - NavMousePosDirty = false; - NavDisableHighlight = true; - NavDisableMouseHover = false; - NavAnyRequest = false; - NavInitRequest = false; - NavInitRequestFromMove = false; - NavInitResultId = 0; - NavMoveSubmitted = false; - NavMoveScoringItems = false; - NavMoveForwardToNextFrame = false; - NavMoveFlags = ImGuiNavMoveFlags_None; - NavMoveScrollFlags = ImGuiScrollFlags_None; - NavMoveKeyMods = ImGuiModFlags_None; - NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None; - NavScoringDebugCount = 0; - NavTabbingDir = 0; - NavTabbingCounter = 0; - - NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL; - NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; - NavWindowingToggleLayer = false; - - DimBgRatio = 0.0f; - MouseCursor = ImGuiMouseCursor_Arrow; - - DragDropActive = DragDropWithinSource = DragDropWithinTarget = false; - DragDropSourceFlags = ImGuiDragDropFlags_None; - DragDropSourceFrameCount = -1; - DragDropMouseButton = -1; - DragDropTargetId = 0; - DragDropAcceptFlags = ImGuiDragDropFlags_None; - DragDropAcceptIdCurrRectSurface = 0.0f; - DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0; - DragDropAcceptFrameCount = -1; - DragDropHoldJustPressedId = 0; - memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); - - ClipperTempDataStacked = 0; - - CurrentTable = NULL; - TablesTempDataStacked = 0; - CurrentTabBar = NULL; - - TempInputId = 0; - ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_; - ColorEditLastHue = ColorEditLastSat = 0.0f; - ColorEditLastColor = 0; - SliderGrabClickOffset = 0.0f; - SliderCurrentAccum = 0.0f; - SliderCurrentAccumDirty = false; - DragCurrentAccumDirty = false; - DragCurrentAccum = 0.0f; - DragSpeedDefaultRatio = 1.0f / 100.0f; - DisabledAlphaBackup = 0.0f; - DisabledStackSize = 0; - ScrollbarClickDeltaToGrabCenter = 0.0f; - TooltipOverrideCount = 0; - TooltipSlowDelay = 0.50f; - - PlatformImeData.InputPos = ImVec2(0.0f, 0.0f); - PlatformImeDataPrev.InputPos = ImVec2(-1.0f, -1.0f); // Different to ensure initial submission - PlatformLocaleDecimalPoint = '.'; - - SettingsLoaded = false; - SettingsDirtyTimer = 0.0f; - HookIdNext = 0; - - LogEnabled = false; - LogType = ImGuiLogType_None; - LogNextPrefix = LogNextSuffix = NULL; - LogFile = NULL; - LogLinePosY = FLT_MAX; - LogLineFirstItem = false; - LogDepthRef = 0; - LogDepthToExpand = LogDepthToExpandDefault = 2; - - DebugLogFlags = ImGuiDebugLogFlags_OutputToTTY; - DebugItemPickerActive = false; - DebugItemPickerMouseButton = ImGuiMouseButton_Left; - DebugItemPickerBreakId = 0; - - memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); - FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0; - FramerateSecPerFrameAccum = 0.0f; - WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; - } -}; - -//----------------------------------------------------------------------------- -// [SECTION] ImGuiWindowTempData, ImGuiWindow -//----------------------------------------------------------------------------- - -// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow. -// (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..) -// (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin) -struct IMGUI_API ImGuiWindowTempData -{ - // Layout - ImVec2 CursorPos; // Current emitting position, in absolute coordinates. - ImVec2 CursorPosPrevLine; - ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding. - ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame. - ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame. - ImVec2 CurrLineSize; - ImVec2 PrevLineSize; - float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added). - float PrevLineTextBaseOffset; - bool IsSameLine; - ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.) - ImVec1 ColumnsOffset; // 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. - ImVec1 GroupOffset; - ImVec2 CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensentate and fix the most common use case of large scroll area. - - // Keyboard/Gamepad navigation - ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1) - short NavLayersActiveMask; // Which layers have been written to (result from previous frame) - short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame) - ImGuiID NavFocusScopeIdCurrent; // Current focus scope ID while appending - bool NavHideHighlightOneFrame; - bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f) - - // Miscellaneous - bool MenuBarAppending; // FIXME: Remove this - ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs. - ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement - int TreeDepth; // Current tree depth. - ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary. - ImVector ChildWindows; - ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state) - ImGuiOldColumns* CurrentColumns; // Current columns set - int CurrentTableIdx; // Current table index (into g.Tables) - ImGuiLayoutType LayoutType; - ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() - - // Local parameters stacks - // 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. - float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window). - float TextWrapPos; // Current text wrap pos. - ImVector ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth) - ImVector TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos) -}; - -// Storage for one window -struct IMGUI_API ImGuiWindow -{ - char* Name; // Window name, owned by the window. - ImGuiID ID; // == ImHashStr(Name) - ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ - ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded. - ImVec2 Pos; // Position (always rounded-up to nearest pixel) - ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) - ImVec2 SizeFull; // Size when non collapsed - ImVec2 ContentSize; // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding. - ImVec2 ContentSizeIdeal; - ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize(). - ImVec2 WindowPadding; // Window padding at the time of Begin(). - float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc. - float WindowBorderSize; // Window border size at the time of Begin(). - int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)! - ImGuiID MoveId; // == window->GetID("#MOVE") - ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window) - ImVec2 Scroll; - ImVec2 ScrollMax; - 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 - ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold - ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar. - bool ScrollbarX, ScrollbarY; // Are scrollbars visible? - 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 WantCollapseToggle; - 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 Hidden; // Do not display (== HiddenFrames*** > 0) - bool IsFallbackWindow; // Set on the "Debug##Default" window. - bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked() - bool HasCloseButton; // Set when the window has a close button (p_open != NULL) - signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) - short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) - short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0. - short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues. - short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused. - ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) - ImS8 AutoFitFramesX, AutoFitFramesY; - ImS8 AutoFitChildAxises; - bool AutoFitOnlyGrows; - ImGuiDir AutoPosLastDirection; - ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames - ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size - ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only - ImS8 DisableInputsFrames; // Disable window interactions for N frames - ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use. - ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use. - ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use. - 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. - - ImVector IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure) - ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name. - - // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer. - // The main 'OuterRect', omitted as a field, is window->Rect(). - ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window. - ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar) - ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect. - ImRect WorkRect; // Initially covers the whole scrolling region. Reduced by containers e.g columns/tables when active. Shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward). - ImRect ParentWorkRect; // Backup of WorkRect before entering a container such as columns/tables. Used by e.g. SpanAllColumns functions to easily access. Stacked containers are responsible for maintaining this. // FIXME-WORKRECT: Could be a stack? - ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back(). - ImRect ContentRegionRect; // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on. - ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window. - ImVec2ih HitTestHoleOffset; - - int LastFrameActive; // Last frame number the window was Active. - float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there) - float ItemWidthDefault; - ImGuiStorage StateStorage; - ImVector ColumnsStorage; - float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale() - int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back) - - ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer) - ImDrawList DrawListInst; - ImGuiWindow* ParentWindow; // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL. - ImGuiWindow* ParentWindowInBeginStack; - ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes. - ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child. - ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. - ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. - - ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.) - ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) - ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space - - int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy - int MemoryDrawListVtxCapacity; - bool MemoryCompacted; // Set when window extraneous data have been garbage collected - -public: - ImGuiWindow(ImGuiContext* context, const char* name); - ~ImGuiWindow(); - - ImGuiID GetID(const char* str, const char* str_end = NULL); - ImGuiID GetID(const void* ptr); - ImGuiID GetID(int n); - 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 { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; } - float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; } - ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } - float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.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()); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Tab bar, Tab item support -//----------------------------------------------------------------------------- - -// Extend ImGuiTabBarFlags_ -enum ImGuiTabBarFlagsPrivate_ -{ - ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around] - ImGuiTabBarFlags_IsFocused = 1 << 21, - ImGuiTabBarFlags_SaveSettings = 1 << 22, // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs -}; - -// Extend ImGuiTabItemFlags_ -enum ImGuiTabItemFlagsPrivate_ -{ - ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing, - ImGuiTabItemFlags_NoCloseButton = 1 << 20, // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout) - ImGuiTabItemFlags_Button = 1 << 21, // Used by TabItemButton, change the tab item behavior to mimic a button -}; - -// Storage for one active tab item (sizeof() 40 bytes) -struct ImGuiTabItem -{ - ImGuiID ID; - ImGuiTabItemFlags Flags; - int LastFrameVisible; - int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance - float Offset; // Position relative to beginning of tab - float Width; // Width currently displayed - float ContentWidth; // Width of label, stored during BeginTabItem() call - float RequestedWidth; // Width optionally requested by caller, -1.0f is unused - ImS32 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames - ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable - ImS16 IndexDuringLayout; // Index only used during TabBarLayout() - bool WantClose; // Marked as closed by SetTabItemClosed() - - ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; } -}; - -// Storage for a tab bar (sizeof() 152 bytes) -struct IMGUI_API ImGuiTabBar -{ - ImVector Tabs; - ImGuiTabBarFlags Flags; - ImGuiID ID; // Zero for tab-bars used by docking - ImGuiID SelectedTabId; // Selected tab/window - ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation - ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview) - int CurrFrameVisible; - int PrevFrameVisible; - ImRect BarRect; - float CurrTabsContentsHeight; - float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar - float WidthAllTabs; // Actual width of all tabs (locked during layout) - float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped - float ScrollingAnim; - float ScrollingTarget; - float ScrollingTargetDistToVisibility; - float ScrollingSpeed; - float ScrollingRectMinX; - float ScrollingRectMaxX; - ImGuiID ReorderRequestTabId; - ImS16 ReorderRequestOffset; - ImS8 BeginCount; - bool WantLayout; - bool VisibleTabWasSubmitted; - bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame - ImS16 TabsActiveCount; // Number of tabs submitted this frame. - ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem() - float ItemSpacingY; - ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar() - ImVec2 BackupCursorPos; - ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer. - - ImGuiTabBar(); - int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); } - const char* GetTabName(const ImGuiTabItem* tab) const - { - IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size); - return TabsNames.Buf.Data + tab->NameOffset; - } -}; - -//----------------------------------------------------------------------------- -// [SECTION] Table support -//----------------------------------------------------------------------------- - -#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color. -#define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64. -#define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableSetupDrawChannels() - -// Our current column maximum is 64 but we may raise that in the future. -typedef ImS8 ImGuiTableColumnIdx; -typedef ImU8 ImGuiTableDrawChannelIdx; - -// [Internal] sizeof() ~ 104 -// We use the terminology "Enabled" to refer to a column that is not Hidden by user/api. -// We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping. -// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". -struct ImGuiTableColumn -{ - ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_ - float WidthGiven; // Final/actual width visible == (MaxX - MinX), locked in TableUpdateLayout(). May be > WidthRequest to honor minimum width, may be < WidthRequest to honor shrinking columns down in tight space. - float MinX; // Absolute positions - float MaxX; - float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout() - float WidthAuto; // Automatic width - float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially. - float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_). - ImRect ClipRect; // Clipping rectangle for the column - ImGuiID UserID; // Optional, value passed to TableSetupColumn() - float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column - float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2) - float ItemWidth; // Current item width for the column, preserved across rows - float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width. - float ContentMaxXUnfrozen; - float ContentMaxXHeadersUsed; // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls - float ContentMaxXHeadersIdeal; - ImS16 NameOffset; // Offset into parent ColumnsNames[] - ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users) - ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder) - ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column - ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column - ImGuiTableColumnIdx SortOrder; // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort - ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[] - ImGuiTableDrawChannelIdx DrawChannelFrozen; // Draw channels for frozen rows (often headers) - ImGuiTableDrawChannelIdx DrawChannelUnfrozen; // Draw channels for unfrozen rows - bool IsEnabled; // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 0 - bool IsUserEnabled; // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling). - bool IsUserEnabledNextFrame; - bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled). - bool IsVisibleY; - bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not. - bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen). - bool IsPreserveWidthAuto; - ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte - ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit - ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem - ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending - ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3) - ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each) - ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each) - - ImGuiTableColumn() - { - memset(this, 0, sizeof(*this)); - StretchWeight = WidthRequest = -1.0f; - NameOffset = -1; - DisplayOrder = IndexWithinEnabledSet = -1; - PrevEnabledColumn = NextEnabledColumn = -1; - SortOrder = -1; - SortDirection = ImGuiSortDirection_None; - DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1; - } -}; - -// Transient cell data stored per row. -// sizeof() ~ 6 -struct ImGuiTableCellData -{ - ImU32 BgColor; // Actual color - ImGuiTableColumnIdx Column; // Column number -}; - -// Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs, does that needs they could be moved to ImGuiTableTempData ?) -struct ImGuiTableInstanceData -{ - float LastOuterHeight; // Outer height from last frame // FIXME: multi-instance issue (#3955) - float LastFirstRowHeight; // Height of first row from last frame // FIXME: possible multi-instance issue? - - ImGuiTableInstanceData() { LastOuterHeight = LastFirstRowHeight = 0.0f; } -}; - -// FIXME-TABLE: more transient data could be stored in a per-stacked table structure: DrawSplitter, SortSpecs, incoming RowData -struct IMGUI_API ImGuiTable -{ - ImGuiID ID; - ImGuiTableFlags Flags; - void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[] - ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[] - ImSpan Columns; // Point within RawData[] - ImSpan DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1) - ImSpan RowCellData; // Point within RawData[]. Store cells background requests for current row. - ImU64 EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map - ImU64 EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data - ImU64 VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect) - ImU64 RequestOutputMaskByIndex; // Column Index -> IsVisible || AutoFit (== expect user to submit items) - ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order) - int SettingsOffset; // Offset in g.SettingsTables - int LastFrameActive; - int ColumnsCount; // Number of columns declared in BeginTable() - int CurrentRow; - int CurrentColumn; - ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched. - ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with - float RowPosY1; - float RowPosY2; - float RowMinHeight; // Height submitted to TableNextRow() - float RowTextBaseline; - float RowIndentOffsetX; - ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_ - ImGuiTableRowFlags LastRowFlags : 16; - int RowBgColorCounter; // Counter for alternating background colors (can be fast-forwarded by e.g clipper), not same as CurrentRow because header rows typically don't increase this. - ImU32 RowBgColor[2]; // Background color override for current row. - ImU32 BorderColorStrong; - ImU32 BorderColorLight; - float BorderX1; - float BorderX2; - float HostIndentX; - float MinColumnWidth; - float OuterPaddingX; - float CellPaddingX; // Padding from each borders - float CellPaddingY; - float CellSpacingX1; // Spacing between non-bordered cells - float CellSpacingX2; - float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details. - float ColumnsGivenWidth; // Sum of current column width - float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window - float ColumnsStretchSumWeights; // Sum of weight of all enabled stretching columns - float ResizedColumnNextWidth; - float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. - float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. - ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). - ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is - ImRect WorkRect; - ImRect InnerClipRect; - ImRect BgClipRect; // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries - ImRect Bg0ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped - ImRect Bg2ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG2 channel. This tends to be a correct, tight-fit, because output to BG2 are done by widgets relying on regular ClipRect. - ImRect HostClipRect; // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window. - ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground() - ImGuiWindow* OuterWindow; // Parent window for the table - ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window) - ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names - ImDrawListSplitter* DrawSplitter; // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly - ImGuiTableInstanceData InstanceDataFirst; - ImVector InstanceDataExtra; // FIXME-OPT: Using a small-vector pattern would be good. - ImGuiTableColumnSortSpecs SortSpecsSingle; - ImVector SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would be good. - ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs() - ImGuiTableColumnIdx SortSpecsCount; - ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount) - ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount) - ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn() - ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column! - ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing). - ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit. - ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0. - ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame. - ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held. - ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared) - ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1 - ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column. - ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column. - ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column. - ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column. - ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot - ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count - ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset) - ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count - ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset) - ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row - ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here. - ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[] - ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen; - bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row. - bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow(). - bool IsInitializing; - bool IsSortSpecsDirty; - bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag. - bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted). - bool IsSettingsRequestLoad; - bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. - bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) - bool IsResetAllRequest; - bool IsResetDisplayOrderRequest; - bool IsUnfrozenRows; // Set when we got past the frozen row. - bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable() - bool MemoryCompacted; - bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis - - ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; } - ~ImGuiTable() { IM_FREE(RawData); } -}; - -// Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table). -// - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure. -// - We also leave out of this structure data that tend to be particularly useful for debugging/metrics. -struct IMGUI_API ImGuiTableTempData -{ - int TableIndex; // Index in g.Tables.Buf[] pool - float LastTimeActive; // Last timestamp this structure was used - - ImVec2 UserOuterSize; // outer_size.x passed to BeginTable() - ImDrawListSplitter DrawSplitter; - - ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable() - ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable() - ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable() - ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable() - ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable() - ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable() - float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable() - int HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable() - - ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; } -}; - -// sizeof() ~ 12 -struct ImGuiTableColumnSettings -{ - float WidthOrWeight; - ImGuiID UserID; - ImGuiTableColumnIdx Index; - ImGuiTableColumnIdx DisplayOrder; - ImGuiTableColumnIdx SortOrder; - ImU8 SortDirection : 2; - ImU8 IsEnabled : 1; // "Visible" in ini file - ImU8 IsStretch : 1; - - ImGuiTableColumnSettings() - { - WidthOrWeight = 0.0f; - UserID = 0; - Index = -1; - DisplayOrder = SortOrder = -1; - SortDirection = ImGuiSortDirection_None; - IsEnabled = 1; - IsStretch = 0; - } -}; - -// This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.) -struct ImGuiTableSettings -{ - ImGuiID ID; // Set to 0 to invalidate/delete the setting - ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..) - float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. - ImGuiTableColumnIdx ColumnsCount; - ImGuiTableColumnIdx ColumnsCountMax; // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher - bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) - - ImGuiTableSettings() { memset(this, 0, sizeof(*this)); } - ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); } -}; - -//----------------------------------------------------------------------------- -// [SECTION] ImGui internal API -// No guarantee of forward compatibility here! -//----------------------------------------------------------------------------- - -namespace ImGui -{ - // Windows - // 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::EndFrame()/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* FindWindowByID(ImGuiID id); - IMGUI_API ImGuiWindow* FindWindowByName(const char* name); - IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); - IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window); - IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy); - IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent); - IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below); - IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window); - IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0); - IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); - IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); - IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); - inline ImRect WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); } - inline ImRect WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); } - - // Windows: Display Order and Focus Order - IMGUI_API void FocusWindow(ImGuiWindow* window); - IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window); - IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window); - IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window); - IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window); - IMGUI_API void BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* above_window); - IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window); - IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window); - - // Fonts, drawing - IMGUI_API void SetCurrentFont(ImFont* font); - inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } - inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. - IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. - IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. - - // Init - IMGUI_API void Initialize(); - IMGUI_API void Shutdown(); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext(). - - // NewFrame - IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs); - IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); - IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); - IMGUI_API void UpdateMouseMovingWindowNewFrame(); - IMGUI_API void UpdateMouseMovingWindowEndFrame(); - - // Generic context hooks - IMGUI_API ImGuiID AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook); - IMGUI_API void RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove); - IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type); - - // Viewports - IMGUI_API void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport); - - // Settings - IMGUI_API void MarkIniSettingsDirty(); - IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window); - IMGUI_API void ClearIniSettings(); - IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name); - IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id); - IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name); - IMGUI_API void AddSettingsHandler(const ImGuiSettingsHandler* handler); - IMGUI_API void RemoveSettingsHandler(const char* type_name); - IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name); - - // Scrolling - IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is - IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x); - IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y); - IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio); - IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio); - - // Early work-in-progress API (ScrollToItem() will become public) - IMGUI_API void ScrollToItem(ImGuiScrollFlags flags = 0); - IMGUI_API void ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0); - IMGUI_API ImVec2 ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0); -//#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - inline void ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); } -//#endif - - // Basic Accessors - inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.LastItemData.ID; } // Get ID of last item (~~ often same ImGui::GetID(label) beforehand) - inline ImGuiItemStatusFlags GetItemStatusFlags(){ ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; } - inline ImGuiItemFlags GetItemFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.InFlags; } - inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; } - inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; } - IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window); - IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window); - IMGUI_API void ClearActiveID(); - IMGUI_API ImGuiID GetHoveredID(); - IMGUI_API void SetHoveredID(ImGuiID id); - IMGUI_API void KeepAliveID(ImGuiID id); - IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function. - IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes) - IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed); - - // Basic Helpers for widget code - IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); - inline void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min. - IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0); - IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); - IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id); - IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect); - IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h); - IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x); - IMGUI_API void PushMultiItemsWidths(int components, float width_full); - IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly) - IMGUI_API ImVec2 GetContentRegionMaxAbs(); - IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess); - - // Parameter stacks - IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); - IMGUI_API void PopItemFlag(); - - // Logging/Capture - IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. - IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer - IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL); - IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix); - - // Popups, Modals, Tooltips - IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags); - IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None); - IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup); - IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup); - IMGUI_API void ClosePopupsExceptModals(); - IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags); - IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); - IMGUI_API void BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags); - IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window); - IMGUI_API ImGuiWindow* GetTopMostPopupModal(); - IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal(); - IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window); - IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy); - - // Menus - IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags); - IMGUI_API bool BeginMenuEx(const char* label, const char* icon, bool enabled = true); - IMGUI_API bool MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true); - - // Combos - IMGUI_API bool BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags); - IMGUI_API bool BeginComboPreview(); - IMGUI_API void EndComboPreview(); - - // Gamepad/Keyboard Navigation - IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit); - IMGUI_API void NavInitRequestApplyResult(); - IMGUI_API bool NavMoveRequestButNoResultYet(); - IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); - IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); - IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result); - IMGUI_API void NavMoveRequestCancel(); - IMGUI_API void NavMoveRequestApplyResult(); - IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); - IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again. - IMGUI_API void SetNavWindow(ImGuiWindow* window); - IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel); - - // Focus Scope (WIP) - // This is generally used to identify a selection set (multiple of which may be in the same window), as selection - // patterns generally need to react (e.g. clear selection) when landing on an item of the set. - IMGUI_API void PushFocusScope(ImGuiID id); - IMGUI_API void PopFocusScope(); - inline ImGuiID GetFocusedFocusScope() { ImGuiContext& g = *GImGui; return g.NavFocusScopeId; } // Focus scope which is actually active - inline ImGuiID GetFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.NavFocusScopeIdCurrent; } // Focus scope we are outputting into, set by PushFocusScope() - - // Inputs - // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions. - inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; } - inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; } - inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; } - inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; } - IMGUI_API ImGuiKeyData* GetKeyData(ImGuiKey key); - IMGUI_API void GetKeyChordName(ImGuiModFlags mods, ImGuiKey key, char* out_buf, int out_buf_size); - IMGUI_API void SetItemUsingMouseWheel(); - IMGUI_API void SetActiveIdUsingNavAndKeys(); - inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; } - inline bool IsActiveIdUsingKey(ImGuiKey key) { ImGuiContext& g = *GImGui; return g.ActiveIdUsingKeyInputMask[key]; } - inline void SetActiveIdUsingKey(ImGuiKey key) { ImGuiContext& g = *GImGui; g.ActiveIdUsingKeyInputMask.SetBit(key); } - inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return ImGuiKey_MouseLeft + button; } - IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f); - IMGUI_API ImGuiModFlags GetMergedModFlags(); - IMGUI_API ImVec2 GetKeyVector2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down); - IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis); - IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate); - IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate); - IMGUI_API bool IsKeyPressedEx(ImGuiKey key, ImGuiInputFlags flags = 0); -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // [removed in 1.87] -#endif - - // Drag and Drop - IMGUI_API bool IsDragDropActive(); - IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); - IMGUI_API void ClearDragDrop(); - IMGUI_API bool IsDragDropPayloadBeingAccepted(); - - // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API) - IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect); - IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags 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); - IMGUI_API void PushColumnsBackground(); - IMGUI_API void PopColumnsBackground(); - IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count); - IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id); - IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm); - IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset); - - // Tables: Candidates for public API - IMGUI_API void TableOpenContextMenu(int column_n = -1); - IMGUI_API void TableSetColumnWidth(int column_n, float width); - IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs); - IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. - IMGUI_API float TableGetHeaderRowHeight(); - IMGUI_API void TablePushBackgroundChannel(); - IMGUI_API void TablePopBackgroundChannel(); - - // Tables: Internals - inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; } - IMGUI_API ImGuiTable* TableFindByID(ImGuiID id); - IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f); - IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count); - IMGUI_API void TableBeginApplyRequests(ImGuiTable* table); - IMGUI_API void TableSetupDrawChannels(ImGuiTable* table); - IMGUI_API void TableUpdateLayout(ImGuiTable* table); - IMGUI_API void TableUpdateBorders(ImGuiTable* table); - IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table); - IMGUI_API void TableDrawBorders(ImGuiTable* table); - IMGUI_API void TableDrawContextMenu(ImGuiTable* table); - IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table); - IMGUI_API void TableMergeDrawChannels(ImGuiTable* table); - inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; } - IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table); - IMGUI_API void TableSortSpecsBuild(ImGuiTable* table); - IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column); - IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column); - IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column); - IMGUI_API void TableBeginRow(ImGuiTable* table); - IMGUI_API void TableEndRow(ImGuiTable* table); - IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n); - IMGUI_API void TableEndCell(ImGuiTable* table); - IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n); - IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n); - IMGUI_API ImGuiID TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no = 0); - IMGUI_API float TableGetMaxColumnWidth(const ImGuiTable* table, int column_n); - IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n); - IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table); - IMGUI_API void TableRemove(ImGuiTable* table); - IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table); - IMGUI_API void TableGcCompactTransientBuffers(ImGuiTableTempData* table); - IMGUI_API void TableGcCompactSettings(); - - // Tables: Settings - IMGUI_API void TableLoadSettings(ImGuiTable* table); - IMGUI_API void TableSaveSettings(ImGuiTable* table); - IMGUI_API void TableResetSettings(ImGuiTable* table); - IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table); - IMGUI_API void TableSettingsAddSettingsHandler(); - IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count); - IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id); - - // Tab Bars - IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags); - IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id); - IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id); - IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); - IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset); - IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, ImVec2 mouse_pos); - IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar); - IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags); - IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button); - IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col); - IMGUI_API void TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped); - - // Render helpers - // 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. - // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally) - 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 RenderTextClippedEx(ImDrawList* draw_list, 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 RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known); - 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(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0); - IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight - IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. - IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow); - - // Render helpers (those functions don't access any ImGui state!) - IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f); - IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col); - IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz); - IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col); - IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding); - IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding); - - // Widgets - IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags 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); - IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos); - IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0); - IMGUI_API void Scrollbar(ImGuiAxis axis); - IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags flags); - IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col); - IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis); - IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis); - IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners - IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir); - IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags); - IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value); - IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value); - - // Widgets low-level behaviors - IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); - IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags); - IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); - IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f); - IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); - IMGUI_API void TreePushOverrideID(ImGuiID id); - IMGUI_API void TreeNodeSetOpen(ImGuiID id, bool open); - IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging. - - // Template functions are instantiated in imgui_widgets.cpp for a finite number of types. - // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036). - // e.g. " extern template IMGUI_API float RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, float v); " - template IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); - template IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); - template IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags); - template IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); - template IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v); - template IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value); - - // Data type helpers - IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type); - IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format); - IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2); - IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format); - IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2); - IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max); - - // InputText - IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags); - IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL); - inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); } - inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active - - // Color - IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags); - IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags); - IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags); - - // Plot - IMGUI_API int 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 frame_size); - - // Shade functions (write over already created vertices) - IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); - IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); - - // Garbage collection - IMGUI_API void GcCompactTransientMiscBuffers(); - IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window); - IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window); - - // Debug Log - IMGUI_API void DebugLog(const char* fmt, ...) IM_FMTARGS(1); - IMGUI_API void DebugLogV(const char* fmt, va_list args) IM_FMTLIST(1); - - // Debug Tools - IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); - IMGUI_API void ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); - inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); } - inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; } - IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); - IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end); - IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns); - IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label); - IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb); - IMGUI_API void DebugNodeFont(ImFont* font); - IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph); - IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label); - IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label); - IMGUI_API void DebugNodeTable(ImGuiTable* table); - IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings); - IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state); - IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label); - IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings); - IMGUI_API void DebugNodeWindowsList(ImVector* windows, const char* label); - IMGUI_API void DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack); - IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport); - IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb); - - // Obsolete functions -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89 - - // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets that used FocusableItemRegister(): - // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)' - // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0' - // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedTabbing) != 0 || g.NavActivateInputId == id' (WIP) - // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText() - inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd() - inline void FocusableItemUnregister(ImGuiWindow* window) { IM_ASSERT(0); IM_UNUSED(window); } // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem -#endif - -} // namespace ImGui - - -//----------------------------------------------------------------------------- -// [SECTION] ImFontAtlas internal API -//----------------------------------------------------------------------------- - -// This structure is likely to evolve as we add support for incremental atlas updates -struct ImFontBuilderIO -{ - bool (*FontBuilder_Build)(ImFontAtlas* atlas); -}; - -// Helper for font builder -#ifdef IMGUI_ENABLE_STB_TRUETYPE -IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype(); -#endif -IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas); -IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); -IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque); -IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas); -IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value); -IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value); -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); - -//----------------------------------------------------------------------------- -// [SECTION] Test Engine specific hooks (imgui_test_engine) -//----------------------------------------------------------------------------- - -#ifdef IMGUI_ENABLE_TEST_ENGINE -extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id); -extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags); -extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...); -extern const char* ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id); - -#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register item bounding box -#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional) -#define IMGUI_TEST_ENGINE_LOG(_FMT,...) if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log -#else -#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) ((void)0) -#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) ((void)g) -#endif - -//----------------------------------------------------------------------------- - -#if defined(__clang__) -#pragma clang diagnostic pop -#elif defined(__GNUC__) -#pragma GCC diagnostic pop -#endif - -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -#endif // #ifndef IMGUI_DISABLE diff --git a/dependencies/reboot/vendor/ImGui/imgui_stdlib.cpp b/dependencies/reboot/vendor/ImGui/imgui_stdlib.cpp deleted file mode 100644 index dd6bd8a..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_stdlib.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) -// This is also an example of how you may wrap your own similar types. - -// Changelog: -// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string - -#include "imgui.h" -#include "imgui_stdlib.h" - -struct InputTextCallback_UserData -{ - std::string* Str; - ImGuiInputTextCallback ChainCallback; - void* ChainCallbackUserData; -}; - -static int InputTextCallback(ImGuiInputTextCallbackData* data) -{ - InputTextCallback_UserData* user_data = (InputTextCallback_UserData*)data->UserData; - if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) - { - // Resize string callback - // If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back to what we want. - std::string* str = user_data->Str; - IM_ASSERT(data->Buf == str->c_str()); - str->resize(data->BufTextLen); - data->Buf = (char*)str->c_str(); - } - else if (user_data->ChainCallback) - { - // Forward to user callback, if any - data->UserData = user_data->ChainCallbackUserData; - return user_data->ChainCallback(data); - } - return 0; -} - -bool ImGui::InputText(const char* label, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) -{ - IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - flags |= ImGuiInputTextFlags_CallbackResize; - - InputTextCallback_UserData cb_user_data; - cb_user_data.Str = str; - cb_user_data.ChainCallback = callback; - cb_user_data.ChainCallbackUserData = user_data; - return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); -} - -bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) -{ - IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - flags |= ImGuiInputTextFlags_CallbackResize; - - InputTextCallback_UserData cb_user_data; - cb_user_data.Str = str; - cb_user_data.ChainCallback = callback; - cb_user_data.ChainCallbackUserData = user_data; - return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, &cb_user_data); -} - -bool ImGui::InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) -{ - IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - flags |= ImGuiInputTextFlags_CallbackResize; - - InputTextCallback_UserData cb_user_data; - cb_user_data.Str = str; - cb_user_data.ChainCallback = callback; - cb_user_data.ChainCallbackUserData = user_data; - return InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); -} diff --git a/dependencies/reboot/vendor/ImGui/imgui_stdlib.h b/dependencies/reboot/vendor/ImGui/imgui_stdlib.h deleted file mode 100644 index 61afc09..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_stdlib.h +++ /dev/null @@ -1,18 +0,0 @@ -// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) -// This is also an example of how you may wrap your own similar types. - -// Changelog: -// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string - -#pragma once - -#include - -namespace ImGui -{ - // ImGui::InputText() with std::string - // Because text input needs dynamic resizing, we need to setup a callback to grow the capacity - IMGUI_API bool InputText(const char* label, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputTextMultiline(const char* label, std::string* str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); - IMGUI_API bool InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); -} diff --git a/dependencies/reboot/vendor/ImGui/imgui_tables.cpp b/dependencies/reboot/vendor/ImGui/imgui_tables.cpp deleted file mode 100644 index 80ae613..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_tables.cpp +++ /dev/null @@ -1,4074 +0,0 @@ -// dear imgui, v1.89 WIP -// (tables and columns code) - -/* - -Index of this file: - -// [SECTION] Commentary -// [SECTION] Header mess -// [SECTION] Tables: Main code -// [SECTION] Tables: Simple accessors -// [SECTION] Tables: Row changes -// [SECTION] Tables: Columns changes -// [SECTION] Tables: Columns width management -// [SECTION] Tables: Drawing -// [SECTION] Tables: Sorting -// [SECTION] Tables: Headers -// [SECTION] Tables: Context Menu -// [SECTION] Tables: Settings (.ini data) -// [SECTION] Tables: Garbage Collection -// [SECTION] Tables: Debugging -// [SECTION] Columns, BeginColumns, EndColumns, etc. - -*/ - -// Navigating this file: -// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. - -//----------------------------------------------------------------------------- -// [SECTION] Commentary -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// Typical tables call flow: (root level is generally public API): -//----------------------------------------------------------------------------- -// - BeginTable() user begin into a table -// | BeginChild() - (if ScrollX/ScrollY is set) -// | TableBeginInitMemory() - first time table is used -// | TableResetSettings() - on settings reset -// | TableLoadSettings() - on settings load -// | TableBeginApplyRequests() - apply queued resizing/reordering/hiding requests -// | - TableSetColumnWidth() - apply resizing width (for mouse resize, often requested by previous frame) -// | - TableUpdateColumnsWeightFromWidth()- recompute columns weights (of stretch columns) from their respective width -// - TableSetupColumn() user submit columns details (optional) -// - TableSetupScrollFreeze() user submit scroll freeze information (optional) -//----------------------------------------------------------------------------- -// - TableUpdateLayout() [Internal] followup to BeginTable(): setup everything: widths, columns positions, clipping rectangles. Automatically called by the FIRST call to TableNextRow() or TableHeadersRow(). -// | TableSetupDrawChannels() - setup ImDrawList channels -// | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission -// | TableDrawContextMenu() - draw right-click context menu -//----------------------------------------------------------------------------- -// - TableHeadersRow() or TableHeader() user submit a headers row (optional) -// | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction -// | TableOpenContextMenu() - when right-clicked: trigger opening of the default context menu -// - TableGetSortSpecs() user queries updated sort specs (optional, generally after submitting headers) -// - TableNextRow() user begin into a new row (also automatically called by TableHeadersRow()) -// | TableEndRow() - finish existing row -// | TableBeginRow() - add a new row -// - TableSetColumnIndex() / TableNextColumn() user begin into a cell -// | TableEndCell() - close existing column/cell -// | TableBeginCell() - enter into current column/cell -// - [...] user emit contents -//----------------------------------------------------------------------------- -// - EndTable() user ends the table -// | TableDrawBorders() - draw outer borders, inner vertical borders -// | TableMergeDrawChannels() - merge draw channels if clipping isn't required -// | EndChild() - (if ScrollX/ScrollY is set) -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// TABLE SIZING -//----------------------------------------------------------------------------- -// (Read carefully because this is subtle but it does make sense!) -//----------------------------------------------------------------------------- -// About 'outer_size': -// Its meaning needs to differ slightly depending on if we are using ScrollX/ScrollY flags. -// Default value is ImVec2(0.0f, 0.0f). -// X -// - outer_size.x <= 0.0f -> Right-align from window/work-rect right-most edge. With -FLT_MIN or 0.0f will align exactly on right-most edge. -// - outer_size.x > 0.0f -> Set Fixed width. -// Y with ScrollX/ScrollY disabled: we output table directly in current window -// - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful is parent window can vertically scroll. -// - outer_size.y = 0.0f -> No minimum height (but will auto extend, unless _NoHostExtendY is set) -// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtenY is set) -// Y with ScrollX/ScrollY enabled: using a child window for scrolling -// - outer_size.y < 0.0f -> Bottom-align. Not meaningful is parent window can vertically scroll. -// - outer_size.y = 0.0f -> Bottom-align, consistent with BeginChild(). Not recommended unless table is last item in parent window. -// - outer_size.y > 0.0f -> Set Exact height. Recommended when using Scrolling on any axis. -//----------------------------------------------------------------------------- -// Outer size is also affected by the NoHostExtendX/NoHostExtendY flags. -// Important to that note how the two flags have slightly different behaviors! -// - ImGuiTableFlags_NoHostExtendX -> Make outer width auto-fit to columns (overriding outer_size.x value). Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. -// - ImGuiTableFlags_NoHostExtendY -> Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY is disabled. Data below the limit will be clipped and not visible. -// In theory ImGuiTableFlags_NoHostExtendY could be the default and any non-scrolling tables with outer_size.y != 0.0f would use exact height. -// This would be consistent but perhaps less useful and more confusing (as vertically clipped items are not easily noticeable) -//----------------------------------------------------------------------------- -// About 'inner_width': -// With ScrollX disabled: -// - inner_width -> *ignored* -// With ScrollX enabled: -// - inner_width < 0.0f -> *illegal* fit in known width (right align from outer_size.x) <-- weird -// - inner_width = 0.0f -> fit in outer_width: Fixed size columns will take space they need (if avail, otherwise shrink down), Stretch columns becomes Fixed columns. -// - inner_width > 0.0f -> override scrolling width, generally to be larger than outer_size.x. Fixed column take space they need (if avail, otherwise shrink down), Stretch columns share remaining space! -//----------------------------------------------------------------------------- -// Details: -// - If you want to use Stretch columns with ScrollX, you generally need to specify 'inner_width' otherwise the concept -// of "available space" doesn't make sense. -// - Even if not really useful, we allow 'inner_width < outer_size.x' for consistency and to facilitate understanding -// of what the value does. -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// COLUMNS SIZING POLICIES -//----------------------------------------------------------------------------- -// About overriding column sizing policy and width/weight with TableSetupColumn(): -// We use a default parameter of 'init_width_or_weight == -1'. -// - with ImGuiTableColumnFlags_WidthFixed, init_width <= 0 (default) --> width is automatic -// - with ImGuiTableColumnFlags_WidthFixed, init_width > 0 (explicit) --> width is custom -// - with ImGuiTableColumnFlags_WidthStretch, init_weight <= 0 (default) --> weight is 1.0f -// - with ImGuiTableColumnFlags_WidthStretch, init_weight > 0 (explicit) --> weight is custom -// Widths are specified _without_ CellPadding. If you specify a width of 100.0f, the column will be cover (100.0f + Padding * 2.0f) -// and you can fit a 100.0f wide item in it without clipping and with full padding. -//----------------------------------------------------------------------------- -// About default sizing policy (if you don't specify a ImGuiTableColumnFlags_WidthXXXX flag) -// - with Table policy ImGuiTableFlags_SizingFixedFit --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is equal to contents width -// - with Table policy ImGuiTableFlags_SizingFixedSame --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is max of all contents width -// - with Table policy ImGuiTableFlags_SizingStretchSame --> default Column policy is ImGuiTableColumnFlags_WidthStretch, default Weight is 1.0f -// - with Table policy ImGuiTableFlags_SizingStretchWeight --> default Column policy is ImGuiTableColumnFlags_WidthStretch, default Weight is proportional to contents -// Default Width and default Weight can be overridden when calling TableSetupColumn(). -//----------------------------------------------------------------------------- -// About mixing Fixed/Auto and Stretch columns together: -// - the typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. -// - using mixed policies with ScrollX does not make much sense, as using Stretch columns with ScrollX does not make much sense in the first place! -// that is, unless 'inner_width' is passed to BeginTable() to explicitly provide a total width to layout columns in. -// - when using ImGuiTableFlags_SizingFixedSame with mixed columns, only the Fixed/Auto columns will match their widths to the width of the maximum contents. -// - when using ImGuiTableFlags_SizingStretchSame with mixed columns, only the Stretch columns will match their weight/widths. -//----------------------------------------------------------------------------- -// About using column width: -// If a column is manual resizable or has a width specified with TableSetupColumn(): -// - you may use GetContentRegionAvail().x to query the width available in a given column. -// - right-side alignment features such as SetNextItemWidth(-x) or PushItemWidth(-x) will rely on this width. -// If the column is not resizable and has no width specified with TableSetupColumn(): -// - its width will be automatic and be set to the max of items submitted. -// - therefore you generally cannot have ALL items of the columns use e.g. SetNextItemWidth(-FLT_MIN). -// - but if the column has one or more items of known/fixed size, this will become the reference width used by SetNextItemWidth(-FLT_MIN). -//----------------------------------------------------------------------------- - - -//----------------------------------------------------------------------------- -// TABLES CLIPPING/CULLING -//----------------------------------------------------------------------------- -// About clipping/culling of Rows in Tables: -// - For large numbers of rows, it is recommended you use ImGuiListClipper to only submit visible rows. -// ImGuiListClipper is reliant on the fact that rows are of equal height. -// See 'Demo->Tables->Vertical Scrolling' or 'Demo->Tables->Advanced' for a demo of using the clipper. -// - Note that auto-resizing columns don't play well with using the clipper. -// By default a table with _ScrollX but without _Resizable will have column auto-resize. -// So, if you want to use the clipper, make sure to either enable _Resizable, either setup columns width explicitly with _WidthFixed. -//----------------------------------------------------------------------------- -// About clipping/culling of Columns in Tables: -// - Both TableSetColumnIndex() and TableNextColumn() return true when the column is visible or performing -// width measurements. Otherwise, you may skip submitting the contents of a cell/column, BUT ONLY if you know -// it is not going to contribute to row height. -// In many situations, you may skip submitting contents for every column but one (e.g. the first one). -// - Case A: column is not hidden by user, and at least partially in sight (most common case). -// - Case B: column is clipped / out of sight (because of scrolling or parent ClipRect): TableNextColumn() return false as a hint but we still allow layout output. -// - Case C: column is hidden explicitly by the user (e.g. via the context menu, or _DefaultHide column flag, etc.). -// -// [A] [B] [C] -// TableNextColumn(): true false false -> [userland] when TableNextColumn() / TableSetColumnIndex() return false, user can skip submitting items but only if the column doesn't contribute to row height. -// SkipItems: false false true -> [internal] when SkipItems is true, most widgets will early out if submitted, resulting is no layout output. -// ClipRect: normal zero-width zero-width -> [internal] when ClipRect is zero, ItemAdd() will return false and most widgets will early out mid-way. -// ImDrawList output: normal dummy dummy -> [internal] when using the dummy channel, ImDrawList submissions (if any) will be wasted (because cliprect is zero-width anyway). -// -// - We need to distinguish those cases because non-hidden columns that are clipped outside of scrolling bounds should still contribute their height to the row. -// However, in the majority of cases, the contribution to row height is the same for all columns, or the tallest cells are known by the programmer. -//----------------------------------------------------------------------------- -// About clipping/culling of whole Tables: -// - Scrolling tables with a known outer size can be clipped earlier as BeginTable() will return false. -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// [SECTION] Header mess -//----------------------------------------------------------------------------- - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#ifndef IMGUI_DISABLE - -#ifndef IMGUI_DEFINE_MATH_OPERATORS -#define IMGUI_DEFINE_MATH_OPERATORS -#endif -#include "imgui_internal.h" - -// System includes -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else -#include // intptr_t -#endif - -// Visual Studio warnings -#ifdef _MSC_VER -#pragma warning (disable: 4127) // condition expression is constant -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later -#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types -#endif -#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). -#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). -#endif - -// Clang/GCC warnings with -Weverything -#if defined(__clang__) -#if __has_warning("-Wunknown-warning-option") -#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' -#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. -#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. -#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') -#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated -#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision -#elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind -#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked -#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#endif - -//----------------------------------------------------------------------------- -// [SECTION] Tables: Main code -//----------------------------------------------------------------------------- -// - TableFixFlags() [Internal] -// - TableFindByID() [Internal] -// - BeginTable() -// - BeginTableEx() [Internal] -// - TableBeginInitMemory() [Internal] -// - TableBeginApplyRequests() [Internal] -// - TableSetupColumnFlags() [Internal] -// - TableUpdateLayout() [Internal] -// - TableUpdateBorders() [Internal] -// - EndTable() -// - TableSetupColumn() -// - TableSetupScrollFreeze() -//----------------------------------------------------------------------------- - -// Configuration -static const int TABLE_DRAW_CHANNEL_BG0 = 0; -static const int TABLE_DRAW_CHANNEL_BG2_FROZEN = 1; -static const int TABLE_DRAW_CHANNEL_NOCLIP = 2; // When using ImGuiTableFlags_NoClip (this becomes the last visible channel) -static const float TABLE_BORDER_SIZE = 1.0f; // FIXME-TABLE: Currently hard-coded because of clipping assumptions with outer borders rendering. -static const float TABLE_RESIZE_SEPARATOR_HALF_THICKNESS = 4.0f; // Extend outside inner borders. -static const float TABLE_RESIZE_SEPARATOR_FEEDBACK_TIMER = 0.06f; // Delay/timer before making the hover feedback (color+cursor) visible because tables/columns tends to be more cramped. - -// Helper -inline ImGuiTableFlags TableFixFlags(ImGuiTableFlags flags, ImGuiWindow* outer_window) -{ - // Adjust flags: set default sizing policy - if ((flags & ImGuiTableFlags_SizingMask_) == 0) - flags |= ((flags & ImGuiTableFlags_ScrollX) || (outer_window->Flags & ImGuiWindowFlags_AlwaysAutoResize)) ? ImGuiTableFlags_SizingFixedFit : ImGuiTableFlags_SizingStretchSame; - - // Adjust flags: enable NoKeepColumnsVisible when using ImGuiTableFlags_SizingFixedSame - if ((flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) - flags |= ImGuiTableFlags_NoKeepColumnsVisible; - - // Adjust flags: enforce borders when resizable - if (flags & ImGuiTableFlags_Resizable) - flags |= ImGuiTableFlags_BordersInnerV; - - // Adjust flags: disable NoHostExtendX/NoHostExtendY if we have any scrolling going on - if (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) - flags &= ~(ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_NoHostExtendY); - - // Adjust flags: NoBordersInBodyUntilResize takes priority over NoBordersInBody - if (flags & ImGuiTableFlags_NoBordersInBodyUntilResize) - flags &= ~ImGuiTableFlags_NoBordersInBody; - - // Adjust flags: disable saved settings if there's nothing to save - if ((flags & (ImGuiTableFlags_Resizable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Sortable)) == 0) - flags |= ImGuiTableFlags_NoSavedSettings; - - // Inherit _NoSavedSettings from top-level window (child windows always have _NoSavedSettings set) - if (outer_window->RootWindow->Flags & ImGuiWindowFlags_NoSavedSettings) - flags |= ImGuiTableFlags_NoSavedSettings; - - return flags; -} - -ImGuiTable* ImGui::TableFindByID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - return g.Tables.GetByKey(id); -} - -// Read about "TABLE SIZING" at the top of this file. -bool ImGui::BeginTable(const char* str_id, int columns_count, ImGuiTableFlags flags, const ImVec2& outer_size, float inner_width) -{ - ImGuiID id = GetID(str_id); - return BeginTableEx(str_id, id, columns_count, flags, outer_size, inner_width); -} - -bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags, const ImVec2& outer_size, float inner_width) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* outer_window = GetCurrentWindow(); - if (outer_window->SkipItems) // Consistent with other tables + beneficial side effect that assert on miscalling EndTable() will be more visible. - return false; - - // Sanity checks - IM_ASSERT(columns_count > 0 && columns_count <= IMGUI_TABLE_MAX_COLUMNS && "Only 1..64 columns allowed!"); - if (flags & ImGuiTableFlags_ScrollX) - IM_ASSERT(inner_width >= 0.0f); - - // If an outer size is specified ahead we will be able to early out when not visible. Exact clipping rules may evolve. - const bool use_child_window = (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) != 0; - const ImVec2 avail_size = GetContentRegionAvail(); - ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f); - ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size); - if (use_child_window && IsClippedEx(outer_rect, 0)) - { - ItemSize(outer_rect); - return false; - } - - // Acquire storage for the table - ImGuiTable* table = g.Tables.GetOrAddByKey(id); - const int instance_no = (table->LastFrameActive != g.FrameCount) ? 0 : table->InstanceCurrent + 1; - const ImGuiID instance_id = id + instance_no; - const ImGuiTableFlags table_last_flags = table->Flags; - if (instance_no > 0) - IM_ASSERT(table->ColumnsCount == columns_count && "BeginTable(): Cannot change columns count mid-frame while preserving same ID"); - - // Acquire temporary buffers - const int table_idx = g.Tables.GetIndex(table); - if (++g.TablesTempDataStacked > g.TablesTempData.Size) - g.TablesTempData.resize(g.TablesTempDataStacked, ImGuiTableTempData()); - ImGuiTableTempData* temp_data = table->TempData = &g.TablesTempData[g.TablesTempDataStacked - 1]; - temp_data->TableIndex = table_idx; - table->DrawSplitter = &table->TempData->DrawSplitter; - table->DrawSplitter->Clear(); - - // Fix flags - table->IsDefaultSizingPolicy = (flags & ImGuiTableFlags_SizingMask_) == 0; - flags = TableFixFlags(flags, outer_window); - - // Initialize - table->ID = id; - table->Flags = flags; - table->InstanceCurrent = (ImS16)instance_no; - table->LastFrameActive = g.FrameCount; - table->OuterWindow = table->InnerWindow = outer_window; - table->ColumnsCount = columns_count; - table->IsLayoutLocked = false; - table->InnerWidth = inner_width; - temp_data->UserOuterSize = outer_size; - if (instance_no > 0 && table->InstanceDataExtra.Size < instance_no) - table->InstanceDataExtra.push_back(ImGuiTableInstanceData()); - - // When not using a child window, WorkRect.Max will grow as we append contents. - if (use_child_window) - { - // Ensure no vertical scrollbar appears if we only want horizontal one, to make flag consistent - // (we have no other way to disable vertical scrollbar of a window while keeping the horizontal one showing) - ImVec2 override_content_size(FLT_MAX, FLT_MAX); - if ((flags & ImGuiTableFlags_ScrollX) && !(flags & ImGuiTableFlags_ScrollY)) - override_content_size.y = FLT_MIN; - - // Ensure specified width (when not specified, Stretched columns will act as if the width == OuterWidth and - // never lead to any scrolling). We don't handle inner_width < 0.0f, we could potentially use it to right-align - // based on the right side of the child window work rect, which would require knowing ahead if we are going to - // have decoration taking horizontal spaces (typically a vertical scrollbar). - if ((flags & ImGuiTableFlags_ScrollX) && inner_width > 0.0f) - override_content_size.x = inner_width; - - if (override_content_size.x != FLT_MAX || override_content_size.y != FLT_MAX) - SetNextWindowContentSize(ImVec2(override_content_size.x != FLT_MAX ? override_content_size.x : 0.0f, override_content_size.y != FLT_MAX ? override_content_size.y : 0.0f)); - - // Reset scroll if we are reactivating it - if ((table_last_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0) - SetNextWindowScroll(ImVec2(0.0f, 0.0f)); - - // Create scrolling region (without border and zero window padding) - ImGuiWindowFlags child_flags = (flags & ImGuiTableFlags_ScrollX) ? ImGuiWindowFlags_HorizontalScrollbar : ImGuiWindowFlags_None; - BeginChildEx(name, instance_id, outer_rect.GetSize(), false, child_flags); - table->InnerWindow = g.CurrentWindow; - table->WorkRect = table->InnerWindow->WorkRect; - table->OuterRect = table->InnerWindow->Rect(); - table->InnerRect = table->InnerWindow->InnerRect; - IM_ASSERT(table->InnerWindow->WindowPadding.x == 0.0f && table->InnerWindow->WindowPadding.y == 0.0f && table->InnerWindow->WindowBorderSize == 0.0f); - } - else - { - // For non-scrolling tables, WorkRect == OuterRect == InnerRect. - // But at this point we do NOT have a correct value for .Max.y (unless a height has been explicitly passed in). It will only be updated in EndTable(). - table->WorkRect = table->OuterRect = table->InnerRect = outer_rect; - } - - // Push a standardized ID for both child-using and not-child-using tables - PushOverrideID(instance_id); - - // Backup a copy of host window members we will modify - ImGuiWindow* inner_window = table->InnerWindow; - table->HostIndentX = inner_window->DC.Indent.x; - table->HostClipRect = inner_window->ClipRect; - table->HostSkipItems = inner_window->SkipItems; - temp_data->HostBackupWorkRect = inner_window->WorkRect; - temp_data->HostBackupParentWorkRect = inner_window->ParentWorkRect; - temp_data->HostBackupColumnsOffset = outer_window->DC.ColumnsOffset; - temp_data->HostBackupPrevLineSize = inner_window->DC.PrevLineSize; - temp_data->HostBackupCurrLineSize = inner_window->DC.CurrLineSize; - temp_data->HostBackupCursorMaxPos = inner_window->DC.CursorMaxPos; - temp_data->HostBackupItemWidth = outer_window->DC.ItemWidth; - temp_data->HostBackupItemWidthStackSize = outer_window->DC.ItemWidthStack.Size; - inner_window->DC.PrevLineSize = inner_window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); - - // Padding and Spacing - // - None ........Content..... Pad .....Content........ - // - PadOuter | Pad ..Content..... Pad .....Content.. Pad | - // - PadInner ........Content.. Pad | Pad ..Content........ - // - PadOuter+PadInner | Pad ..Content.. Pad | Pad ..Content.. Pad | - const bool pad_outer_x = (flags & ImGuiTableFlags_NoPadOuterX) ? false : (flags & ImGuiTableFlags_PadOuterX) ? true : (flags & ImGuiTableFlags_BordersOuterV) != 0; - const bool pad_inner_x = (flags & ImGuiTableFlags_NoPadInnerX) ? false : true; - const float inner_spacing_for_border = (flags & ImGuiTableFlags_BordersInnerV) ? TABLE_BORDER_SIZE : 0.0f; - const float inner_spacing_explicit = (pad_inner_x && (flags & ImGuiTableFlags_BordersInnerV) == 0) ? g.Style.CellPadding.x : 0.0f; - const float inner_padding_explicit = (pad_inner_x && (flags & ImGuiTableFlags_BordersInnerV) != 0) ? g.Style.CellPadding.x : 0.0f; - table->CellSpacingX1 = inner_spacing_explicit + inner_spacing_for_border; - table->CellSpacingX2 = inner_spacing_explicit; - table->CellPaddingX = inner_padding_explicit; - table->CellPaddingY = g.Style.CellPadding.y; - - const float outer_padding_for_border = (flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; - const float outer_padding_explicit = pad_outer_x ? g.Style.CellPadding.x : 0.0f; - table->OuterPaddingX = (outer_padding_for_border + outer_padding_explicit) - table->CellPaddingX; - - table->CurrentColumn = -1; - table->CurrentRow = -1; - table->RowBgColorCounter = 0; - table->LastRowFlags = ImGuiTableRowFlags_None; - table->InnerClipRect = (inner_window == outer_window) ? table->WorkRect : inner_window->ClipRect; - table->InnerClipRect.ClipWith(table->WorkRect); // We need this to honor inner_width - table->InnerClipRect.ClipWithFull(table->HostClipRect); - table->InnerClipRect.Max.y = (flags & ImGuiTableFlags_NoHostExtendY) ? ImMin(table->InnerClipRect.Max.y, inner_window->WorkRect.Max.y) : inner_window->ClipRect.Max.y; - - table->RowPosY1 = table->RowPosY2 = table->WorkRect.Min.y; // This is needed somehow - table->RowTextBaseline = 0.0f; // This will be cleared again by TableBeginRow() - table->FreezeRowsRequest = table->FreezeRowsCount = 0; // This will be setup by TableSetupScrollFreeze(), if any - table->FreezeColumnsRequest = table->FreezeColumnsCount = 0; - table->IsUnfrozenRows = true; - table->DeclColumnsCount = 0; - - // Using opaque colors facilitate overlapping elements of the grid - table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong); - table->BorderColorLight = GetColorU32(ImGuiCol_TableBorderLight); - - // Make table current - g.CurrentTable = table; - outer_window->DC.CurrentTableIdx = table_idx; - if (inner_window != outer_window) // So EndChild() within the inner window can restore the table properly. - inner_window->DC.CurrentTableIdx = table_idx; - - if ((table_last_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0) - table->IsResetDisplayOrderRequest = true; - - // Mark as used - if (table_idx >= g.TablesLastTimeActive.Size) - g.TablesLastTimeActive.resize(table_idx + 1, -1.0f); - g.TablesLastTimeActive[table_idx] = (float)g.Time; - temp_data->LastTimeActive = (float)g.Time; - table->MemoryCompacted = false; - - // Setup memory buffer (clear data if columns count changed) - ImGuiTableColumn* old_columns_to_preserve = NULL; - void* old_columns_raw_data = NULL; - const int old_columns_count = table->Columns.size(); - if (old_columns_count != 0 && old_columns_count != columns_count) - { - // Attempt to preserve width on column count change (#4046) - old_columns_to_preserve = table->Columns.Data; - old_columns_raw_data = table->RawData; - table->RawData = NULL; - } - if (table->RawData == NULL) - { - TableBeginInitMemory(table, columns_count); - table->IsInitializing = table->IsSettingsRequestLoad = true; - } - if (table->IsResetAllRequest) - TableResetSettings(table); - if (table->IsInitializing) - { - // Initialize - table->SettingsOffset = -1; - table->IsSortSpecsDirty = true; - table->InstanceInteracted = -1; - table->ContextPopupColumn = -1; - table->ReorderColumn = table->ResizedColumn = table->LastResizedColumn = -1; - table->AutoFitSingleColumn = -1; - table->HoveredColumnBody = table->HoveredColumnBorder = -1; - for (int n = 0; n < columns_count; n++) - { - ImGuiTableColumn* column = &table->Columns[n]; - if (old_columns_to_preserve && n < old_columns_count) - { - // FIXME: We don't attempt to preserve column order in this path. - *column = old_columns_to_preserve[n]; - } - else - { - float width_auto = column->WidthAuto; - *column = ImGuiTableColumn(); - column->WidthAuto = width_auto; - column->IsPreserveWidthAuto = true; // Preserve WidthAuto when reinitializing a live table: not technically necessary but remove a visible flicker - column->IsEnabled = column->IsUserEnabled = column->IsUserEnabledNextFrame = true; - } - column->DisplayOrder = table->DisplayOrderToIndex[n] = (ImGuiTableColumnIdx)n; - } - } - if (old_columns_raw_data) - IM_FREE(old_columns_raw_data); - - // Load settings - if (table->IsSettingsRequestLoad) - TableLoadSettings(table); - - // Handle DPI/font resize - // This is designed to facilitate DPI changes with the assumption that e.g. style.CellPadding has been scaled as well. - // It will also react to changing fonts with mixed results. It doesn't need to be perfect but merely provide a decent transition. - // FIXME-DPI: Provide consistent standards for reference size. Perhaps using g.CurrentDpiScale would be more self explanatory. - // This is will lead us to non-rounded WidthRequest in columns, which should work but is a poorly tested path. - const float new_ref_scale_unit = g.FontSize; // g.Font->GetCharAdvance('A') ? - if (table->RefScale != 0.0f && table->RefScale != new_ref_scale_unit) - { - const float scale_factor = new_ref_scale_unit / table->RefScale; - //IMGUI_DEBUG_PRINT("[table] %08X RefScaleUnit %.3f -> %.3f, scaling width by %.3f\n", table->ID, table->RefScaleUnit, new_ref_scale_unit, scale_factor); - for (int n = 0; n < columns_count; n++) - table->Columns[n].WidthRequest = table->Columns[n].WidthRequest * scale_factor; - } - table->RefScale = new_ref_scale_unit; - - // Disable output until user calls TableNextRow() or TableNextColumn() leading to the TableUpdateLayout() call.. - // This is not strictly necessary but will reduce cases were "out of table" output will be misleading to the user. - // Because we cannot safely assert in EndTable() when no rows have been created, this seems like our best option. - inner_window->SkipItems = true; - - // Clear names - // At this point the ->NameOffset field of each column will be invalid until TableUpdateLayout() or the first call to TableSetupColumn() - if (table->ColumnsNames.Buf.Size > 0) - table->ColumnsNames.Buf.resize(0); - - // Apply queued resizing/reordering/hiding requests - TableBeginApplyRequests(table); - - return true; -} - -// For reference, the average total _allocation count_ for a table is: -// + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables) -// + 1 (for table->RawData allocated below) -// + 1 (for table->ColumnsNames, if names are used) -// Shared allocations per number of nested tables -// + 1 (for table->Splitter._Channels) -// + 2 * active_channels_count (for ImDrawCmd and ImDrawIdx buffers inside channels) -// Where active_channels_count is variable but often == columns_count or columns_count + 1, see TableSetupDrawChannels() for details. -// Unused channels don't perform their +2 allocations. -void ImGui::TableBeginInitMemory(ImGuiTable* table, int columns_count) -{ - // Allocate single buffer for our arrays - ImSpanAllocator<3> span_allocator; - span_allocator.Reserve(0, columns_count * sizeof(ImGuiTableColumn)); - span_allocator.Reserve(1, columns_count * sizeof(ImGuiTableColumnIdx)); - span_allocator.Reserve(2, columns_count * sizeof(ImGuiTableCellData), 4); - table->RawData = IM_ALLOC(span_allocator.GetArenaSizeInBytes()); - memset(table->RawData, 0, span_allocator.GetArenaSizeInBytes()); - span_allocator.SetArenaBasePtr(table->RawData); - span_allocator.GetSpan(0, &table->Columns); - span_allocator.GetSpan(1, &table->DisplayOrderToIndex); - span_allocator.GetSpan(2, &table->RowCellData); -} - -// Apply queued resizing/reordering/hiding requests -void ImGui::TableBeginApplyRequests(ImGuiTable* table) -{ - // Handle resizing request - // (We process this at the first TableBegin of the frame) - // FIXME-TABLE: Contains columns if our work area doesn't allow for scrolling? - if (table->InstanceCurrent == 0) - { - if (table->ResizedColumn != -1 && table->ResizedColumnNextWidth != FLT_MAX) - TableSetColumnWidth(table->ResizedColumn, table->ResizedColumnNextWidth); - table->LastResizedColumn = table->ResizedColumn; - table->ResizedColumnNextWidth = FLT_MAX; - table->ResizedColumn = -1; - - // Process auto-fit for single column, which is a special case for stretch columns and fixed columns with FixedSame policy. - // FIXME-TABLE: Would be nice to redistribute available stretch space accordingly to other weights, instead of giving it all to siblings. - if (table->AutoFitSingleColumn != -1) - { - TableSetColumnWidth(table->AutoFitSingleColumn, table->Columns[table->AutoFitSingleColumn].WidthAuto); - table->AutoFitSingleColumn = -1; - } - } - - // Handle reordering request - // Note: we don't clear ReorderColumn after handling the request. - if (table->InstanceCurrent == 0) - { - if (table->HeldHeaderColumn == -1 && table->ReorderColumn != -1) - table->ReorderColumn = -1; - table->HeldHeaderColumn = -1; - if (table->ReorderColumn != -1 && table->ReorderColumnDir != 0) - { - // We need to handle reordering across hidden columns. - // In the configuration below, moving C to the right of E will lead to: - // ... C [D] E ---> ... [D] E C (Column name/index) - // ... 2 3 4 ... 2 3 4 (Display order) - const int reorder_dir = table->ReorderColumnDir; - IM_ASSERT(reorder_dir == -1 || reorder_dir == +1); - IM_ASSERT(table->Flags & ImGuiTableFlags_Reorderable); - ImGuiTableColumn* src_column = &table->Columns[table->ReorderColumn]; - ImGuiTableColumn* dst_column = &table->Columns[(reorder_dir == -1) ? src_column->PrevEnabledColumn : src_column->NextEnabledColumn]; - IM_UNUSED(dst_column); - const int src_order = src_column->DisplayOrder; - const int dst_order = dst_column->DisplayOrder; - src_column->DisplayOrder = (ImGuiTableColumnIdx)dst_order; - for (int order_n = src_order + reorder_dir; order_n != dst_order + reorder_dir; order_n += reorder_dir) - table->Columns[table->DisplayOrderToIndex[order_n]].DisplayOrder -= (ImGuiTableColumnIdx)reorder_dir; - IM_ASSERT(dst_column->DisplayOrder == dst_order - reorder_dir); - - // Display order is stored in both columns->IndexDisplayOrder and table->DisplayOrder[], - // rebuild the later from the former. - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n; - table->ReorderColumnDir = 0; - table->IsSettingsDirty = true; - } - } - - // Handle display order reset request - if (table->IsResetDisplayOrderRequest) - { - for (int n = 0; n < table->ColumnsCount; n++) - table->DisplayOrderToIndex[n] = table->Columns[n].DisplayOrder = (ImGuiTableColumnIdx)n; - table->IsResetDisplayOrderRequest = false; - table->IsSettingsDirty = true; - } -} - -// Adjust flags: default width mode + stretch columns are not allowed when auto extending -static void TableSetupColumnFlags(ImGuiTable* table, ImGuiTableColumn* column, ImGuiTableColumnFlags flags_in) -{ - ImGuiTableColumnFlags flags = flags_in; - - // Sizing Policy - if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0) - { - const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_); - if (table_sizing_policy == ImGuiTableFlags_SizingFixedFit || table_sizing_policy == ImGuiTableFlags_SizingFixedSame) - flags |= ImGuiTableColumnFlags_WidthFixed; - else - flags |= ImGuiTableColumnFlags_WidthStretch; - } - else - { - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiTableColumnFlags_WidthMask_)); // Check that only 1 of each set is used. - } - - // Resize - if ((table->Flags & ImGuiTableFlags_Resizable) == 0) - flags |= ImGuiTableColumnFlags_NoResize; - - // Sorting - if ((flags & ImGuiTableColumnFlags_NoSortAscending) && (flags & ImGuiTableColumnFlags_NoSortDescending)) - flags |= ImGuiTableColumnFlags_NoSort; - - // Indentation - if ((flags & ImGuiTableColumnFlags_IndentMask_) == 0) - flags |= (table->Columns.index_from_ptr(column) == 0) ? ImGuiTableColumnFlags_IndentEnable : ImGuiTableColumnFlags_IndentDisable; - - // Alignment - //if ((flags & ImGuiTableColumnFlags_AlignMask_) == 0) - // flags |= ImGuiTableColumnFlags_AlignCenter; - //IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiTableColumnFlags_AlignMask_)); // Check that only 1 of each set is used. - - // Preserve status flags - column->Flags = flags | (column->Flags & ImGuiTableColumnFlags_StatusMask_); - - // Build an ordered list of available sort directions - column->SortDirectionsAvailCount = column->SortDirectionsAvailMask = column->SortDirectionsAvailList = 0; - if (table->Flags & ImGuiTableFlags_Sortable) - { - int count = 0, mask = 0, list = 0; - if ((flags & ImGuiTableColumnFlags_PreferSortAscending) != 0 && (flags & ImGuiTableColumnFlags_NoSortAscending) == 0) { mask |= 1 << ImGuiSortDirection_Ascending; list |= ImGuiSortDirection_Ascending << (count << 1); count++; } - if ((flags & ImGuiTableColumnFlags_PreferSortDescending) != 0 && (flags & ImGuiTableColumnFlags_NoSortDescending) == 0) { mask |= 1 << ImGuiSortDirection_Descending; list |= ImGuiSortDirection_Descending << (count << 1); count++; } - if ((flags & ImGuiTableColumnFlags_PreferSortAscending) == 0 && (flags & ImGuiTableColumnFlags_NoSortAscending) == 0) { mask |= 1 << ImGuiSortDirection_Ascending; list |= ImGuiSortDirection_Ascending << (count << 1); count++; } - if ((flags & ImGuiTableColumnFlags_PreferSortDescending) == 0 && (flags & ImGuiTableColumnFlags_NoSortDescending) == 0) { mask |= 1 << ImGuiSortDirection_Descending; list |= ImGuiSortDirection_Descending << (count << 1); count++; } - if ((table->Flags & ImGuiTableFlags_SortTristate) || count == 0) { mask |= 1 << ImGuiSortDirection_None; count++; } - column->SortDirectionsAvailList = (ImU8)list; - column->SortDirectionsAvailMask = (ImU8)mask; - column->SortDirectionsAvailCount = (ImU8)count; - ImGui::TableFixColumnSortDirection(table, column); - } -} - -// Layout columns for the frame. This is in essence the followup to BeginTable(). -// Runs on the first call to TableNextRow(), to give a chance for TableSetupColumn() to be called first. -// FIXME-TABLE: Our width (and therefore our WorkRect) will be minimal in the first frame for _WidthAuto columns. -// Increase feedback side-effect with widgets relying on WorkRect.Max.x... Maybe provide a default distribution for _WidthAuto columns? -void ImGui::TableUpdateLayout(ImGuiTable* table) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(table->IsLayoutLocked == false); - - const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_); - table->IsDefaultDisplayOrder = true; - table->ColumnsEnabledCount = 0; - table->EnabledMaskByIndex = 0x00; - table->EnabledMaskByDisplayOrder = 0x00; - table->LeftMostEnabledColumn = -1; - table->MinColumnWidth = ImMax(1.0f, g.Style.FramePadding.x * 1.0f); // g.Style.ColumnsMinSpacing; // FIXME-TABLE - - // [Part 1] Apply/lock Enabled and Order states. Calculate auto/ideal width for columns. Count fixed/stretch columns. - // Process columns in their visible orders as we are building the Prev/Next indices. - int count_fixed = 0; // Number of columns that have fixed sizing policies - int count_stretch = 0; // Number of columns that have stretch sizing policies - int prev_visible_column_idx = -1; - bool has_auto_fit_request = false; - bool has_resizable = false; - float stretch_sum_width_auto = 0.0f; - float fixed_max_width_auto = 0.0f; - for (int order_n = 0; order_n < table->ColumnsCount; order_n++) - { - const int column_n = table->DisplayOrderToIndex[order_n]; - if (column_n != order_n) - table->IsDefaultDisplayOrder = false; - ImGuiTableColumn* column = &table->Columns[column_n]; - - // Clear column setup if not submitted by user. Currently we make it mandatory to call TableSetupColumn() every frame. - // It would easily work without but we're not ready to guarantee it since e.g. names need resubmission anyway. - // We take a slight shortcut but in theory we could be calling TableSetupColumn() here with dummy values, it should yield the same effect. - if (table->DeclColumnsCount <= column_n) - { - TableSetupColumnFlags(table, column, ImGuiTableColumnFlags_None); - column->NameOffset = -1; - column->UserID = 0; - column->InitStretchWeightOrWidth = -1.0f; - } - - // Update Enabled state, mark settings and sort specs dirty - if (!(table->Flags & ImGuiTableFlags_Hideable) || (column->Flags & ImGuiTableColumnFlags_NoHide)) - column->IsUserEnabledNextFrame = true; - if (column->IsUserEnabled != column->IsUserEnabledNextFrame) - { - column->IsUserEnabled = column->IsUserEnabledNextFrame; - table->IsSettingsDirty = true; - } - column->IsEnabled = column->IsUserEnabled && (column->Flags & ImGuiTableColumnFlags_Disabled) == 0; - - if (column->SortOrder != -1 && !column->IsEnabled) - table->IsSortSpecsDirty = true; - if (column->SortOrder > 0 && !(table->Flags & ImGuiTableFlags_SortMulti)) - table->IsSortSpecsDirty = true; - - // Auto-fit unsized columns - const bool start_auto_fit = (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? (column->WidthRequest < 0.0f) : (column->StretchWeight < 0.0f); - if (start_auto_fit) - column->AutoFitQueue = column->CannotSkipItemsQueue = (1 << 3) - 1; // Fit for three frames - - if (!column->IsEnabled) - { - column->IndexWithinEnabledSet = -1; - continue; - } - - // Mark as enabled and link to previous/next enabled column - column->PrevEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; - column->NextEnabledColumn = -1; - if (prev_visible_column_idx != -1) - table->Columns[prev_visible_column_idx].NextEnabledColumn = (ImGuiTableColumnIdx)column_n; - else - table->LeftMostEnabledColumn = (ImGuiTableColumnIdx)column_n; - column->IndexWithinEnabledSet = table->ColumnsEnabledCount++; - table->EnabledMaskByIndex |= (ImU64)1 << column_n; - table->EnabledMaskByDisplayOrder |= (ImU64)1 << column->DisplayOrder; - prev_visible_column_idx = column_n; - IM_ASSERT(column->IndexWithinEnabledSet <= column->DisplayOrder); - - // Calculate ideal/auto column width (that's the width required for all contents to be visible without clipping) - // Combine width from regular rows + width from headers unless requested not to. - if (!column->IsPreserveWidthAuto) - column->WidthAuto = TableGetColumnWidthAuto(table, column); - - // Non-resizable columns keep their requested width (apply user value regardless of IsPreserveWidthAuto) - const bool column_is_resizable = (column->Flags & ImGuiTableColumnFlags_NoResize) == 0; - if (column_is_resizable) - has_resizable = true; - if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && column->InitStretchWeightOrWidth > 0.0f && !column_is_resizable) - column->WidthAuto = column->InitStretchWeightOrWidth; - - if (column->AutoFitQueue != 0x00) - has_auto_fit_request = true; - if (column->Flags & ImGuiTableColumnFlags_WidthStretch) - { - stretch_sum_width_auto += column->WidthAuto; - count_stretch++; - } - else - { - fixed_max_width_auto = ImMax(fixed_max_width_auto, column->WidthAuto); - count_fixed++; - } - } - if ((table->Flags & ImGuiTableFlags_Sortable) && table->SortSpecsCount == 0 && !(table->Flags & ImGuiTableFlags_SortTristate)) - table->IsSortSpecsDirty = true; - table->RightMostEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; - IM_ASSERT(table->LeftMostEnabledColumn >= 0 && table->RightMostEnabledColumn >= 0); - - // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible - // to avoid the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). - // FIXME-TABLE: for always auto-resizing columns may not want to do that all the time. - if (has_auto_fit_request && table->OuterWindow != table->InnerWindow) - table->InnerWindow->SkipItems = false; - if (has_auto_fit_request) - table->IsSettingsDirty = true; - - // [Part 3] Fix column flags and record a few extra information. - float sum_width_requests = 0.0f; // Sum of all width for fixed and auto-resize columns, excluding width contributed by Stretch columns but including spacing/padding. - float stretch_sum_weights = 0.0f; // Sum of all weights for stretch columns. - table->LeftMostStretchedColumn = table->RightMostStretchedColumn = -1; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - if (!(table->EnabledMaskByIndex & ((ImU64)1 << column_n))) - continue; - ImGuiTableColumn* column = &table->Columns[column_n]; - - const bool column_is_resizable = (column->Flags & ImGuiTableColumnFlags_NoResize) == 0; - if (column->Flags & ImGuiTableColumnFlags_WidthFixed) - { - // Apply same widths policy - float width_auto = column->WidthAuto; - if (table_sizing_policy == ImGuiTableFlags_SizingFixedSame && (column->AutoFitQueue != 0x00 || !column_is_resizable)) - width_auto = fixed_max_width_auto; - - // Apply automatic width - // Latch initial size for fixed columns and update it constantly for auto-resizing column (unless clipped!) - if (column->AutoFitQueue != 0x00) - column->WidthRequest = width_auto; - else if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !column_is_resizable && (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n))) - column->WidthRequest = width_auto; - - // FIXME-TABLE: Increase minimum size during init frame to avoid biasing auto-fitting widgets - // (e.g. TextWrapped) too much. Otherwise what tends to happen is that TextWrapped would output a very - // large height (= first frame scrollbar display very off + clipper would skip lots of items). - // This is merely making the side-effect less extreme, but doesn't properly fixes it. - // FIXME: Move this to ->WidthGiven to avoid temporary lossyless? - // FIXME: This break IsPreserveWidthAuto from not flickering if the stored WidthAuto was smaller. - if (column->AutoFitQueue > 0x01 && table->IsInitializing && !column->IsPreserveWidthAuto) - column->WidthRequest = ImMax(column->WidthRequest, table->MinColumnWidth * 4.0f); // FIXME-TABLE: Another constant/scale? - sum_width_requests += column->WidthRequest; - } - else - { - // Initialize stretch weight - if (column->AutoFitQueue != 0x00 || column->StretchWeight < 0.0f || !column_is_resizable) - { - if (column->InitStretchWeightOrWidth > 0.0f) - column->StretchWeight = column->InitStretchWeightOrWidth; - else if (table_sizing_policy == ImGuiTableFlags_SizingStretchProp) - column->StretchWeight = (column->WidthAuto / stretch_sum_width_auto) * count_stretch; - else - column->StretchWeight = 1.0f; - } - - stretch_sum_weights += column->StretchWeight; - if (table->LeftMostStretchedColumn == -1 || table->Columns[table->LeftMostStretchedColumn].DisplayOrder > column->DisplayOrder) - table->LeftMostStretchedColumn = (ImGuiTableColumnIdx)column_n; - if (table->RightMostStretchedColumn == -1 || table->Columns[table->RightMostStretchedColumn].DisplayOrder < column->DisplayOrder) - table->RightMostStretchedColumn = (ImGuiTableColumnIdx)column_n; - } - column->IsPreserveWidthAuto = false; - sum_width_requests += table->CellPaddingX * 2.0f; - } - table->ColumnsEnabledFixedCount = (ImGuiTableColumnIdx)count_fixed; - table->ColumnsStretchSumWeights = stretch_sum_weights; - - // [Part 4] Apply final widths based on requested widths - const ImRect work_rect = table->WorkRect; - const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1); - const float width_avail = ((table->Flags & ImGuiTableFlags_ScrollX) && table->InnerWidth == 0.0f) ? table->InnerClipRect.GetWidth() : work_rect.GetWidth(); - const float width_avail_for_stretched_columns = width_avail - width_spacings - sum_width_requests; - float width_remaining_for_stretched_columns = width_avail_for_stretched_columns; - table->ColumnsGivenWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - if (!(table->EnabledMaskByIndex & ((ImU64)1 << column_n))) - continue; - ImGuiTableColumn* column = &table->Columns[column_n]; - - // Allocate width for stretched/weighted columns (StretchWeight gets converted into WidthRequest) - if (column->Flags & ImGuiTableColumnFlags_WidthStretch) - { - float weight_ratio = column->StretchWeight / stretch_sum_weights; - column->WidthRequest = IM_FLOOR(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f); - width_remaining_for_stretched_columns -= column->WidthRequest; - } - - // [Resize Rule 1] The right-most Visible column is not resizable if there is at least one Stretch column - // See additional comments in TableSetColumnWidth(). - if (column->NextEnabledColumn == -1 && table->LeftMostStretchedColumn != -1) - column->Flags |= ImGuiTableColumnFlags_NoDirectResize_; - - // Assign final width, record width in case we will need to shrink - column->WidthGiven = ImFloor(ImMax(column->WidthRequest, table->MinColumnWidth)); - table->ColumnsGivenWidth += column->WidthGiven; - } - - // [Part 5] Redistribute stretch remainder width due to rounding (remainder width is < 1.0f * number of Stretch column). - // Using right-to-left distribution (more likely to match resizing cursor). - if (width_remaining_for_stretched_columns >= 1.0f && !(table->Flags & ImGuiTableFlags_PreciseWidths)) - for (int order_n = table->ColumnsCount - 1; stretch_sum_weights > 0.0f && width_remaining_for_stretched_columns >= 1.0f && order_n >= 0; order_n--) - { - if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) - continue; - ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]]; - if (!(column->Flags & ImGuiTableColumnFlags_WidthStretch)) - continue; - column->WidthRequest += 1.0f; - column->WidthGiven += 1.0f; - width_remaining_for_stretched_columns -= 1.0f; - } - - ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); - table->HoveredColumnBody = -1; - table->HoveredColumnBorder = -1; - const ImRect mouse_hit_rect(table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.Max.x, ImMax(table->OuterRect.Max.y, table->OuterRect.Min.y + table_instance->LastOuterHeight)); - const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0); - - // [Part 6] Setup final position, offset, skip/clip states and clipping rectangles, detect hovered column - // Process columns in their visible orders as we are comparing the visible order and adjusting host_clip_rect while looping. - int visible_n = 0; - bool offset_x_frozen = (table->FreezeColumnsCount > 0); - float offset_x = ((table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x) + table->OuterPaddingX - table->CellSpacingX1; - ImRect host_clip_rect = table->InnerClipRect; - //host_clip_rect.Max.x += table->CellPaddingX + table->CellSpacingX2; - table->VisibleMaskByIndex = 0x00; - table->RequestOutputMaskByIndex = 0x00; - for (int order_n = 0; order_n < table->ColumnsCount; order_n++) - { - const int column_n = table->DisplayOrderToIndex[order_n]; - ImGuiTableColumn* column = &table->Columns[column_n]; - - column->NavLayerCurrent = (ImS8)((table->FreezeRowsCount > 0 || column_n < table->FreezeColumnsCount) ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main); - - if (offset_x_frozen && table->FreezeColumnsCount == visible_n) - { - offset_x += work_rect.Min.x - table->OuterRect.Min.x; - offset_x_frozen = false; - } - - // Clear status flags - column->Flags &= ~ImGuiTableColumnFlags_StatusMask_; - - if ((table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n)) == 0) - { - // Hidden column: clear a few fields and we are done with it for the remainder of the function. - // We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper. - column->MinX = column->MaxX = column->WorkMinX = column->ClipRect.Min.x = column->ClipRect.Max.x = offset_x; - column->WidthGiven = 0.0f; - column->ClipRect.Min.y = work_rect.Min.y; - column->ClipRect.Max.y = FLT_MAX; - column->ClipRect.ClipWithFull(host_clip_rect); - column->IsVisibleX = column->IsVisibleY = column->IsRequestOutput = false; - column->IsSkipItems = true; - column->ItemWidth = 1.0f; - continue; - } - - // Detect hovered column - if (is_hovering_table && g.IO.MousePos.x >= column->ClipRect.Min.x && g.IO.MousePos.x < column->ClipRect.Max.x) - table->HoveredColumnBody = (ImGuiTableColumnIdx)column_n; - - // Lock start position - column->MinX = offset_x; - - // Lock width based on start position and minimum/maximum width for this position - float max_width = TableGetMaxColumnWidth(table, column_n); - column->WidthGiven = ImMin(column->WidthGiven, max_width); - column->WidthGiven = ImMax(column->WidthGiven, ImMin(column->WidthRequest, table->MinColumnWidth)); - column->MaxX = offset_x + column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f; - - // Lock other positions - // - ClipRect.Min.x: Because merging draw commands doesn't compare min boundaries, we make ClipRect.Min.x match left bounds to be consistent regardless of merging. - // - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column. - // - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow. - // - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter. - column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1; - column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max - column->ItemWidth = ImFloor(column->WidthGiven * 0.65f); - column->ClipRect.Min.x = column->MinX; - column->ClipRect.Min.y = work_rect.Min.y; - column->ClipRect.Max.x = column->MaxX; //column->WorkMaxX; - column->ClipRect.Max.y = FLT_MAX; - column->ClipRect.ClipWithFull(host_clip_rect); - - // Mark column as Clipped (not in sight) - // Note that scrolling tables (where inner_window != outer_window) handle Y clipped earlier in BeginTable() so IsVisibleY really only applies to non-scrolling tables. - // FIXME-TABLE: Because InnerClipRect.Max.y is conservatively ==outer_window->ClipRect.Max.y, we never can mark columns _Above_ the scroll line as not IsVisibleY. - // Taking advantage of LastOuterHeight would yield good results there... - // FIXME-TABLE: Y clipping is disabled because it effectively means not submitting will reduce contents width which is fed to outer_window->DC.CursorMaxPos.x, - // and this may be used (e.g. typically by outer_window using AlwaysAutoResize or outer_window's horizontal scrollbar, but could be something else). - // Possible solution to preserve last known content width for clipped column. Test 'table_reported_size' fails when enabling Y clipping and window is resized small. - column->IsVisibleX = (column->ClipRect.Max.x > column->ClipRect.Min.x); - column->IsVisibleY = true; // (column->ClipRect.Max.y > column->ClipRect.Min.y); - const bool is_visible = column->IsVisibleX; //&& column->IsVisibleY; - if (is_visible) - table->VisibleMaskByIndex |= ((ImU64)1 << column_n); - - // Mark column as requesting output from user. Note that fixed + non-resizable sets are auto-fitting at all times and therefore always request output. - column->IsRequestOutput = is_visible || column->AutoFitQueue != 0 || column->CannotSkipItemsQueue != 0; - if (column->IsRequestOutput) - table->RequestOutputMaskByIndex |= ((ImU64)1 << column_n); - - // Mark column as SkipItems (ignoring all items/layout) - column->IsSkipItems = !column->IsEnabled || table->HostSkipItems; - if (column->IsSkipItems) - IM_ASSERT(!is_visible); - - // Update status flags - column->Flags |= ImGuiTableColumnFlags_IsEnabled; - if (is_visible) - column->Flags |= ImGuiTableColumnFlags_IsVisible; - if (column->SortOrder != -1) - column->Flags |= ImGuiTableColumnFlags_IsSorted; - if (table->HoveredColumnBody == column_n) - column->Flags |= ImGuiTableColumnFlags_IsHovered; - - // Alignment - // FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in - // many cases (to be able to honor this we might be able to store a log of cells width, per row, for - // visible rows, but nav/programmatic scroll would have visible artifacts.) - //if (column->Flags & ImGuiTableColumnFlags_AlignRight) - // column->WorkMinX = ImMax(column->WorkMinX, column->MaxX - column->ContentWidthRowsUnfrozen); - //else if (column->Flags & ImGuiTableColumnFlags_AlignCenter) - // column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f); - - // Reset content width variables - column->ContentMaxXFrozen = column->ContentMaxXUnfrozen = column->WorkMinX; - column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX; - - // Don't decrement auto-fit counters until container window got a chance to submit its items - if (table->HostSkipItems == false) - { - column->AutoFitQueue >>= 1; - column->CannotSkipItemsQueue >>= 1; - } - - if (visible_n < table->FreezeColumnsCount) - host_clip_rect.Min.x = ImClamp(column->MaxX + TABLE_BORDER_SIZE, host_clip_rect.Min.x, host_clip_rect.Max.x); - - offset_x += column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f; - visible_n++; - } - - // [Part 7] Detect/store when we are hovering the unused space after the right-most column (so e.g. context menus can react on it) - // Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag, either - // because of using _WidthAuto/_WidthStretch). This will hide the resizing option from the context menu. - const float unused_x1 = ImMax(table->WorkRect.Min.x, table->Columns[table->RightMostEnabledColumn].ClipRect.Max.x); - if (is_hovering_table && table->HoveredColumnBody == -1) - { - if (g.IO.MousePos.x >= unused_x1) - table->HoveredColumnBody = (ImGuiTableColumnIdx)table->ColumnsCount; - } - if (has_resizable == false && (table->Flags & ImGuiTableFlags_Resizable)) - table->Flags &= ~ImGuiTableFlags_Resizable; - - // [Part 8] Lock actual OuterRect/WorkRect right-most position. - // This is done late to handle the case of fixed-columns tables not claiming more widths that they need. - // Because of this we are careful with uses of WorkRect and InnerClipRect before this point. - if (table->RightMostStretchedColumn != -1) - table->Flags &= ~ImGuiTableFlags_NoHostExtendX; - if (table->Flags & ImGuiTableFlags_NoHostExtendX) - { - table->OuterRect.Max.x = table->WorkRect.Max.x = unused_x1; - table->InnerClipRect.Max.x = ImMin(table->InnerClipRect.Max.x, unused_x1); - } - table->InnerWindow->ParentWorkRect = table->WorkRect; - table->BorderX1 = table->InnerClipRect.Min.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : -1.0f); - table->BorderX2 = table->InnerClipRect.Max.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : +1.0f); - - // [Part 9] Allocate draw channels and setup background cliprect - TableSetupDrawChannels(table); - - // [Part 10] Hit testing on borders - if (table->Flags & ImGuiTableFlags_Resizable) - TableUpdateBorders(table); - table_instance->LastFirstRowHeight = 0.0f; - table->IsLayoutLocked = true; - table->IsUsingHeaders = false; - - // [Part 11] Context menu - if (TableBeginContextMenuPopup(table)) - { - TableDrawContextMenu(table); - EndPopup(); - } - - // [Part 13] Sanitize and build sort specs before we have a change to use them for display. - // This path will only be exercised when sort specs are modified before header rows (e.g. init or visibility change) - if (table->IsSortSpecsDirty && (table->Flags & ImGuiTableFlags_Sortable)) - TableSortSpecsBuild(table); - - // Initial state - ImGuiWindow* inner_window = table->InnerWindow; - if (table->Flags & ImGuiTableFlags_NoClip) - table->DrawSplitter->SetCurrentChannel(inner_window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP); - else - inner_window->DrawList->PushClipRect(inner_window->ClipRect.Min, inner_window->ClipRect.Max, false); -} - -// Process hit-testing on resizing borders. Actual size change will be applied in EndTable() -// - Set table->HoveredColumnBorder with a short delay/timer to reduce feedback noise -// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize widgets -// overlapping the same area. -void ImGui::TableUpdateBorders(ImGuiTable* table) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(table->Flags & ImGuiTableFlags_Resizable); - - // At this point OuterRect height may be zero or under actual final height, so we rely on temporal coherency and - // use the final height from last frame. Because this is only affecting _interaction_ with columns, it is not - // really problematic (whereas the actual visual will be displayed in EndTable() and using the current frame height). - // Actual columns highlight/render will be performed in EndTable() and not be affected. - ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); - const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS; - const float hit_y1 = table->OuterRect.Min.y; - const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight); - const float hit_y2_head = hit_y1 + table_instance->LastFirstRowHeight; - - for (int order_n = 0; order_n < table->ColumnsCount; order_n++) - { - if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) - continue; - - const int column_n = table->DisplayOrderToIndex[order_n]; - ImGuiTableColumn* column = &table->Columns[column_n]; - if (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) - continue; - - // ImGuiTableFlags_NoBordersInBodyUntilResize will be honored in TableDrawBorders() - const float border_y2_hit = (table->Flags & ImGuiTableFlags_NoBordersInBody) ? hit_y2_head : hit_y2_body; - if ((table->Flags & ImGuiTableFlags_NoBordersInBody) && table->IsUsingHeaders == false) - continue; - - if (!column->IsVisibleX && table->LastResizedColumn != column_n) - continue; - - ImGuiID column_id = TableGetColumnResizeID(table, column_n, table->InstanceCurrent); - ImRect hit_rect(column->MaxX - hit_half_width, hit_y1, column->MaxX + hit_half_width, border_y2_hit); - //GetForegroundDrawList()->AddRect(hit_rect.Min, hit_rect.Max, IM_COL32(255, 0, 0, 100)); - KeepAliveID(column_id); - - bool hovered = false, held = false; - bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus); - if (pressed && IsMouseDoubleClicked(0)) - { - TableSetColumnWidthAutoSingle(table, column_n); - ClearActiveID(); - held = hovered = false; - } - if (held) - { - if (table->LastResizedColumn == -1) - table->ResizeLockMinContentsX2 = table->RightMostEnabledColumn != -1 ? table->Columns[table->RightMostEnabledColumn].MaxX : -FLT_MAX; - table->ResizedColumn = (ImGuiTableColumnIdx)column_n; - table->InstanceInteracted = table->InstanceCurrent; - } - if ((hovered && g.HoveredIdTimer > TABLE_RESIZE_SEPARATOR_FEEDBACK_TIMER) || held) - { - table->HoveredColumnBorder = (ImGuiTableColumnIdx)column_n; - SetMouseCursor(ImGuiMouseCursor_ResizeEW); - } - } -} - -void ImGui::EndTable() -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL && "Only call EndTable() if BeginTable() returns true!"); - - // This assert would be very useful to catch a common error... unfortunately it would probably trigger in some - // cases, and for consistency user may sometimes output empty tables (and still benefit from e.g. outer border) - //IM_ASSERT(table->IsLayoutLocked && "Table unused: never called TableNextRow(), is that the intent?"); - - // If the user never got to call TableNextRow() or TableNextColumn(), we call layout ourselves to ensure all our - // code paths are consistent (instead of just hoping that TableBegin/TableEnd will work), get borders drawn, etc. - if (!table->IsLayoutLocked) - TableUpdateLayout(table); - - const ImGuiTableFlags flags = table->Flags; - ImGuiWindow* inner_window = table->InnerWindow; - ImGuiWindow* outer_window = table->OuterWindow; - ImGuiTableTempData* temp_data = table->TempData; - IM_ASSERT(inner_window == g.CurrentWindow); - IM_ASSERT(outer_window == inner_window || outer_window == inner_window->ParentWindow); - - if (table->IsInsideRow) - TableEndRow(table); - - // Context menu in columns body - if (flags & ImGuiTableFlags_ContextMenuInBody) - if (table->HoveredColumnBody != -1 && !IsAnyItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) - TableOpenContextMenu((int)table->HoveredColumnBody); - - // Finalize table height - ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); - inner_window->DC.PrevLineSize = temp_data->HostBackupPrevLineSize; - inner_window->DC.CurrLineSize = temp_data->HostBackupCurrLineSize; - inner_window->DC.CursorMaxPos = temp_data->HostBackupCursorMaxPos; - const float inner_content_max_y = table->RowPosY2; - IM_ASSERT(table->RowPosY2 == inner_window->DC.CursorPos.y); - if (inner_window != outer_window) - inner_window->DC.CursorMaxPos.y = inner_content_max_y; - else if (!(flags & ImGuiTableFlags_NoHostExtendY)) - table->OuterRect.Max.y = table->InnerRect.Max.y = ImMax(table->OuterRect.Max.y, inner_content_max_y); // Patch OuterRect/InnerRect height - table->WorkRect.Max.y = ImMax(table->WorkRect.Max.y, table->OuterRect.Max.y); - table_instance->LastOuterHeight = table->OuterRect.GetHeight(); - - // Setup inner scrolling range - // FIXME: This ideally should be done earlier, in BeginTable() SetNextWindowContentSize call, just like writing to inner_window->DC.CursorMaxPos.y, - // but since the later is likely to be impossible to do we'd rather update both axises together. - if (table->Flags & ImGuiTableFlags_ScrollX) - { - const float outer_padding_for_border = (table->Flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; - float max_pos_x = table->InnerWindow->DC.CursorMaxPos.x; - if (table->RightMostEnabledColumn != -1) - max_pos_x = ImMax(max_pos_x, table->Columns[table->RightMostEnabledColumn].WorkMaxX + table->CellPaddingX + table->OuterPaddingX - outer_padding_for_border); - if (table->ResizedColumn != -1) - max_pos_x = ImMax(max_pos_x, table->ResizeLockMinContentsX2); - table->InnerWindow->DC.CursorMaxPos.x = max_pos_x; - } - - // Pop clipping rect - if (!(flags & ImGuiTableFlags_NoClip)) - inner_window->DrawList->PopClipRect(); - inner_window->ClipRect = inner_window->DrawList->_ClipRectStack.back(); - - // Draw borders - if ((flags & ImGuiTableFlags_Borders) != 0) - TableDrawBorders(table); - -#if 0 - // Strip out dummy channel draw calls - // We have no way to prevent user submitting direct ImDrawList calls into a hidden column (but ImGui:: calls will be clipped out) - // Pros: remove draw calls which will have no effect. since they'll have zero-size cliprect they may be early out anyway. - // Cons: making it harder for users watching metrics/debugger to spot the wasted vertices. - if (table->DummyDrawChannel != (ImGuiTableColumnIdx)-1) - { - ImDrawChannel* dummy_channel = &table->DrawSplitter._Channels[table->DummyDrawChannel]; - dummy_channel->_CmdBuffer.resize(0); - dummy_channel->_IdxBuffer.resize(0); - } -#endif - - // Flatten channels and merge draw calls - ImDrawListSplitter* splitter = table->DrawSplitter; - splitter->SetCurrentChannel(inner_window->DrawList, 0); - if ((table->Flags & ImGuiTableFlags_NoClip) == 0) - TableMergeDrawChannels(table); - splitter->Merge(inner_window->DrawList); - - // Update ColumnsAutoFitWidth to get us ahead for host using our size to auto-resize without waiting for next BeginTable() - float auto_fit_width_for_fixed = 0.0f; - float auto_fit_width_for_stretched = 0.0f; - float auto_fit_width_for_stretched_min = 0.0f; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - if (table->EnabledMaskByIndex & ((ImU64)1 << column_n)) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - float column_width_request = ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !(column->Flags & ImGuiTableColumnFlags_NoResize)) ? column->WidthRequest : TableGetColumnWidthAuto(table, column); - if (column->Flags & ImGuiTableColumnFlags_WidthFixed) - auto_fit_width_for_fixed += column_width_request; - else - auto_fit_width_for_stretched += column_width_request; - if ((column->Flags & ImGuiTableColumnFlags_WidthStretch) && (column->Flags & ImGuiTableColumnFlags_NoResize) != 0) - auto_fit_width_for_stretched_min = ImMax(auto_fit_width_for_stretched_min, column_width_request / (column->StretchWeight / table->ColumnsStretchSumWeights)); - } - const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1); - table->ColumnsAutoFitWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount + auto_fit_width_for_fixed + ImMax(auto_fit_width_for_stretched, auto_fit_width_for_stretched_min); - - // Update scroll - if ((table->Flags & ImGuiTableFlags_ScrollX) == 0 && inner_window != outer_window) - { - inner_window->Scroll.x = 0.0f; - } - else if (table->LastResizedColumn != -1 && table->ResizedColumn == -1 && inner_window->ScrollbarX && table->InstanceInteracted == table->InstanceCurrent) - { - // When releasing a column being resized, scroll to keep the resulting column in sight - const float neighbor_width_to_keep_visible = table->MinColumnWidth + table->CellPaddingX * 2.0f; - ImGuiTableColumn* column = &table->Columns[table->LastResizedColumn]; - if (column->MaxX < table->InnerClipRect.Min.x) - SetScrollFromPosX(inner_window, column->MaxX - inner_window->Pos.x - neighbor_width_to_keep_visible, 1.0f); - else if (column->MaxX > table->InnerClipRect.Max.x) - SetScrollFromPosX(inner_window, column->MaxX - inner_window->Pos.x + neighbor_width_to_keep_visible, 1.0f); - } - - // Apply resizing/dragging at the end of the frame - if (table->ResizedColumn != -1 && table->InstanceCurrent == table->InstanceInteracted) - { - ImGuiTableColumn* column = &table->Columns[table->ResizedColumn]; - const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + TABLE_RESIZE_SEPARATOR_HALF_THICKNESS); - const float new_width = ImFloor(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f); - table->ResizedColumnNextWidth = new_width; - } - - // Pop from id stack - IM_ASSERT_USER_ERROR(inner_window->IDStack.back() == table->ID + table->InstanceCurrent, "Mismatching PushID/PopID!"); - IM_ASSERT_USER_ERROR(outer_window->DC.ItemWidthStack.Size >= temp_data->HostBackupItemWidthStackSize, "Too many PopItemWidth!"); - PopID(); - - // Restore window data that we modified - const ImVec2 backup_outer_max_pos = outer_window->DC.CursorMaxPos; - inner_window->WorkRect = temp_data->HostBackupWorkRect; - inner_window->ParentWorkRect = temp_data->HostBackupParentWorkRect; - inner_window->SkipItems = table->HostSkipItems; - outer_window->DC.CursorPos = table->OuterRect.Min; - outer_window->DC.ItemWidth = temp_data->HostBackupItemWidth; - outer_window->DC.ItemWidthStack.Size = temp_data->HostBackupItemWidthStackSize; - outer_window->DC.ColumnsOffset = temp_data->HostBackupColumnsOffset; - - // Layout in outer window - // (FIXME: To allow auto-fit and allow desirable effect of SameLine() we dissociate 'used' vs 'ideal' size by overriding - // CursorPosPrevLine and CursorMaxPos manually. That should be a more general layout feature, see same problem e.g. #3414) - if (inner_window != outer_window) - { - EndChild(); - } - else - { - ItemSize(table->OuterRect.GetSize()); - ItemAdd(table->OuterRect, 0); - } - - // Override declared contents width/height to enable auto-resize while not needlessly adding a scrollbar - if (table->Flags & ImGuiTableFlags_NoHostExtendX) - { - // FIXME-TABLE: Could we remove this section? - // ColumnsAutoFitWidth may be one frame ahead here since for Fixed+NoResize is calculated from latest contents - IM_ASSERT((table->Flags & ImGuiTableFlags_ScrollX) == 0); - outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth); - } - else if (temp_data->UserOuterSize.x <= 0.0f) - { - const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.x : 0.0f; - outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth + decoration_size - temp_data->UserOuterSize.x); - outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth)); - } - else - { - outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, table->OuterRect.Max.x); - } - if (temp_data->UserOuterSize.y <= 0.0f) - { - const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollY) ? inner_window->ScrollbarSizes.y : 0.0f; - outer_window->DC.IdealMaxPos.y = ImMax(outer_window->DC.IdealMaxPos.y, inner_content_max_y + decoration_size - temp_data->UserOuterSize.y); - outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, ImMin(table->OuterRect.Max.y, inner_content_max_y)); - } - else - { - // OuterRect.Max.y may already have been pushed downward from the initial value (unless ImGuiTableFlags_NoHostExtendY is set) - outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, table->OuterRect.Max.y); - } - - // Save settings - if (table->IsSettingsDirty) - TableSaveSettings(table); - table->IsInitializing = false; - - // Clear or restore current table, if any - IM_ASSERT(g.CurrentWindow == outer_window && g.CurrentTable == table); - IM_ASSERT(g.TablesTempDataStacked > 0); - temp_data = (--g.TablesTempDataStacked > 0) ? &g.TablesTempData[g.TablesTempDataStacked - 1] : NULL; - g.CurrentTable = temp_data ? g.Tables.GetByIndex(temp_data->TableIndex) : NULL; - if (g.CurrentTable) - { - g.CurrentTable->TempData = temp_data; - g.CurrentTable->DrawSplitter = &temp_data->DrawSplitter; - } - outer_window->DC.CurrentTableIdx = g.CurrentTable ? g.Tables.GetIndex(g.CurrentTable) : -1; -} - -// See "COLUMN SIZING POLICIES" comments at the top of this file -// If (init_width_or_weight <= 0.0f) it is ignored -void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, float init_width_or_weight, ImGuiID user_id) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!"); - IM_ASSERT(table->IsLayoutLocked == false && "Need to call call TableSetupColumn() before first row!"); - IM_ASSERT((flags & ImGuiTableColumnFlags_StatusMask_) == 0 && "Illegal to pass StatusMask values to TableSetupColumn()"); - if (table->DeclColumnsCount >= table->ColumnsCount) - { - IM_ASSERT_USER_ERROR(table->DeclColumnsCount < table->ColumnsCount, "Called TableSetupColumn() too many times!"); - return; - } - - ImGuiTableColumn* column = &table->Columns[table->DeclColumnsCount]; - table->DeclColumnsCount++; - - // Assert when passing a width or weight if policy is entirely left to default, to avoid storing width into weight and vice-versa. - // Give a grace to users of ImGuiTableFlags_ScrollX. - if (table->IsDefaultSizingPolicy && (flags & ImGuiTableColumnFlags_WidthMask_) == 0 && (flags & ImGuiTableFlags_ScrollX) == 0) - IM_ASSERT(init_width_or_weight <= 0.0f && "Can only specify width/weight if sizing policy is set explicitly in either Table or Column."); - - // When passing a width automatically enforce WidthFixed policy - // (whereas TableSetupColumnFlags would default to WidthAuto if table is not Resizable) - if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0 && init_width_or_weight > 0.0f) - if ((table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedFit || (table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) - flags |= ImGuiTableColumnFlags_WidthFixed; - - TableSetupColumnFlags(table, column, flags); - column->UserID = user_id; - flags = column->Flags; - - // Initialize defaults - column->InitStretchWeightOrWidth = init_width_or_weight; - if (table->IsInitializing) - { - // Init width or weight - if (column->WidthRequest < 0.0f && column->StretchWeight < 0.0f) - { - if ((flags & ImGuiTableColumnFlags_WidthFixed) && init_width_or_weight > 0.0f) - column->WidthRequest = init_width_or_weight; - if (flags & ImGuiTableColumnFlags_WidthStretch) - column->StretchWeight = (init_width_or_weight > 0.0f) ? init_width_or_weight : -1.0f; - - // Disable auto-fit if an explicit width/weight has been specified - if (init_width_or_weight > 0.0f) - column->AutoFitQueue = 0x00; - } - - // Init default visibility/sort state - if ((flags & ImGuiTableColumnFlags_DefaultHide) && (table->SettingsLoadedFlags & ImGuiTableFlags_Hideable) == 0) - column->IsUserEnabled = column->IsUserEnabledNextFrame = false; - if (flags & ImGuiTableColumnFlags_DefaultSort && (table->SettingsLoadedFlags & ImGuiTableFlags_Sortable) == 0) - { - column->SortOrder = 0; // Multiple columns using _DefaultSort will be reassigned unique SortOrder values when building the sort specs. - column->SortDirection = (column->Flags & ImGuiTableColumnFlags_PreferSortDescending) ? (ImS8)ImGuiSortDirection_Descending : (ImU8)(ImGuiSortDirection_Ascending); - } - } - - // Store name (append with zero-terminator in contiguous buffer) - column->NameOffset = -1; - if (label != NULL && label[0] != 0) - { - column->NameOffset = (ImS16)table->ColumnsNames.size(); - table->ColumnsNames.append(label, label + strlen(label) + 1); - } -} - -// [Public] -void ImGui::TableSetupScrollFreeze(int columns, int rows) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!"); - IM_ASSERT(table->IsLayoutLocked == false && "Need to call TableSetupColumn() before first row!"); - IM_ASSERT(columns >= 0 && columns < IMGUI_TABLE_MAX_COLUMNS); - IM_ASSERT(rows >= 0 && rows < 128); // Arbitrary limit - - table->FreezeColumnsRequest = (table->Flags & ImGuiTableFlags_ScrollX) ? (ImGuiTableColumnIdx)ImMin(columns, table->ColumnsCount) : 0; - table->FreezeColumnsCount = (table->InnerWindow->Scroll.x != 0.0f) ? table->FreezeColumnsRequest : 0; - table->FreezeRowsRequest = (table->Flags & ImGuiTableFlags_ScrollY) ? (ImGuiTableColumnIdx)rows : 0; - table->FreezeRowsCount = (table->InnerWindow->Scroll.y != 0.0f) ? table->FreezeRowsRequest : 0; - table->IsUnfrozenRows = (table->FreezeRowsCount == 0); // Make sure this is set before TableUpdateLayout() so ImGuiListClipper can benefit from it.b - - // Ensure frozen columns are ordered in their section. We still allow multiple frozen columns to be reordered. - // FIXME-TABLE: This work for preserving 2143 into 21|43. How about 4321 turning into 21|43? (preserve relative order in each section) - for (int column_n = 0; column_n < table->FreezeColumnsRequest; column_n++) - { - int order_n = table->DisplayOrderToIndex[column_n]; - if (order_n != column_n && order_n >= table->FreezeColumnsRequest) - { - ImSwap(table->Columns[table->DisplayOrderToIndex[order_n]].DisplayOrder, table->Columns[table->DisplayOrderToIndex[column_n]].DisplayOrder); - ImSwap(table->DisplayOrderToIndex[order_n], table->DisplayOrderToIndex[column_n]); - } - } -} - -//----------------------------------------------------------------------------- -// [SECTION] Tables: Simple accessors -//----------------------------------------------------------------------------- -// - TableGetColumnCount() -// - TableGetColumnName() -// - TableGetColumnName() [Internal] -// - TableSetColumnEnabled() -// - TableGetColumnFlags() -// - TableGetCellBgRect() [Internal] -// - TableGetColumnResizeID() [Internal] -// - TableGetHoveredColumn() [Internal] -// - TableSetBgColor() -//----------------------------------------------------------------------------- - -int ImGui::TableGetColumnCount() -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - return table ? table->ColumnsCount : 0; -} - -const char* ImGui::TableGetColumnName(int column_n) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - if (!table) - return NULL; - if (column_n < 0) - column_n = table->CurrentColumn; - return TableGetColumnName(table, column_n); -} - -const char* ImGui::TableGetColumnName(const ImGuiTable* table, int column_n) -{ - if (table->IsLayoutLocked == false && column_n >= table->DeclColumnsCount) - return ""; // NameOffset is invalid at this point - const ImGuiTableColumn* column = &table->Columns[column_n]; - if (column->NameOffset == -1) - return ""; - return &table->ColumnsNames.Buf[column->NameOffset]; -} - -// Change user accessible enabled/disabled state of a column (often perceived as "showing/hiding" from users point of view) -// Note that end-user can use the context menu to change this themselves (right-click in headers, or right-click in columns body with ImGuiTableFlags_ContextMenuInBody) -// - Require table to have the ImGuiTableFlags_Hideable flag because we are manipulating user accessible state. -// - Request will be applied during next layout, which happens on the first call to TableNextRow() after BeginTable(). -// - For the getter you can test (TableGetColumnFlags() & ImGuiTableColumnFlags_IsEnabled) != 0. -// - Alternative: the ImGuiTableColumnFlags_Disabled is an overriding/master disable flag which will also hide the column from context menu. -void ImGui::TableSetColumnEnabled(int column_n, bool enabled) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL); - if (!table) - return; - IM_ASSERT(table->Flags & ImGuiTableFlags_Hideable); // See comments above - if (column_n < 0) - column_n = table->CurrentColumn; - IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); - ImGuiTableColumn* column = &table->Columns[column_n]; - column->IsUserEnabledNextFrame = enabled; -} - -// We allow querying for an extra column in order to poll the IsHovered state of the right-most section -ImGuiTableColumnFlags ImGui::TableGetColumnFlags(int column_n) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - if (!table) - return ImGuiTableColumnFlags_None; - if (column_n < 0) - column_n = table->CurrentColumn; - if (column_n == table->ColumnsCount) - return (table->HoveredColumnBody == column_n) ? ImGuiTableColumnFlags_IsHovered : ImGuiTableColumnFlags_None; - return table->Columns[column_n].Flags; -} - -// Return the cell rectangle based on currently known height. -// - Important: we generally don't know our row height until the end of the row, so Max.y will be incorrect in many situations. -// The only case where this is correct is if we provided a min_row_height to TableNextRow() and don't go below it, or in TableEndRow() when we locked that height. -// - Important: if ImGuiTableFlags_PadOuterX is set but ImGuiTableFlags_PadInnerX is not set, the outer-most left and right -// columns report a small offset so their CellBgRect can extend up to the outer border. -// FIXME: But the rendering code in TableEndRow() nullifies that with clamping required for scrolling. -ImRect ImGui::TableGetCellBgRect(const ImGuiTable* table, int column_n) -{ - const ImGuiTableColumn* column = &table->Columns[column_n]; - float x1 = column->MinX; - float x2 = column->MaxX; - //if (column->PrevEnabledColumn == -1) - // x1 -= table->OuterPaddingX; - //if (column->NextEnabledColumn == -1) - // x2 += table->OuterPaddingX; - x1 = ImMax(x1, table->WorkRect.Min.x); - x2 = ImMin(x2, table->WorkRect.Max.x); - return ImRect(x1, table->RowPosY1, x2, table->RowPosY2); -} - -// Return the resizing ID for the right-side of the given column. -ImGuiID ImGui::TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no) -{ - IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); - ImGuiID id = table->ID + 1 + (instance_no * table->ColumnsCount) + column_n; - return id; -} - -// Return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. -int ImGui::TableGetHoveredColumn() -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - if (!table) - return -1; - return (int)table->HoveredColumnBody; -} - -void ImGui::TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(target != ImGuiTableBgTarget_None); - - if (color == IM_COL32_DISABLE) - color = 0; - - // We cannot draw neither the cell or row background immediately as we don't know the row height at this point in time. - switch (target) - { - case ImGuiTableBgTarget_CellBg: - { - if (table->RowPosY1 > table->InnerClipRect.Max.y) // Discard - return; - if (column_n == -1) - column_n = table->CurrentColumn; - if ((table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0) - return; - if (table->RowCellDataCurrent < 0 || table->RowCellData[table->RowCellDataCurrent].Column != column_n) - table->RowCellDataCurrent++; - ImGuiTableCellData* cell_data = &table->RowCellData[table->RowCellDataCurrent]; - cell_data->BgColor = color; - cell_data->Column = (ImGuiTableColumnIdx)column_n; - break; - } - case ImGuiTableBgTarget_RowBg0: - case ImGuiTableBgTarget_RowBg1: - { - if (table->RowPosY1 > table->InnerClipRect.Max.y) // Discard - return; - IM_ASSERT(column_n == -1); - int bg_idx = (target == ImGuiTableBgTarget_RowBg1) ? 1 : 0; - table->RowBgColor[bg_idx] = color; - break; - } - default: - IM_ASSERT(0); - } -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Row changes -//------------------------------------------------------------------------- -// - TableGetRowIndex() -// - TableNextRow() -// - TableBeginRow() [Internal] -// - TableEndRow() [Internal] -//------------------------------------------------------------------------- - -// [Public] Note: for row coloring we use ->RowBgColorCounter which is the same value without counting header rows -int ImGui::TableGetRowIndex() -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - if (!table) - return 0; - return table->CurrentRow; -} - -// [Public] Starts into the first cell of a new row -void ImGui::TableNextRow(ImGuiTableRowFlags row_flags, float row_min_height) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - - if (!table->IsLayoutLocked) - TableUpdateLayout(table); - if (table->IsInsideRow) - TableEndRow(table); - - table->LastRowFlags = table->RowFlags; - table->RowFlags = row_flags; - table->RowMinHeight = row_min_height; - TableBeginRow(table); - - // We honor min_row_height requested by user, but cannot guarantee per-row maximum height, - // because that would essentially require a unique clipping rectangle per-cell. - table->RowPosY2 += table->CellPaddingY * 2.0f; - table->RowPosY2 = ImMax(table->RowPosY2, table->RowPosY1 + row_min_height); - - // Disable output until user calls TableNextColumn() - table->InnerWindow->SkipItems = true; -} - -// [Internal] Called by TableNextRow() -void ImGui::TableBeginRow(ImGuiTable* table) -{ - ImGuiWindow* window = table->InnerWindow; - IM_ASSERT(!table->IsInsideRow); - - // New row - table->CurrentRow++; - table->CurrentColumn = -1; - table->RowBgColor[0] = table->RowBgColor[1] = IM_COL32_DISABLE; - table->RowCellDataCurrent = -1; - table->IsInsideRow = true; - - // Begin frozen rows - float next_y1 = table->RowPosY2; - if (table->CurrentRow == 0 && table->FreezeRowsCount > 0) - next_y1 = window->DC.CursorPos.y = table->OuterRect.Min.y; - - table->RowPosY1 = table->RowPosY2 = next_y1; - table->RowTextBaseline = 0.0f; - table->RowIndentOffsetX = window->DC.Indent.x - table->HostIndentX; // Lock indent - window->DC.PrevLineTextBaseOffset = 0.0f; - window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); - window->DC.IsSameLine = false; - window->DC.CursorMaxPos.y = next_y1; - - // Making the header BG color non-transparent will allow us to overlay it multiple times when handling smooth dragging. - if (table->RowFlags & ImGuiTableRowFlags_Headers) - { - TableSetBgColor(ImGuiTableBgTarget_RowBg0, GetColorU32(ImGuiCol_TableHeaderBg)); - if (table->CurrentRow == 0) - table->IsUsingHeaders = true; - } -} - -// [Internal] Called by TableNextRow() -void ImGui::TableEndRow(ImGuiTable* table) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(window == table->InnerWindow); - IM_ASSERT(table->IsInsideRow); - - if (table->CurrentColumn != -1) - TableEndCell(table); - - // Logging - if (g.LogEnabled) - LogRenderedText(NULL, "|"); - - // Position cursor at the bottom of our row so it can be used for e.g. clipping calculation. However it is - // likely that the next call to TableBeginCell() will reposition the cursor to take account of vertical padding. - window->DC.CursorPos.y = table->RowPosY2; - - // Row background fill - const float bg_y1 = table->RowPosY1; - const float bg_y2 = table->RowPosY2; - const bool unfreeze_rows_actual = (table->CurrentRow + 1 == table->FreezeRowsCount); - const bool unfreeze_rows_request = (table->CurrentRow + 1 == table->FreezeRowsRequest); - if (table->CurrentRow == 0) - TableGetInstanceData(table, table->InstanceCurrent)->LastFirstRowHeight = bg_y2 - bg_y1; - - const bool is_visible = (bg_y2 >= table->InnerClipRect.Min.y && bg_y1 <= table->InnerClipRect.Max.y); - if (is_visible) - { - // Decide of background color for the row - ImU32 bg_col0 = 0; - ImU32 bg_col1 = 0; - if (table->RowBgColor[0] != IM_COL32_DISABLE) - bg_col0 = table->RowBgColor[0]; - else if (table->Flags & ImGuiTableFlags_RowBg) - bg_col0 = GetColorU32((table->RowBgColorCounter & 1) ? ImGuiCol_TableRowBgAlt : ImGuiCol_TableRowBg); - if (table->RowBgColor[1] != IM_COL32_DISABLE) - bg_col1 = table->RowBgColor[1]; - - // Decide of top border color - ImU32 border_col = 0; - const float border_size = TABLE_BORDER_SIZE; - if (table->CurrentRow > 0 || table->InnerWindow == table->OuterWindow) - if (table->Flags & ImGuiTableFlags_BordersInnerH) - border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight; - - const bool draw_cell_bg_color = table->RowCellDataCurrent >= 0; - const bool draw_strong_bottom_border = unfreeze_rows_actual; - if ((bg_col0 | bg_col1 | border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color) - { - // In theory we could call SetWindowClipRectBeforeSetChannel() but since we know TableEndRow() is - // always followed by a change of clipping rectangle we perform the smallest overwrite possible here. - if ((table->Flags & ImGuiTableFlags_NoClip) == 0) - window->DrawList->_CmdHeader.ClipRect = table->Bg0ClipRectForDrawCmd.ToVec4(); - table->DrawSplitter->SetCurrentChannel(window->DrawList, TABLE_DRAW_CHANNEL_BG0); - } - - // Draw row background - // We soft/cpu clip this so all backgrounds and borders can share the same clipping rectangle - if (bg_col0 || bg_col1) - { - ImRect row_rect(table->WorkRect.Min.x, bg_y1, table->WorkRect.Max.x, bg_y2); - row_rect.ClipWith(table->BgClipRect); - if (bg_col0 != 0 && row_rect.Min.y < row_rect.Max.y) - window->DrawList->AddRectFilled(row_rect.Min, row_rect.Max, bg_col0); - if (bg_col1 != 0 && row_rect.Min.y < row_rect.Max.y) - window->DrawList->AddRectFilled(row_rect.Min, row_rect.Max, bg_col1); - } - - // Draw cell background color - if (draw_cell_bg_color) - { - ImGuiTableCellData* cell_data_end = &table->RowCellData[table->RowCellDataCurrent]; - for (ImGuiTableCellData* cell_data = &table->RowCellData[0]; cell_data <= cell_data_end; cell_data++) - { - // As we render the BG here we need to clip things (for layout we would not) - // FIXME: This cancels the OuterPadding addition done by TableGetCellBgRect(), need to keep it while rendering correctly while scrolling. - const ImGuiTableColumn* column = &table->Columns[cell_data->Column]; - ImRect cell_bg_rect = TableGetCellBgRect(table, cell_data->Column); - cell_bg_rect.ClipWith(table->BgClipRect); - cell_bg_rect.Min.x = ImMax(cell_bg_rect.Min.x, column->ClipRect.Min.x); // So that first column after frozen one gets clipped when scrolling - cell_bg_rect.Max.x = ImMin(cell_bg_rect.Max.x, column->MaxX); - window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor); - } - } - - // Draw top border - if (border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y) - window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), border_col, border_size); - - // Draw bottom border at the row unfreezing mark (always strong) - if (draw_strong_bottom_border && bg_y2 >= table->BgClipRect.Min.y && bg_y2 < table->BgClipRect.Max.y) - window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y2), ImVec2(table->BorderX2, bg_y2), table->BorderColorStrong, border_size); - } - - // End frozen rows (when we are past the last frozen row line, teleport cursor and alter clipping rectangle) - // We need to do that in TableEndRow() instead of TableBeginRow() so the list clipper can mark end of row and - // get the new cursor position. - if (unfreeze_rows_request) - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - column->NavLayerCurrent = (ImS8)((column_n < table->FreezeColumnsCount) ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main); - } - if (unfreeze_rows_actual) - { - IM_ASSERT(table->IsUnfrozenRows == false); - table->IsUnfrozenRows = true; - - // BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect - float y0 = ImMax(table->RowPosY2 + 1, window->InnerClipRect.Min.y); - table->BgClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y = ImMin(y0, window->InnerClipRect.Max.y); - table->BgClipRect.Max.y = table->Bg2ClipRectForDrawCmd.Max.y = window->InnerClipRect.Max.y; - table->Bg2DrawChannelCurrent = table->Bg2DrawChannelUnfrozen; - IM_ASSERT(table->Bg2ClipRectForDrawCmd.Min.y <= table->Bg2ClipRectForDrawCmd.Max.y); - - float row_height = table->RowPosY2 - table->RowPosY1; - table->RowPosY2 = window->DC.CursorPos.y = table->WorkRect.Min.y + table->RowPosY2 - table->OuterRect.Min.y; - table->RowPosY1 = table->RowPosY2 - row_height; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - column->DrawChannelCurrent = column->DrawChannelUnfrozen; - column->ClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y; - } - - // Update cliprect ahead of TableBeginCell() so clipper can access to new ClipRect->Min.y - SetWindowClipRectBeforeSetChannel(window, table->Columns[0].ClipRect); - table->DrawSplitter->SetCurrentChannel(window->DrawList, table->Columns[0].DrawChannelCurrent); - } - - if (!(table->RowFlags & ImGuiTableRowFlags_Headers)) - table->RowBgColorCounter++; - table->IsInsideRow = false; -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Columns changes -//------------------------------------------------------------------------- -// - TableGetColumnIndex() -// - TableSetColumnIndex() -// - TableNextColumn() -// - TableBeginCell() [Internal] -// - TableEndCell() [Internal] -//------------------------------------------------------------------------- - -int ImGui::TableGetColumnIndex() -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - if (!table) - return 0; - return table->CurrentColumn; -} - -// [Public] Append into a specific column -bool ImGui::TableSetColumnIndex(int column_n) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - if (!table) - return false; - - if (table->CurrentColumn != column_n) - { - if (table->CurrentColumn != -1) - TableEndCell(table); - IM_ASSERT(column_n >= 0 && table->ColumnsCount); - TableBeginCell(table, column_n); - } - - // Return whether the column is visible. User may choose to skip submitting items based on this return value, - // however they shouldn't skip submitting for columns that may have the tallest contribution to row height. - return (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)) != 0; -} - -// [Public] Append into the next column, wrap and create a new row when already on last column -bool ImGui::TableNextColumn() -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - if (!table) - return false; - - if (table->IsInsideRow && table->CurrentColumn + 1 < table->ColumnsCount) - { - if (table->CurrentColumn != -1) - TableEndCell(table); - TableBeginCell(table, table->CurrentColumn + 1); - } - else - { - TableNextRow(); - TableBeginCell(table, 0); - } - - // Return whether the column is visible. User may choose to skip submitting items based on this return value, - // however they shouldn't skip submitting for columns that may have the tallest contribution to row height. - int column_n = table->CurrentColumn; - return (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)) != 0; -} - - -// [Internal] Called by TableSetColumnIndex()/TableNextColumn() -// This is called very frequently, so we need to be mindful of unnecessary overhead. -// FIXME-TABLE FIXME-OPT: Could probably shortcut some things for non-active or clipped columns. -void ImGui::TableBeginCell(ImGuiTable* table, int column_n) -{ - ImGuiTableColumn* column = &table->Columns[column_n]; - ImGuiWindow* window = table->InnerWindow; - table->CurrentColumn = column_n; - - // Start position is roughly ~~ CellRect.Min + CellPadding + Indent - float start_x = column->WorkMinX; - if (column->Flags & ImGuiTableColumnFlags_IndentEnable) - start_x += table->RowIndentOffsetX; // ~~ += window.DC.Indent.x - table->HostIndentX, except we locked it for the row. - - window->DC.CursorPos.x = start_x; - window->DC.CursorPos.y = table->RowPosY1 + table->CellPaddingY; - window->DC.CursorMaxPos.x = window->DC.CursorPos.x; - window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT - window->DC.CurrLineTextBaseOffset = table->RowTextBaseline; - window->DC.NavLayerCurrent = (ImGuiNavLayer)column->NavLayerCurrent; - - window->WorkRect.Min.y = window->DC.CursorPos.y; - window->WorkRect.Min.x = column->WorkMinX; - window->WorkRect.Max.x = column->WorkMaxX; - window->DC.ItemWidth = column->ItemWidth; - - // To allow ImGuiListClipper to function we propagate our row height - if (!column->IsEnabled) - window->DC.CursorPos.y = ImMax(window->DC.CursorPos.y, table->RowPosY2); - - window->SkipItems = column->IsSkipItems; - if (column->IsSkipItems) - { - ImGuiContext& g = *GImGui; - g.LastItemData.ID = 0; - g.LastItemData.StatusFlags = 0; - } - - if (table->Flags & ImGuiTableFlags_NoClip) - { - // FIXME: if we end up drawing all borders/bg in EndTable, could remove this and just assert that channel hasn't changed. - table->DrawSplitter->SetCurrentChannel(window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP); - //IM_ASSERT(table->DrawSplitter._Current == TABLE_DRAW_CHANNEL_NOCLIP); - } - else - { - // FIXME-TABLE: Could avoid this if draw channel is dummy channel? - SetWindowClipRectBeforeSetChannel(window, column->ClipRect); - table->DrawSplitter->SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); - } - - // Logging - ImGuiContext& g = *GImGui; - if (g.LogEnabled && !column->IsSkipItems) - { - LogRenderedText(&window->DC.CursorPos, "|"); - g.LogLinePosY = FLT_MAX; - } -} - -// [Internal] Called by TableNextRow()/TableSetColumnIndex()/TableNextColumn() -void ImGui::TableEndCell(ImGuiTable* table) -{ - ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; - ImGuiWindow* window = table->InnerWindow; - - // Report maximum position so we can infer content size per column. - float* p_max_pos_x; - if (table->RowFlags & ImGuiTableRowFlags_Headers) - p_max_pos_x = &column->ContentMaxXHeadersUsed; // Useful in case user submit contents in header row that is not a TableHeader() call - else - p_max_pos_x = table->IsUnfrozenRows ? &column->ContentMaxXUnfrozen : &column->ContentMaxXFrozen; - *p_max_pos_x = ImMax(*p_max_pos_x, window->DC.CursorMaxPos.x); - table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->CellPaddingY); - column->ItemWidth = window->DC.ItemWidth; - - // Propagate text baseline for the entire row - // FIXME-TABLE: Here we propagate text baseline from the last line of the cell.. instead of the first one. - table->RowTextBaseline = ImMax(table->RowTextBaseline, window->DC.PrevLineTextBaseOffset); -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Columns width management -//------------------------------------------------------------------------- -// - TableGetMaxColumnWidth() [Internal] -// - TableGetColumnWidthAuto() [Internal] -// - TableSetColumnWidth() -// - TableSetColumnWidthAutoSingle() [Internal] -// - TableSetColumnWidthAutoAll() [Internal] -// - TableUpdateColumnsWeightFromWidth() [Internal] -//------------------------------------------------------------------------- - -// Maximum column content width given current layout. Use column->MinX so this value on a per-column basis. -float ImGui::TableGetMaxColumnWidth(const ImGuiTable* table, int column_n) -{ - const ImGuiTableColumn* column = &table->Columns[column_n]; - float max_width = FLT_MAX; - const float min_column_distance = table->MinColumnWidth + table->CellPaddingX * 2.0f + table->CellSpacingX1 + table->CellSpacingX2; - if (table->Flags & ImGuiTableFlags_ScrollX) - { - // Frozen columns can't reach beyond visible width else scrolling will naturally break. - // (we use DisplayOrder as within a set of multiple frozen column reordering is possible) - if (column->DisplayOrder < table->FreezeColumnsRequest) - { - max_width = (table->InnerClipRect.Max.x - (table->FreezeColumnsRequest - column->DisplayOrder) * min_column_distance) - column->MinX; - max_width = max_width - table->OuterPaddingX - table->CellPaddingX - table->CellSpacingX2; - } - } - else if ((table->Flags & ImGuiTableFlags_NoKeepColumnsVisible) == 0) - { - // If horizontal scrolling if disabled, we apply a final lossless shrinking of columns in order to make - // sure they are all visible. Because of this we also know that all of the columns will always fit in - // table->WorkRect and therefore in table->InnerRect (because ScrollX is off) - // FIXME-TABLE: This is solved incorrectly but also quite a difficult problem to fix as we also want ClipRect width to match. - // See "table_width_distrib" and "table_width_keep_visible" tests - max_width = table->WorkRect.Max.x - (table->ColumnsEnabledCount - column->IndexWithinEnabledSet - 1) * min_column_distance - column->MinX; - //max_width -= table->CellSpacingX1; - max_width -= table->CellSpacingX2; - max_width -= table->CellPaddingX * 2.0f; - max_width -= table->OuterPaddingX; - } - return max_width; -} - -// Note this is meant to be stored in column->WidthAuto, please generally use the WidthAuto field -float ImGui::TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column) -{ - const float content_width_body = ImMax(column->ContentMaxXFrozen, column->ContentMaxXUnfrozen) - column->WorkMinX; - const float content_width_headers = column->ContentMaxXHeadersIdeal - column->WorkMinX; - float width_auto = content_width_body; - if (!(column->Flags & ImGuiTableColumnFlags_NoHeaderWidth)) - width_auto = ImMax(width_auto, content_width_headers); - - // Non-resizable fixed columns preserve their requested width - if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && column->InitStretchWeightOrWidth > 0.0f) - if (!(table->Flags & ImGuiTableFlags_Resizable) || (column->Flags & ImGuiTableColumnFlags_NoResize)) - width_auto = column->InitStretchWeightOrWidth; - - return ImMax(width_auto, table->MinColumnWidth); -} - -// 'width' = inner column width, without padding -void ImGui::TableSetColumnWidth(int column_n, float width) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL && table->IsLayoutLocked == false); - IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); - ImGuiTableColumn* column_0 = &table->Columns[column_n]; - float column_0_width = width; - - // Apply constraints early - // Compare both requested and actual given width to avoid overwriting requested width when column is stuck (minimum size, bounded) - IM_ASSERT(table->MinColumnWidth > 0.0f); - const float min_width = table->MinColumnWidth; - const float max_width = ImMax(min_width, TableGetMaxColumnWidth(table, column_n)); - column_0_width = ImClamp(column_0_width, min_width, max_width); - if (column_0->WidthGiven == column_0_width || column_0->WidthRequest == column_0_width) - return; - - //IMGUI_DEBUG_PRINT("TableSetColumnWidth(%d, %.1f->%.1f)\n", column_0_idx, column_0->WidthGiven, column_0_width); - ImGuiTableColumn* column_1 = (column_0->NextEnabledColumn != -1) ? &table->Columns[column_0->NextEnabledColumn] : NULL; - - // In this surprisingly not simple because of how we support mixing Fixed and multiple Stretch columns. - // - All fixed: easy. - // - All stretch: easy. - // - One or more fixed + one stretch: easy. - // - One or more fixed + more than one stretch: tricky. - // Qt when manual resize is enabled only support a single _trailing_ stretch column. - - // When forwarding resize from Wn| to Fn+1| we need to be considerate of the _NoResize flag on Fn+1. - // FIXME-TABLE: Find a way to rewrite all of this so interactions feel more consistent for the user. - // Scenarios: - // - F1 F2 F3 resize from F1| or F2| --> ok: alter ->WidthRequested of Fixed column. Subsequent columns will be offset. - // - F1 F2 F3 resize from F3| --> ok: alter ->WidthRequested of Fixed column. If active, ScrollX extent can be altered. - // - F1 F2 W3 resize from F1| or F2| --> ok: alter ->WidthRequested of Fixed column. If active, ScrollX extent can be altered, but it doesn't make much sense as the Stretch column will always be minimal size. - // - F1 F2 W3 resize from W3| --> ok: no-op (disabled by Resize Rule 1) - // - W1 W2 W3 resize from W1| or W2| --> ok - // - W1 W2 W3 resize from W3| --> ok: no-op (disabled by Resize Rule 1) - // - W1 F2 F3 resize from F3| --> ok: no-op (disabled by Resize Rule 1) - // - W1 F2 resize from F2| --> ok: no-op (disabled by Resize Rule 1) - // - W1 W2 F3 resize from W1| or W2| --> ok - // - W1 F2 W3 resize from W1| or F2| --> ok - // - F1 W2 F3 resize from W2| --> ok - // - F1 W3 F2 resize from W3| --> ok - // - W1 F2 F3 resize from W1| --> ok: equivalent to resizing |F2. F3 will not move. - // - W1 F2 F3 resize from F2| --> ok - // All resizes from a Wx columns are locking other columns. - - // Possible improvements: - // - W1 W2 W3 resize W1| --> to not be stuck, both W2 and W3 would stretch down. Seems possible to fix. Would be most beneficial to simplify resize of all-weighted columns. - // - W3 F1 F2 resize W3| --> to not be stuck past F1|, both F1 and F2 would need to stretch down, which would be lossy or ambiguous. Seems hard to fix. - - // [Resize Rule 1] Can't resize from right of right-most visible column if there is any Stretch column. Implemented in TableUpdateLayout(). - - // If we have all Fixed columns OR resizing a Fixed column that doesn't come after a Stretch one, we can do an offsetting resize. - // This is the preferred resize path - if (column_0->Flags & ImGuiTableColumnFlags_WidthFixed) - if (!column_1 || table->LeftMostStretchedColumn == -1 || table->Columns[table->LeftMostStretchedColumn].DisplayOrder >= column_0->DisplayOrder) - { - column_0->WidthRequest = column_0_width; - table->IsSettingsDirty = true; - return; - } - - // We can also use previous column if there's no next one (this is used when doing an auto-fit on the right-most stretch column) - if (column_1 == NULL) - column_1 = (column_0->PrevEnabledColumn != -1) ? &table->Columns[column_0->PrevEnabledColumn] : NULL; - if (column_1 == NULL) - return; - - // Resizing from right-side of a Stretch column before a Fixed column forward sizing to left-side of fixed column. - // (old_a + old_b == new_a + new_b) --> (new_a == old_a + old_b - new_b) - float column_1_width = ImMax(column_1->WidthRequest - (column_0_width - column_0->WidthRequest), min_width); - column_0_width = column_0->WidthRequest + column_1->WidthRequest - column_1_width; - IM_ASSERT(column_0_width > 0.0f && column_1_width > 0.0f); - column_0->WidthRequest = column_0_width; - column_1->WidthRequest = column_1_width; - if ((column_0->Flags | column_1->Flags) & ImGuiTableColumnFlags_WidthStretch) - TableUpdateColumnsWeightFromWidth(table); - table->IsSettingsDirty = true; -} - -// Disable clipping then auto-fit, will take 2 frames -// (we don't take a shortcut for unclipped columns to reduce inconsistencies when e.g. resizing multiple columns) -void ImGui::TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n) -{ - // Single auto width uses auto-fit - ImGuiTableColumn* column = &table->Columns[column_n]; - if (!column->IsEnabled) - return; - column->CannotSkipItemsQueue = (1 << 0); - table->AutoFitSingleColumn = (ImGuiTableColumnIdx)column_n; -} - -void ImGui::TableSetColumnWidthAutoAll(ImGuiTable* table) -{ - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - if (!column->IsEnabled && !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) // Cannot reset weight of hidden stretch column - continue; - column->CannotSkipItemsQueue = (1 << 0); - column->AutoFitQueue = (1 << 1); - } -} - -void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table) -{ - IM_ASSERT(table->LeftMostStretchedColumn != -1 && table->RightMostStretchedColumn != -1); - - // Measure existing quantity - float visible_weight = 0.0f; - float visible_width = 0.0f; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - if (!column->IsEnabled || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) - continue; - IM_ASSERT(column->StretchWeight > 0.0f); - visible_weight += column->StretchWeight; - visible_width += column->WidthRequest; - } - IM_ASSERT(visible_weight > 0.0f && visible_width > 0.0f); - - // Apply new weights - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - if (!column->IsEnabled || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) - continue; - column->StretchWeight = (column->WidthRequest / visible_width) * visible_weight; - IM_ASSERT(column->StretchWeight > 0.0f); - } -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Drawing -//------------------------------------------------------------------------- -// - TablePushBackgroundChannel() [Internal] -// - TablePopBackgroundChannel() [Internal] -// - TableSetupDrawChannels() [Internal] -// - TableMergeDrawChannels() [Internal] -// - TableDrawBorders() [Internal] -//------------------------------------------------------------------------- - -// Bg2 is used by Selectable (and possibly other widgets) to render to the background. -// Unlike our Bg0/1 channel which we uses for RowBg/CellBg/Borders and where we guarantee all shapes to be CPU-clipped, the Bg2 channel being widgets-facing will rely on regular ClipRect. -void ImGui::TablePushBackgroundChannel() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiTable* table = g.CurrentTable; - - // Optimization: avoid SetCurrentChannel() + PushClipRect() - table->HostBackupInnerClipRect = window->ClipRect; - SetWindowClipRectBeforeSetChannel(window, table->Bg2ClipRectForDrawCmd); - table->DrawSplitter->SetCurrentChannel(window->DrawList, table->Bg2DrawChannelCurrent); -} - -void ImGui::TablePopBackgroundChannel() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiTable* table = g.CurrentTable; - ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; - - // Optimization: avoid PopClipRect() + SetCurrentChannel() - SetWindowClipRectBeforeSetChannel(window, table->HostBackupInnerClipRect); - table->DrawSplitter->SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); -} - -// Allocate draw channels. Called by TableUpdateLayout() -// - We allocate them following storage order instead of display order so reordering columns won't needlessly -// increase overall dormant memory cost. -// - We isolate headers draw commands in their own channels instead of just altering clip rects. -// This is in order to facilitate merging of draw commands. -// - After crossing FreezeRowsCount, all columns see their current draw channel changed to a second set of channels. -// - We only use the dummy draw channel so we can push a null clipping rectangle into it without affecting other -// channels, while simplifying per-row/per-cell overhead. It will be empty and discarded when merged. -// - We allocate 1 or 2 background draw channels. This is because we know TablePushBackgroundChannel() is only used for -// horizontal spanning. If we allowed vertical spanning we'd need one background draw channel per merge group (1-4). -// Draw channel allocation (before merging): -// - NoClip --> 2+D+1 channels: bg0/1 + bg2 + foreground (same clip rect == always 1 draw call) -// - Clip --> 2+D+N channels -// - FreezeRows --> 2+D+N*2 (unless scrolling value is zero) -// - FreezeRows || FreezeColunns --> 3+D+N*2 (unless scrolling value is zero) -// Where D is 1 if any column is clipped or hidden (dummy channel) otherwise 0. -void ImGui::TableSetupDrawChannels(ImGuiTable* table) -{ - const int freeze_row_multiplier = (table->FreezeRowsCount > 0) ? 2 : 1; - const int channels_for_row = (table->Flags & ImGuiTableFlags_NoClip) ? 1 : table->ColumnsEnabledCount; - const int channels_for_bg = 1 + 1 * freeze_row_multiplier; - const int channels_for_dummy = (table->ColumnsEnabledCount < table->ColumnsCount || table->VisibleMaskByIndex != table->EnabledMaskByIndex) ? +1 : 0; - const int channels_total = channels_for_bg + (channels_for_row * freeze_row_multiplier) + channels_for_dummy; - table->DrawSplitter->Split(table->InnerWindow->DrawList, channels_total); - table->DummyDrawChannel = (ImGuiTableDrawChannelIdx)((channels_for_dummy > 0) ? channels_total - 1 : -1); - table->Bg2DrawChannelCurrent = TABLE_DRAW_CHANNEL_BG2_FROZEN; - table->Bg2DrawChannelUnfrozen = (ImGuiTableDrawChannelIdx)((table->FreezeRowsCount > 0) ? 2 + channels_for_row : TABLE_DRAW_CHANNEL_BG2_FROZEN); - - int draw_channel_current = 2; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - if (column->IsVisibleX && column->IsVisibleY) - { - column->DrawChannelFrozen = (ImGuiTableDrawChannelIdx)(draw_channel_current); - column->DrawChannelUnfrozen = (ImGuiTableDrawChannelIdx)(draw_channel_current + (table->FreezeRowsCount > 0 ? channels_for_row + 1 : 0)); - if (!(table->Flags & ImGuiTableFlags_NoClip)) - draw_channel_current++; - } - else - { - column->DrawChannelFrozen = column->DrawChannelUnfrozen = table->DummyDrawChannel; - } - column->DrawChannelCurrent = column->DrawChannelFrozen; - } - - // Initial draw cmd starts with a BgClipRect that matches the one of its host, to facilitate merge draw commands by default. - // All our cell highlight are manually clipped with BgClipRect. When unfreezing it will be made smaller to fit scrolling rect. - // (This technically isn't part of setting up draw channels, but is reasonably related to be done here) - table->BgClipRect = table->InnerClipRect; - table->Bg0ClipRectForDrawCmd = table->OuterWindow->ClipRect; - table->Bg2ClipRectForDrawCmd = table->HostClipRect; - IM_ASSERT(table->BgClipRect.Min.y <= table->BgClipRect.Max.y); -} - -// This function reorder draw channels based on matching clip rectangle, to facilitate merging them. Called by EndTable(). -// For simplicity we call it TableMergeDrawChannels() but in fact it only reorder channels + overwrite ClipRect, -// actual merging is done by table->DrawSplitter.Merge() which is called right after TableMergeDrawChannels(). -// -// Columns where the contents didn't stray off their local clip rectangle can be merged. To achieve -// this we merge their clip rect and make them contiguous in the channel list, so they can be merged -// by the call to DrawSplitter.Merge() following to the call to this function. -// We reorder draw commands by arranging them into a maximum of 4 distinct groups: -// -// 1 group: 2 groups: 2 groups: 4 groups: -// [ 0. ] no freeze [ 0. ] row freeze [ 01 ] col freeze [ 01 ] row+col freeze -// [ .. ] or no scroll [ 2. ] and v-scroll [ .. ] and h-scroll [ 23 ] and v+h-scroll -// -// Each column itself can use 1 channel (row freeze disabled) or 2 channels (row freeze enabled). -// When the contents of a column didn't stray off its limit, we move its channels into the corresponding group -// based on its position (within frozen rows/columns groups or not). -// At the end of the operation our 1-4 groups will each have a ImDrawCmd using the same ClipRect. -// This function assume that each column are pointing to a distinct draw channel, -// otherwise merge_group->ChannelsCount will not match set bit count of merge_group->ChannelsMask. -// -// Column channels will not be merged into one of the 1-4 groups in the following cases: -// - The contents stray off its clipping rectangle (we only compare the MaxX value, not the MinX value). -// Direct ImDrawList calls won't be taken into account by default, if you use them make sure the ImGui:: bounds -// matches, by e.g. calling SetCursorScreenPos(). -// - The channel uses more than one draw command itself. We drop all our attempt at merging stuff here.. -// we could do better but it's going to be rare and probably not worth the hassle. -// Columns for which the draw channel(s) haven't been merged with other will use their own ImDrawCmd. -// -// This function is particularly tricky to understand.. take a breath. -void ImGui::TableMergeDrawChannels(ImGuiTable* table) -{ - ImGuiContext& g = *GImGui; - ImDrawListSplitter* splitter = table->DrawSplitter; - const bool has_freeze_v = (table->FreezeRowsCount > 0); - const bool has_freeze_h = (table->FreezeColumnsCount > 0); - IM_ASSERT(splitter->_Current == 0); - - // Track which groups we are going to attempt to merge, and which channels goes into each group. - struct MergeGroup - { - ImRect ClipRect; - int ChannelsCount; - ImBitArray ChannelsMask; - - MergeGroup() { ChannelsCount = 0; } - }; - int merge_group_mask = 0x00; - MergeGroup merge_groups[4]; - - // 1. Scan channels and take note of those which can be merged - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - if ((table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0) - continue; - ImGuiTableColumn* column = &table->Columns[column_n]; - - const int merge_group_sub_count = has_freeze_v ? 2 : 1; - for (int merge_group_sub_n = 0; merge_group_sub_n < merge_group_sub_count; merge_group_sub_n++) - { - const int channel_no = (merge_group_sub_n == 0) ? column->DrawChannelFrozen : column->DrawChannelUnfrozen; - - // Don't attempt to merge if there are multiple draw calls within the column - ImDrawChannel* src_channel = &splitter->_Channels[channel_no]; - if (src_channel->_CmdBuffer.Size > 0 && src_channel->_CmdBuffer.back().ElemCount == 0 && src_channel->_CmdBuffer.back().UserCallback == NULL) // Equivalent of PopUnusedDrawCmd() - src_channel->_CmdBuffer.pop_back(); - if (src_channel->_CmdBuffer.Size != 1) - continue; - - // Find out the width of this merge group and check if it will fit in our column - // (note that we assume that rendering didn't stray on the left direction. we should need a CursorMinPos to detect it) - if (!(column->Flags & ImGuiTableColumnFlags_NoClip)) - { - float content_max_x; - if (!has_freeze_v) - content_max_x = ImMax(column->ContentMaxXUnfrozen, column->ContentMaxXHeadersUsed); // No row freeze - else if (merge_group_sub_n == 0) - content_max_x = ImMax(column->ContentMaxXFrozen, column->ContentMaxXHeadersUsed); // Row freeze: use width before freeze - else - content_max_x = column->ContentMaxXUnfrozen; // Row freeze: use width after freeze - if (content_max_x > column->ClipRect.Max.x) - continue; - } - - const int merge_group_n = (has_freeze_h && column_n < table->FreezeColumnsCount ? 0 : 1) + (has_freeze_v && merge_group_sub_n == 0 ? 0 : 2); - IM_ASSERT(channel_no < IMGUI_TABLE_MAX_DRAW_CHANNELS); - MergeGroup* merge_group = &merge_groups[merge_group_n]; - if (merge_group->ChannelsCount == 0) - merge_group->ClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); - merge_group->ChannelsMask.SetBit(channel_no); - merge_group->ChannelsCount++; - merge_group->ClipRect.Add(src_channel->_CmdBuffer[0].ClipRect); - merge_group_mask |= (1 << merge_group_n); - } - - // Invalidate current draw channel - // (we don't clear DrawChannelFrozen/DrawChannelUnfrozen solely to facilitate debugging/later inspection of data) - column->DrawChannelCurrent = (ImGuiTableDrawChannelIdx)-1; - } - - // [DEBUG] Display merge groups -#if 0 - if (g.IO.KeyShift) - for (int merge_group_n = 0; merge_group_n < IM_ARRAYSIZE(merge_groups); merge_group_n++) - { - MergeGroup* merge_group = &merge_groups[merge_group_n]; - if (merge_group->ChannelsCount == 0) - continue; - char buf[32]; - ImFormatString(buf, 32, "MG%d:%d", merge_group_n, merge_group->ChannelsCount); - ImVec2 text_pos = merge_group->ClipRect.Min + ImVec2(4, 4); - ImVec2 text_size = CalcTextSize(buf, NULL); - GetForegroundDrawList()->AddRectFilled(text_pos, text_pos + text_size, IM_COL32(0, 0, 0, 255)); - GetForegroundDrawList()->AddText(text_pos, IM_COL32(255, 255, 0, 255), buf, NULL); - GetForegroundDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 255, 0, 255)); - } -#endif - - // 2. Rewrite channel list in our preferred order - if (merge_group_mask != 0) - { - // We skip channel 0 (Bg0/Bg1) and 1 (Bg2 frozen) from the shuffling since they won't move - see channels allocation in TableSetupDrawChannels(). - const int LEADING_DRAW_CHANNELS = 2; - g.DrawChannelsTempMergeBuffer.resize(splitter->_Count - LEADING_DRAW_CHANNELS); // Use shared temporary storage so the allocation gets amortized - ImDrawChannel* dst_tmp = g.DrawChannelsTempMergeBuffer.Data; - ImBitArray remaining_mask; // We need 132-bit of storage - remaining_mask.SetBitRange(LEADING_DRAW_CHANNELS, splitter->_Count); - remaining_mask.ClearBit(table->Bg2DrawChannelUnfrozen); - IM_ASSERT(has_freeze_v == false || table->Bg2DrawChannelUnfrozen != TABLE_DRAW_CHANNEL_BG2_FROZEN); - int remaining_count = splitter->_Count - (has_freeze_v ? LEADING_DRAW_CHANNELS + 1 : LEADING_DRAW_CHANNELS); - //ImRect host_rect = (table->InnerWindow == table->OuterWindow) ? table->InnerClipRect : table->HostClipRect; - ImRect host_rect = table->HostClipRect; - for (int merge_group_n = 0; merge_group_n < IM_ARRAYSIZE(merge_groups); merge_group_n++) - { - if (int merge_channels_count = merge_groups[merge_group_n].ChannelsCount) - { - MergeGroup* merge_group = &merge_groups[merge_group_n]; - ImRect merge_clip_rect = merge_group->ClipRect; - - // Extend outer-most clip limits to match those of host, so draw calls can be merged even if - // outer-most columns have some outer padding offsetting them from their parent ClipRect. - // The principal cases this is dealing with are: - // - On a same-window table (not scrolling = single group), all fitting columns ClipRect -> will extend and match host ClipRect -> will merge - // - Columns can use padding and have left-most ClipRect.Min.x and right-most ClipRect.Max.x != from host ClipRect -> will extend and match host ClipRect -> will merge - // FIXME-TABLE FIXME-WORKRECT: We are wasting a merge opportunity on tables without scrolling if column doesn't fit - // within host clip rect, solely because of the half-padding difference between window->WorkRect and window->InnerClipRect. - if ((merge_group_n & 1) == 0 || !has_freeze_h) - merge_clip_rect.Min.x = ImMin(merge_clip_rect.Min.x, host_rect.Min.x); - if ((merge_group_n & 2) == 0 || !has_freeze_v) - merge_clip_rect.Min.y = ImMin(merge_clip_rect.Min.y, host_rect.Min.y); - if ((merge_group_n & 1) != 0) - merge_clip_rect.Max.x = ImMax(merge_clip_rect.Max.x, host_rect.Max.x); - if ((merge_group_n & 2) != 0 && (table->Flags & ImGuiTableFlags_NoHostExtendY) == 0) - merge_clip_rect.Max.y = ImMax(merge_clip_rect.Max.y, host_rect.Max.y); -#if 0 - GetOverlayDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 0, 0, 200), 0.0f, 0, 1.0f); - GetOverlayDrawList()->AddLine(merge_group->ClipRect.Min, merge_clip_rect.Min, IM_COL32(255, 100, 0, 200)); - GetOverlayDrawList()->AddLine(merge_group->ClipRect.Max, merge_clip_rect.Max, IM_COL32(255, 100, 0, 200)); -#endif - remaining_count -= merge_group->ChannelsCount; - for (int n = 0; n < IM_ARRAYSIZE(remaining_mask.Storage); n++) - remaining_mask.Storage[n] &= ~merge_group->ChannelsMask.Storage[n]; - for (int n = 0; n < splitter->_Count && merge_channels_count != 0; n++) - { - // Copy + overwrite new clip rect - if (!merge_group->ChannelsMask.TestBit(n)) - continue; - merge_group->ChannelsMask.ClearBit(n); - merge_channels_count--; - - ImDrawChannel* channel = &splitter->_Channels[n]; - IM_ASSERT(channel->_CmdBuffer.Size == 1 && merge_clip_rect.Contains(ImRect(channel->_CmdBuffer[0].ClipRect))); - channel->_CmdBuffer[0].ClipRect = merge_clip_rect.ToVec4(); - memcpy(dst_tmp++, channel, sizeof(ImDrawChannel)); - } - } - - // Make sure Bg2DrawChannelUnfrozen appears in the middle of our groups (whereas Bg0/Bg1 and Bg2 frozen are fixed to 0 and 1) - if (merge_group_n == 1 && has_freeze_v) - memcpy(dst_tmp++, &splitter->_Channels[table->Bg2DrawChannelUnfrozen], sizeof(ImDrawChannel)); - } - - // Append unmergeable channels that we didn't reorder at the end of the list - for (int n = 0; n < splitter->_Count && remaining_count != 0; n++) - { - if (!remaining_mask.TestBit(n)) - continue; - ImDrawChannel* channel = &splitter->_Channels[n]; - memcpy(dst_tmp++, channel, sizeof(ImDrawChannel)); - remaining_count--; - } - IM_ASSERT(dst_tmp == g.DrawChannelsTempMergeBuffer.Data + g.DrawChannelsTempMergeBuffer.Size); - memcpy(splitter->_Channels.Data + LEADING_DRAW_CHANNELS, g.DrawChannelsTempMergeBuffer.Data, (splitter->_Count - LEADING_DRAW_CHANNELS) * sizeof(ImDrawChannel)); - } -} - -// FIXME-TABLE: This is a mess, need to redesign how we render borders (as some are also done in TableEndRow) -void ImGui::TableDrawBorders(ImGuiTable* table) -{ - ImGuiWindow* inner_window = table->InnerWindow; - if (!table->OuterWindow->ClipRect.Overlaps(table->OuterRect)) - return; - - ImDrawList* inner_drawlist = inner_window->DrawList; - table->DrawSplitter->SetCurrentChannel(inner_drawlist, TABLE_DRAW_CHANNEL_BG0); - inner_drawlist->PushClipRect(table->Bg0ClipRectForDrawCmd.Min, table->Bg0ClipRectForDrawCmd.Max, false); - - // Draw inner border and resizing feedback - ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); - const float border_size = TABLE_BORDER_SIZE; - const float draw_y1 = table->InnerRect.Min.y; - const float draw_y2_body = table->InnerRect.Max.y; - const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastFirstRowHeight) : draw_y1; - if (table->Flags & ImGuiTableFlags_BordersInnerV) - { - for (int order_n = 0; order_n < table->ColumnsCount; order_n++) - { - if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) - continue; - - const int column_n = table->DisplayOrderToIndex[order_n]; - ImGuiTableColumn* column = &table->Columns[column_n]; - const bool is_hovered = (table->HoveredColumnBorder == column_n); - const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent); - const bool is_resizable = (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) == 0; - const bool is_frozen_separator = (table->FreezeColumnsCount == order_n + 1); - if (column->MaxX > table->InnerClipRect.Max.x && !is_resized) - continue; - - // Decide whether right-most column is visible - if (column->NextEnabledColumn == -1 && !is_resizable) - if ((table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame || (table->Flags & ImGuiTableFlags_NoHostExtendX)) - continue; - if (column->MaxX <= column->ClipRect.Min.x) // FIXME-TABLE FIXME-STYLE: Assume BorderSize==1, this is problematic if we want to increase the border size.. - continue; - - // Draw in outer window so right-most column won't be clipped - // Always draw full height border when being resized/hovered, or on the delimitation of frozen column scrolling. - ImU32 col; - float draw_y2; - if (is_hovered || is_resized || is_frozen_separator) - { - draw_y2 = draw_y2_body; - col = is_resized ? GetColorU32(ImGuiCol_SeparatorActive) : is_hovered ? GetColorU32(ImGuiCol_SeparatorHovered) : table->BorderColorStrong; - } - else - { - draw_y2 = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? draw_y2_head : draw_y2_body; - col = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? table->BorderColorStrong : table->BorderColorLight; - } - - if (draw_y2 > draw_y1) - inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), col, border_size); - } - } - - // Draw outer border - // FIXME: could use AddRect or explicit VLine/HLine helper? - if (table->Flags & ImGuiTableFlags_BordersOuter) - { - // Display outer border offset by 1 which is a simple way to display it without adding an extra draw call - // (Without the offset, in outer_window it would be rendered behind cells, because child windows are above their - // parent. In inner_window, it won't reach out over scrollbars. Another weird solution would be to display part - // of it in inner window, and the part that's over scrollbars in the outer window..) - // Either solution currently won't allow us to use a larger border size: the border would clipped. - const ImRect outer_border = table->OuterRect; - const ImU32 outer_col = table->BorderColorStrong; - if ((table->Flags & ImGuiTableFlags_BordersOuter) == ImGuiTableFlags_BordersOuter) - { - inner_drawlist->AddRect(outer_border.Min, outer_border.Max, outer_col, 0.0f, 0, border_size); - } - else if (table->Flags & ImGuiTableFlags_BordersOuterV) - { - inner_drawlist->AddLine(outer_border.Min, ImVec2(outer_border.Min.x, outer_border.Max.y), outer_col, border_size); - inner_drawlist->AddLine(ImVec2(outer_border.Max.x, outer_border.Min.y), outer_border.Max, outer_col, border_size); - } - else if (table->Flags & ImGuiTableFlags_BordersOuterH) - { - inner_drawlist->AddLine(outer_border.Min, ImVec2(outer_border.Max.x, outer_border.Min.y), outer_col, border_size); - inner_drawlist->AddLine(ImVec2(outer_border.Min.x, outer_border.Max.y), outer_border.Max, outer_col, border_size); - } - } - if ((table->Flags & ImGuiTableFlags_BordersInnerH) && table->RowPosY2 < table->OuterRect.Max.y) - { - // Draw bottom-most row border - const float border_y = table->RowPosY2; - if (border_y >= table->BgClipRect.Min.y && border_y < table->BgClipRect.Max.y) - inner_drawlist->AddLine(ImVec2(table->BorderX1, border_y), ImVec2(table->BorderX2, border_y), table->BorderColorLight, border_size); - } - - inner_drawlist->PopClipRect(); -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Sorting -//------------------------------------------------------------------------- -// - TableGetSortSpecs() -// - TableFixColumnSortDirection() [Internal] -// - TableGetColumnNextSortDirection() [Internal] -// - TableSetColumnSortDirection() [Internal] -// - TableSortSpecsSanitize() [Internal] -// - TableSortSpecsBuild() [Internal] -//------------------------------------------------------------------------- - -// Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set) -// You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since -// last call, or the first time. -// Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()! -ImGuiTableSortSpecs* ImGui::TableGetSortSpecs() -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL); - - if (!(table->Flags & ImGuiTableFlags_Sortable)) - return NULL; - - // Require layout (in case TableHeadersRow() hasn't been called) as it may alter IsSortSpecsDirty in some paths. - if (!table->IsLayoutLocked) - TableUpdateLayout(table); - - TableSortSpecsBuild(table); - - return &table->SortSpecs; -} - -static inline ImGuiSortDirection TableGetColumnAvailSortDirection(ImGuiTableColumn* column, int n) -{ - IM_ASSERT(n < column->SortDirectionsAvailCount); - return (column->SortDirectionsAvailList >> (n << 1)) & 0x03; -} - -// Fix sort direction if currently set on a value which is unavailable (e.g. activating NoSortAscending/NoSortDescending) -void ImGui::TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column) -{ - if (column->SortOrder == -1 || (column->SortDirectionsAvailMask & (1 << column->SortDirection)) != 0) - return; - column->SortDirection = (ImU8)TableGetColumnAvailSortDirection(column, 0); - table->IsSortSpecsDirty = true; -} - -// Calculate next sort direction that would be set after clicking the column -// - If the PreferSortDescending flag is set, we will default to a Descending direction on the first click. -// - Note that the PreferSortAscending flag is never checked, it is essentially the default and therefore a no-op. -IM_STATIC_ASSERT(ImGuiSortDirection_None == 0 && ImGuiSortDirection_Ascending == 1 && ImGuiSortDirection_Descending == 2); -ImGuiSortDirection ImGui::TableGetColumnNextSortDirection(ImGuiTableColumn* column) -{ - IM_ASSERT(column->SortDirectionsAvailCount > 0); - if (column->SortOrder == -1) - return TableGetColumnAvailSortDirection(column, 0); - for (int n = 0; n < 3; n++) - if (column->SortDirection == TableGetColumnAvailSortDirection(column, n)) - return TableGetColumnAvailSortDirection(column, (n + 1) % column->SortDirectionsAvailCount); - IM_ASSERT(0); - return ImGuiSortDirection_None; -} - -// Note that the NoSortAscending/NoSortDescending flags are processed in TableSortSpecsSanitize(), and they may change/revert -// the value of SortDirection. We could technically also do it here but it would be unnecessary and duplicate code. -void ImGui::TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - - if (!(table->Flags & ImGuiTableFlags_SortMulti)) - append_to_sort_specs = false; - if (!(table->Flags & ImGuiTableFlags_SortTristate)) - IM_ASSERT(sort_direction != ImGuiSortDirection_None); - - ImGuiTableColumnIdx sort_order_max = 0; - if (append_to_sort_specs) - for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) - sort_order_max = ImMax(sort_order_max, table->Columns[other_column_n].SortOrder); - - ImGuiTableColumn* column = &table->Columns[column_n]; - column->SortDirection = (ImU8)sort_direction; - if (column->SortDirection == ImGuiSortDirection_None) - column->SortOrder = -1; - else if (column->SortOrder == -1 || !append_to_sort_specs) - column->SortOrder = append_to_sort_specs ? sort_order_max + 1 : 0; - - for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) - { - ImGuiTableColumn* other_column = &table->Columns[other_column_n]; - if (other_column != column && !append_to_sort_specs) - other_column->SortOrder = -1; - TableFixColumnSortDirection(table, other_column); - } - table->IsSettingsDirty = true; - table->IsSortSpecsDirty = true; -} - -void ImGui::TableSortSpecsSanitize(ImGuiTable* table) -{ - IM_ASSERT(table->Flags & ImGuiTableFlags_Sortable); - - // Clear SortOrder from hidden column and verify that there's no gap or duplicate. - int sort_order_count = 0; - ImU64 sort_order_mask = 0x00; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - if (column->SortOrder != -1 && !column->IsEnabled) - column->SortOrder = -1; - if (column->SortOrder == -1) - continue; - sort_order_count++; - sort_order_mask |= ((ImU64)1 << column->SortOrder); - IM_ASSERT(sort_order_count < (int)sizeof(sort_order_mask) * 8); - } - - const bool need_fix_linearize = ((ImU64)1 << sort_order_count) != (sort_order_mask + 1); - const bool need_fix_single_sort_order = (sort_order_count > 1) && !(table->Flags & ImGuiTableFlags_SortMulti); - if (need_fix_linearize || need_fix_single_sort_order) - { - ImU64 fixed_mask = 0x00; - for (int sort_n = 0; sort_n < sort_order_count; sort_n++) - { - // Fix: Rewrite sort order fields if needed so they have no gap or duplicate. - // (e.g. SortOrder 0 disappeared, SortOrder 1..2 exists --> rewrite then as SortOrder 0..1) - int column_with_smallest_sort_order = -1; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - if ((fixed_mask & ((ImU64)1 << (ImU64)column_n)) == 0 && table->Columns[column_n].SortOrder != -1) - if (column_with_smallest_sort_order == -1 || table->Columns[column_n].SortOrder < table->Columns[column_with_smallest_sort_order].SortOrder) - column_with_smallest_sort_order = column_n; - IM_ASSERT(column_with_smallest_sort_order != -1); - fixed_mask |= ((ImU64)1 << column_with_smallest_sort_order); - table->Columns[column_with_smallest_sort_order].SortOrder = (ImGuiTableColumnIdx)sort_n; - - // Fix: Make sure only one column has a SortOrder if ImGuiTableFlags_MultiSortable is not set. - if (need_fix_single_sort_order) - { - sort_order_count = 1; - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - if (column_n != column_with_smallest_sort_order) - table->Columns[column_n].SortOrder = -1; - break; - } - } - } - - // Fallback default sort order (if no column had the ImGuiTableColumnFlags_DefaultSort flag) - if (sort_order_count == 0 && !(table->Flags & ImGuiTableFlags_SortTristate)) - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - if (column->IsEnabled && !(column->Flags & ImGuiTableColumnFlags_NoSort)) - { - sort_order_count = 1; - column->SortOrder = 0; - column->SortDirection = (ImU8)TableGetColumnAvailSortDirection(column, 0); - break; - } - } - - table->SortSpecsCount = (ImGuiTableColumnIdx)sort_order_count; -} - -void ImGui::TableSortSpecsBuild(ImGuiTable* table) -{ - bool dirty = table->IsSortSpecsDirty; - if (dirty) - { - TableSortSpecsSanitize(table); - table->SortSpecsMulti.resize(table->SortSpecsCount <= 1 ? 0 : table->SortSpecsCount); - table->SortSpecs.SpecsDirty = true; // Mark as dirty for user - table->IsSortSpecsDirty = false; // Mark as not dirty for us - } - - // Write output - ImGuiTableColumnSortSpecs* sort_specs = (table->SortSpecsCount == 0) ? NULL : (table->SortSpecsCount == 1) ? &table->SortSpecsSingle : table->SortSpecsMulti.Data; - if (dirty && sort_specs != NULL) - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - { - ImGuiTableColumn* column = &table->Columns[column_n]; - if (column->SortOrder == -1) - continue; - IM_ASSERT(column->SortOrder < table->SortSpecsCount); - ImGuiTableColumnSortSpecs* sort_spec = &sort_specs[column->SortOrder]; - sort_spec->ColumnUserID = column->UserID; - sort_spec->ColumnIndex = (ImGuiTableColumnIdx)column_n; - sort_spec->SortOrder = (ImGuiTableColumnIdx)column->SortOrder; - sort_spec->SortDirection = column->SortDirection; - } - - table->SortSpecs.Specs = sort_specs; - table->SortSpecs.SpecsCount = table->SortSpecsCount; -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Headers -//------------------------------------------------------------------------- -// - TableGetHeaderRowHeight() [Internal] -// - TableHeadersRow() -// - TableHeader() -//------------------------------------------------------------------------- - -float ImGui::TableGetHeaderRowHeight() -{ - // Caring for a minor edge case: - // Calculate row height, for the unlikely case that some labels may be taller than others. - // If we didn't do that, uneven header height would highlight but smaller one before the tallest wouldn't catch input for all height. - // In your custom header row you may omit this all together and just call TableNextRow() without a height... - float row_height = GetTextLineHeight(); - int columns_count = TableGetColumnCount(); - for (int column_n = 0; column_n < columns_count; column_n++) - { - ImGuiTableColumnFlags flags = TableGetColumnFlags(column_n); - if ((flags & ImGuiTableColumnFlags_IsEnabled) && !(flags & ImGuiTableColumnFlags_NoHeaderLabel)) - row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y); - } - row_height += GetStyle().CellPadding.y * 2.0f; - return row_height; -} - -// [Public] This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn(). -// The intent is that advanced users willing to create customized headers would not need to use this helper -// and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets. -// See 'Demo->Tables->Custom headers' for a demonstration of implementing a custom version of this. -// This code is constructed to not make much use of internal functions, as it is intended to be a template to copy. -// FIXME-TABLE: TableOpenContextMenu() and TableGetHeaderRowHeight() are not public. -void ImGui::TableHeadersRow() -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL && "Need to call TableHeadersRow() after BeginTable()!"); - - // Layout if not already done (this is automatically done by TableNextRow, we do it here solely to facilitate stepping in debugger as it is frequent to step in TableUpdateLayout) - if (!table->IsLayoutLocked) - TableUpdateLayout(table); - - // Open row - const float row_y1 = GetCursorScreenPos().y; - const float row_height = TableGetHeaderRowHeight(); - TableNextRow(ImGuiTableRowFlags_Headers, row_height); - if (table->HostSkipItems) // Merely an optimization, you may skip in your own code. - return; - - const int columns_count = TableGetColumnCount(); - for (int column_n = 0; column_n < columns_count; column_n++) - { - if (!TableSetColumnIndex(column_n)) - continue; - - // Push an id to allow unnamed labels (generally accidental, but let's behave nicely with them) - // - in your own code you may omit the PushID/PopID all-together, provided you know they won't collide - // - table->InstanceCurrent is only >0 when we use multiple BeginTable/EndTable calls with same identifier. - const char* name = (TableGetColumnFlags(column_n) & ImGuiTableColumnFlags_NoHeaderLabel) ? "" : TableGetColumnName(column_n); - PushID(table->InstanceCurrent * table->ColumnsCount + column_n); - TableHeader(name); - PopID(); - } - - // Allow opening popup from the right-most section after the last column. - ImVec2 mouse_pos = ImGui::GetMousePos(); - if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count) - if (mouse_pos.y >= row_y1 && mouse_pos.y < row_y1 + row_height) - TableOpenContextMenu(-1); // Will open a non-column-specific popup. -} - -// Emit a column header (text + optional sort order) -// We cpu-clip text here so that all columns headers can be merged into a same draw call. -// Note that because of how we cpu-clip and display sorting indicators, you _cannot_ use SameLine() after a TableHeader() -void ImGui::TableHeader(const char* label) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - ImGuiTable* table = g.CurrentTable; - IM_ASSERT(table != NULL && "Need to call TableHeader() after BeginTable()!"); - IM_ASSERT(table->CurrentColumn != -1); - const int column_n = table->CurrentColumn; - ImGuiTableColumn* column = &table->Columns[column_n]; - - // Label - if (label == NULL) - label = ""; - const char* label_end = FindRenderedTextEnd(label); - ImVec2 label_size = CalcTextSize(label, label_end, true); - ImVec2 label_pos = window->DC.CursorPos; - - // If we already got a row height, there's use that. - // FIXME-TABLE: Padding problem if the correct outer-padding CellBgRect strays off our ClipRect? - ImRect cell_r = TableGetCellBgRect(table, column_n); - float label_height = ImMax(label_size.y, table->RowMinHeight - table->CellPaddingY * 2.0f); - - // Calculate ideal size for sort order arrow - float w_arrow = 0.0f; - float w_sort_text = 0.0f; - char sort_order_suf[4] = ""; - const float ARROW_SCALE = 0.65f; - if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) - { - w_arrow = ImFloor(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x); - if (column->SortOrder > 0) - { - ImFormatString(sort_order_suf, IM_ARRAYSIZE(sort_order_suf), "%d", column->SortOrder + 1); - w_sort_text = g.Style.ItemInnerSpacing.x + CalcTextSize(sort_order_suf).x; - } - } - - // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging. - float max_pos_x = label_pos.x + label_size.x + w_sort_text + w_arrow; - column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, column->WorkMaxX); - column->ContentMaxXHeadersIdeal = ImMax(column->ContentMaxXHeadersIdeal, max_pos_x); - - // Keep header highlighted when context menu is open. - const bool selected = (table->IsContextPopupOpen && table->ContextPopupColumn == column_n && table->InstanceInteracted == table->InstanceCurrent); - ImGuiID id = window->GetID(label); - ImRect bb(cell_r.Min.x, cell_r.Min.y, cell_r.Max.x, ImMax(cell_r.Max.y, cell_r.Min.y + label_height + g.Style.CellPadding.y * 2.0f)); - ItemSize(ImVec2(0.0f, label_height)); // Don't declare unclipped width, it'll be fed ContentMaxPosHeadersIdeal - if (!ItemAdd(bb, id)) - return; - - //GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] - //GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] - - // Using AllowItemOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items. - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowItemOverlap); - if (g.ActiveId != id) - SetItemAllowOverlap(); - if (held || hovered || selected) - { - const ImU32 col = GetColorU32(held ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); - //RenderFrame(bb.Min, bb.Max, col, false, 0.0f); - TableSetBgColor(ImGuiTableBgTarget_CellBg, col, table->CurrentColumn); - } - else - { - // Submit single cell bg color in the case we didn't submit a full header row - if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0) - TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn); - } - RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); - if (held) - table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n; - window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f; - - // Drag and drop to re-order columns. - // FIXME-TABLE: Scroll request while reordering a column and it lands out of the scrolling zone. - if (held && (table->Flags & ImGuiTableFlags_Reorderable) && IsMouseDragging(0) && !g.DragDropActive) - { - // While moving a column it will jump on the other side of the mouse, so we also test for MouseDelta.x - table->ReorderColumn = (ImGuiTableColumnIdx)column_n; - table->InstanceInteracted = table->InstanceCurrent; - - // We don't reorder: through the frozen<>unfrozen line, or through a column that is marked with ImGuiTableColumnFlags_NoReorder. - if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < cell_r.Min.x) - if (ImGuiTableColumn* prev_column = (column->PrevEnabledColumn != -1) ? &table->Columns[column->PrevEnabledColumn] : NULL) - if (!((column->Flags | prev_column->Flags) & ImGuiTableColumnFlags_NoReorder)) - if ((column->IndexWithinEnabledSet < table->FreezeColumnsRequest) == (prev_column->IndexWithinEnabledSet < table->FreezeColumnsRequest)) - table->ReorderColumnDir = -1; - if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > cell_r.Max.x) - if (ImGuiTableColumn* next_column = (column->NextEnabledColumn != -1) ? &table->Columns[column->NextEnabledColumn] : NULL) - if (!((column->Flags | next_column->Flags) & ImGuiTableColumnFlags_NoReorder)) - if ((column->IndexWithinEnabledSet < table->FreezeColumnsRequest) == (next_column->IndexWithinEnabledSet < table->FreezeColumnsRequest)) - table->ReorderColumnDir = +1; - } - - // Sort order arrow - const float ellipsis_max = cell_r.Max.x - w_arrow - w_sort_text; - if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) - { - if (column->SortOrder != -1) - { - float x = ImMax(cell_r.Min.x, cell_r.Max.x - w_arrow - w_sort_text); - float y = label_pos.y; - if (column->SortOrder > 0) - { - PushStyleColor(ImGuiCol_Text, GetColorU32(ImGuiCol_Text, 0.70f)); - RenderText(ImVec2(x + g.Style.ItemInnerSpacing.x, y), sort_order_suf); - PopStyleColor(); - x += w_sort_text; - } - RenderArrow(window->DrawList, ImVec2(x, y), GetColorU32(ImGuiCol_Text), column->SortDirection == ImGuiSortDirection_Ascending ? ImGuiDir_Up : ImGuiDir_Down, ARROW_SCALE); - } - - // Handle clicking on column header to adjust Sort Order - if (pressed && table->ReorderColumn != column_n) - { - ImGuiSortDirection sort_direction = TableGetColumnNextSortDirection(column); - TableSetColumnSortDirection(column_n, sort_direction, g.IO.KeyShift); - } - } - - // Render clipped label. Clipping here ensure that in the majority of situations, all our header cells will - // be merged into a single draw call. - //window->DrawList->AddCircleFilled(ImVec2(ellipsis_max, label_pos.y), 40, IM_COL32_WHITE); - RenderTextEllipsis(window->DrawList, label_pos, ImVec2(ellipsis_max, label_pos.y + label_height + g.Style.FramePadding.y), ellipsis_max, ellipsis_max, label, label_end, &label_size); - - const bool text_clipped = label_size.x > (ellipsis_max - label_pos.x); - if (text_clipped && hovered && g.HoveredIdNotActiveTimer > g.TooltipSlowDelay) - SetTooltip("%.*s", (int)(label_end - label), label); - - // We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden - if (IsMouseReleased(1) && IsItemHovered()) - TableOpenContextMenu(column_n); -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Context Menu -//------------------------------------------------------------------------- -// - TableOpenContextMenu() [Internal] -// - TableDrawContextMenu() [Internal] -//------------------------------------------------------------------------- - -// Use -1 to open menu not specific to a given column. -void ImGui::TableOpenContextMenu(int column_n) -{ - ImGuiContext& g = *GImGui; - ImGuiTable* table = g.CurrentTable; - if (column_n == -1 && table->CurrentColumn != -1) // When called within a column automatically use this one (for consistency) - column_n = table->CurrentColumn; - if (column_n == table->ColumnsCount) // To facilitate using with TableGetHoveredColumn() - column_n = -1; - IM_ASSERT(column_n >= -1 && column_n < table->ColumnsCount); - if (table->Flags & (ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) - { - table->IsContextPopupOpen = true; - table->ContextPopupColumn = (ImGuiTableColumnIdx)column_n; - table->InstanceInteracted = table->InstanceCurrent; - const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); - OpenPopupEx(context_menu_id, ImGuiPopupFlags_None); - } -} - -bool ImGui::TableBeginContextMenuPopup(ImGuiTable* table) -{ - if (!table->IsContextPopupOpen || table->InstanceCurrent != table->InstanceInteracted) - return false; - const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); - if (BeginPopupEx(context_menu_id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings)) - return true; - table->IsContextPopupOpen = false; - return false; -} - -// Output context menu into current window (generally a popup) -// FIXME-TABLE: Ideally this should be writable by the user. Full programmatic access to that data? -void ImGui::TableDrawContextMenu(ImGuiTable* table) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - bool want_separator = false; - const int column_n = (table->ContextPopupColumn >= 0 && table->ContextPopupColumn < table->ColumnsCount) ? table->ContextPopupColumn : -1; - ImGuiTableColumn* column = (column_n != -1) ? &table->Columns[column_n] : NULL; - - // Sizing - if (table->Flags & ImGuiTableFlags_Resizable) - { - if (column != NULL) - { - const bool can_resize = !(column->Flags & ImGuiTableColumnFlags_NoResize) && column->IsEnabled; - if (MenuItem("Size column to fit###SizeOne", NULL, false, can_resize)) - TableSetColumnWidthAutoSingle(table, column_n); - } - - const char* size_all_desc; - if (table->ColumnsEnabledFixedCount == table->ColumnsEnabledCount && (table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame) - size_all_desc = "Size all columns to fit###SizeAll"; // All fixed - else - size_all_desc = "Size all columns to default###SizeAll"; // All stretch or mixed - if (MenuItem(size_all_desc, NULL)) - TableSetColumnWidthAutoAll(table); - want_separator = true; - } - - // Ordering - if (table->Flags & ImGuiTableFlags_Reorderable) - { - if (MenuItem("Reset order", NULL, false, !table->IsDefaultDisplayOrder)) - table->IsResetDisplayOrderRequest = true; - want_separator = true; - } - - // Reset all (should work but seems unnecessary/noisy to expose?) - //if (MenuItem("Reset all")) - // table->IsResetAllRequest = true; - - // Sorting - // (modify TableOpenContextMenu() to add _Sortable flag if enabling this) -#if 0 - if ((table->Flags & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0) - { - if (want_separator) - Separator(); - want_separator = true; - - bool append_to_sort_specs = g.IO.KeyShift; - if (MenuItem("Sort in Ascending Order", NULL, column->SortOrder != -1 && column->SortDirection == ImGuiSortDirection_Ascending, (column->Flags & ImGuiTableColumnFlags_NoSortAscending) == 0)) - TableSetColumnSortDirection(table, column_n, ImGuiSortDirection_Ascending, append_to_sort_specs); - if (MenuItem("Sort in Descending Order", NULL, column->SortOrder != -1 && column->SortDirection == ImGuiSortDirection_Descending, (column->Flags & ImGuiTableColumnFlags_NoSortDescending) == 0)) - TableSetColumnSortDirection(table, column_n, ImGuiSortDirection_Descending, append_to_sort_specs); - } -#endif - - // Hiding / Visibility - if (table->Flags & ImGuiTableFlags_Hideable) - { - if (want_separator) - Separator(); - want_separator = true; - - PushItemFlag(ImGuiItemFlags_SelectableDontClosePopup, true); - for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) - { - ImGuiTableColumn* other_column = &table->Columns[other_column_n]; - if (other_column->Flags & ImGuiTableColumnFlags_Disabled) - continue; - - const char* name = TableGetColumnName(table, other_column_n); - if (name == NULL || name[0] == 0) - name = ""; - - // Make sure we can't hide the last active column - bool menu_item_active = (other_column->Flags & ImGuiTableColumnFlags_NoHide) ? false : true; - if (other_column->IsUserEnabled && table->ColumnsEnabledCount <= 1) - menu_item_active = false; - if (MenuItem(name, NULL, other_column->IsUserEnabled, menu_item_active)) - other_column->IsUserEnabledNextFrame = !other_column->IsUserEnabled; - } - PopItemFlag(); - } -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Settings (.ini data) -//------------------------------------------------------------------------- -// FIXME: The binding/finding/creating flow are too confusing. -//------------------------------------------------------------------------- -// - TableSettingsInit() [Internal] -// - TableSettingsCalcChunkSize() [Internal] -// - TableSettingsCreate() [Internal] -// - TableSettingsFindByID() [Internal] -// - TableGetBoundSettings() [Internal] -// - TableResetSettings() -// - TableSaveSettings() [Internal] -// - TableLoadSettings() [Internal] -// - TableSettingsHandler_ClearAll() [Internal] -// - TableSettingsHandler_ApplyAll() [Internal] -// - TableSettingsHandler_ReadOpen() [Internal] -// - TableSettingsHandler_ReadLine() [Internal] -// - TableSettingsHandler_WriteAll() [Internal] -// - TableSettingsInstallHandler() [Internal] -//------------------------------------------------------------------------- -// [Init] 1: TableSettingsHandler_ReadXXXX() Load and parse .ini file into TableSettings. -// [Main] 2: TableLoadSettings() When table is created, bind Table to TableSettings, serialize TableSettings data into Table. -// [Main] 3: TableSaveSettings() When table properties are modified, serialize Table data into bound or new TableSettings, mark .ini as dirty. -// [Main] 4: TableSettingsHandler_WriteAll() When .ini file is dirty (which can come from other source), save TableSettings into .ini file. -//------------------------------------------------------------------------- - -// Clear and initialize empty settings instance -static void TableSettingsInit(ImGuiTableSettings* settings, ImGuiID id, int columns_count, int columns_count_max) -{ - IM_PLACEMENT_NEW(settings) ImGuiTableSettings(); - ImGuiTableColumnSettings* settings_column = settings->GetColumnSettings(); - for (int n = 0; n < columns_count_max; n++, settings_column++) - IM_PLACEMENT_NEW(settings_column) ImGuiTableColumnSettings(); - settings->ID = id; - settings->ColumnsCount = (ImGuiTableColumnIdx)columns_count; - settings->ColumnsCountMax = (ImGuiTableColumnIdx)columns_count_max; - settings->WantApply = true; -} - -static size_t TableSettingsCalcChunkSize(int columns_count) -{ - return sizeof(ImGuiTableSettings) + (size_t)columns_count * sizeof(ImGuiTableColumnSettings); -} - -ImGuiTableSettings* ImGui::TableSettingsCreate(ImGuiID id, int columns_count) -{ - ImGuiContext& g = *GImGui; - ImGuiTableSettings* settings = g.SettingsTables.alloc_chunk(TableSettingsCalcChunkSize(columns_count)); - TableSettingsInit(settings, id, columns_count, columns_count); - return settings; -} - -// Find existing settings -ImGuiTableSettings* ImGui::TableSettingsFindByID(ImGuiID id) -{ - // FIXME-OPT: Might want to store a lookup map for this? - ImGuiContext& g = *GImGui; - for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) - if (settings->ID == id) - return settings; - return NULL; -} - -// Get settings for a given table, NULL if none -ImGuiTableSettings* ImGui::TableGetBoundSettings(ImGuiTable* table) -{ - if (table->SettingsOffset != -1) - { - ImGuiContext& g = *GImGui; - ImGuiTableSettings* settings = g.SettingsTables.ptr_from_offset(table->SettingsOffset); - IM_ASSERT(settings->ID == table->ID); - if (settings->ColumnsCountMax >= table->ColumnsCount) - return settings; // OK - settings->ID = 0; // Invalidate storage, we won't fit because of a count change - } - return NULL; -} - -// Restore initial state of table (with or without saved settings) -void ImGui::TableResetSettings(ImGuiTable* table) -{ - table->IsInitializing = table->IsSettingsDirty = true; - table->IsResetAllRequest = false; - table->IsSettingsRequestLoad = false; // Don't reload from ini - table->SettingsLoadedFlags = ImGuiTableFlags_None; // Mark as nothing loaded so our initialized data becomes authoritative -} - -void ImGui::TableSaveSettings(ImGuiTable* table) -{ - table->IsSettingsDirty = false; - if (table->Flags & ImGuiTableFlags_NoSavedSettings) - return; - - // Bind or create settings data - ImGuiContext& g = *GImGui; - ImGuiTableSettings* settings = TableGetBoundSettings(table); - if (settings == NULL) - { - settings = TableSettingsCreate(table->ID, table->ColumnsCount); - table->SettingsOffset = g.SettingsTables.offset_from_ptr(settings); - } - settings->ColumnsCount = (ImGuiTableColumnIdx)table->ColumnsCount; - - // Serialize ImGuiTable/ImGuiTableColumn into ImGuiTableSettings/ImGuiTableColumnSettings - IM_ASSERT(settings->ID == table->ID); - IM_ASSERT(settings->ColumnsCount == table->ColumnsCount && settings->ColumnsCountMax >= settings->ColumnsCount); - ImGuiTableColumn* column = table->Columns.Data; - ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings(); - - bool save_ref_scale = false; - settings->SaveFlags = ImGuiTableFlags_None; - for (int n = 0; n < table->ColumnsCount; n++, column++, column_settings++) - { - const float width_or_weight = (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? column->StretchWeight : column->WidthRequest; - column_settings->WidthOrWeight = width_or_weight; - column_settings->Index = (ImGuiTableColumnIdx)n; - column_settings->DisplayOrder = column->DisplayOrder; - column_settings->SortOrder = column->SortOrder; - column_settings->SortDirection = column->SortDirection; - column_settings->IsEnabled = column->IsUserEnabled; - column_settings->IsStretch = (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? 1 : 0; - if ((column->Flags & ImGuiTableColumnFlags_WidthStretch) == 0) - save_ref_scale = true; - - // We skip saving some data in the .ini file when they are unnecessary to restore our state. - // Note that fixed width where initial width was derived from auto-fit will always be saved as InitStretchWeightOrWidth will be 0.0f. - // FIXME-TABLE: We don't have logic to easily compare SortOrder to DefaultSortOrder yet so it's always saved when present. - if (width_or_weight != column->InitStretchWeightOrWidth) - settings->SaveFlags |= ImGuiTableFlags_Resizable; - if (column->DisplayOrder != n) - settings->SaveFlags |= ImGuiTableFlags_Reorderable; - if (column->SortOrder != -1) - settings->SaveFlags |= ImGuiTableFlags_Sortable; - if (column->IsUserEnabled != ((column->Flags & ImGuiTableColumnFlags_DefaultHide) == 0)) - settings->SaveFlags |= ImGuiTableFlags_Hideable; - } - settings->SaveFlags &= table->Flags; - settings->RefScale = save_ref_scale ? table->RefScale : 0.0f; - - MarkIniSettingsDirty(); -} - -void ImGui::TableLoadSettings(ImGuiTable* table) -{ - ImGuiContext& g = *GImGui; - table->IsSettingsRequestLoad = false; - if (table->Flags & ImGuiTableFlags_NoSavedSettings) - return; - - // Bind settings - ImGuiTableSettings* settings; - if (table->SettingsOffset == -1) - { - settings = TableSettingsFindByID(table->ID); - if (settings == NULL) - return; - if (settings->ColumnsCount != table->ColumnsCount) // Allow settings if columns count changed. We could otherwise decide to return... - table->IsSettingsDirty = true; - table->SettingsOffset = g.SettingsTables.offset_from_ptr(settings); - } - else - { - settings = TableGetBoundSettings(table); - } - - table->SettingsLoadedFlags = settings->SaveFlags; - table->RefScale = settings->RefScale; - - // Serialize ImGuiTableSettings/ImGuiTableColumnSettings into ImGuiTable/ImGuiTableColumn - ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings(); - ImU64 display_order_mask = 0; - for (int data_n = 0; data_n < settings->ColumnsCount; data_n++, column_settings++) - { - int column_n = column_settings->Index; - if (column_n < 0 || column_n >= table->ColumnsCount) - continue; - - ImGuiTableColumn* column = &table->Columns[column_n]; - if (settings->SaveFlags & ImGuiTableFlags_Resizable) - { - if (column_settings->IsStretch) - column->StretchWeight = column_settings->WidthOrWeight; - else - column->WidthRequest = column_settings->WidthOrWeight; - column->AutoFitQueue = 0x00; - } - if (settings->SaveFlags & ImGuiTableFlags_Reorderable) - column->DisplayOrder = column_settings->DisplayOrder; - else - column->DisplayOrder = (ImGuiTableColumnIdx)column_n; - display_order_mask |= (ImU64)1 << column->DisplayOrder; - column->IsUserEnabled = column->IsUserEnabledNextFrame = column_settings->IsEnabled; - column->SortOrder = column_settings->SortOrder; - column->SortDirection = column_settings->SortDirection; - } - - // Validate and fix invalid display order data - const ImU64 expected_display_order_mask = (settings->ColumnsCount == 64) ? ~0 : ((ImU64)1 << settings->ColumnsCount) - 1; - if (display_order_mask != expected_display_order_mask) - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - table->Columns[column_n].DisplayOrder = (ImGuiTableColumnIdx)column_n; - - // Rebuild index - for (int column_n = 0; column_n < table->ColumnsCount; column_n++) - table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n; -} - -static void TableSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) -{ - ImGuiContext& g = *ctx; - for (int i = 0; i != g.Tables.GetMapSize(); i++) - if (ImGuiTable* table = g.Tables.TryGetMapData(i)) - table->SettingsOffset = -1; - g.SettingsTables.clear(); -} - -// Apply to existing windows (if any) -static void TableSettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*) -{ - ImGuiContext& g = *ctx; - for (int i = 0; i != g.Tables.GetMapSize(); i++) - if (ImGuiTable* table = g.Tables.TryGetMapData(i)) - { - table->IsSettingsRequestLoad = true; - table->SettingsOffset = -1; - } -} - -static void* TableSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) -{ - ImGuiID id = 0; - int columns_count = 0; - if (sscanf(name, "0x%08X,%d", &id, &columns_count) < 2) - return NULL; - - if (ImGuiTableSettings* settings = ImGui::TableSettingsFindByID(id)) - { - if (settings->ColumnsCountMax >= columns_count) - { - TableSettingsInit(settings, id, columns_count, settings->ColumnsCountMax); // Recycle - return settings; - } - settings->ID = 0; // Invalidate storage, we won't fit because of a count change - } - return ImGui::TableSettingsCreate(id, columns_count); -} - -static void TableSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) -{ - // "Column 0 UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" - ImGuiTableSettings* settings = (ImGuiTableSettings*)entry; - float f = 0.0f; - int column_n = 0, r = 0, n = 0; - - if (sscanf(line, "RefScale=%f", &f) == 1) { settings->RefScale = f; return; } - - if (sscanf(line, "Column %d%n", &column_n, &r) == 1) - { - if (column_n < 0 || column_n >= settings->ColumnsCount) - return; - line = ImStrSkipBlank(line + r); - char c = 0; - ImGuiTableColumnSettings* column = settings->GetColumnSettings() + column_n; - column->Index = (ImGuiTableColumnIdx)column_n; - if (sscanf(line, "UserID=0x%08X%n", (ImU32*)&n, &r)==1) { line = ImStrSkipBlank(line + r); column->UserID = (ImGuiID)n; } - if (sscanf(line, "Width=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->WidthOrWeight = (float)n; column->IsStretch = 0; settings->SaveFlags |= ImGuiTableFlags_Resizable; } - if (sscanf(line, "Weight=%f%n", &f, &r) == 1) { line = ImStrSkipBlank(line + r); column->WidthOrWeight = f; column->IsStretch = 1; settings->SaveFlags |= ImGuiTableFlags_Resizable; } - if (sscanf(line, "Visible=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->IsEnabled = (ImU8)n; settings->SaveFlags |= ImGuiTableFlags_Hideable; } - if (sscanf(line, "Order=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->DisplayOrder = (ImGuiTableColumnIdx)n; settings->SaveFlags |= ImGuiTableFlags_Reorderable; } - if (sscanf(line, "Sort=%d%c%n", &n, &c, &r) == 2) { line = ImStrSkipBlank(line + r); column->SortOrder = (ImGuiTableColumnIdx)n; column->SortDirection = (c == '^') ? ImGuiSortDirection_Descending : ImGuiSortDirection_Ascending; settings->SaveFlags |= ImGuiTableFlags_Sortable; } - } -} - -static void TableSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) -{ - ImGuiContext& g = *ctx; - for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) - { - if (settings->ID == 0) // Skip ditched settings - continue; - - // TableSaveSettings() may clear some of those flags when we establish that the data can be stripped - // (e.g. Order was unchanged) - const bool save_size = (settings->SaveFlags & ImGuiTableFlags_Resizable) != 0; - const bool save_visible = (settings->SaveFlags & ImGuiTableFlags_Hideable) != 0; - const bool save_order = (settings->SaveFlags & ImGuiTableFlags_Reorderable) != 0; - const bool save_sort = (settings->SaveFlags & ImGuiTableFlags_Sortable) != 0; - if (!save_size && !save_visible && !save_order && !save_sort) - continue; - - buf->reserve(buf->size() + 30 + settings->ColumnsCount * 50); // ballpark reserve - buf->appendf("[%s][0x%08X,%d]\n", handler->TypeName, settings->ID, settings->ColumnsCount); - if (settings->RefScale != 0.0f) - buf->appendf("RefScale=%g\n", settings->RefScale); - ImGuiTableColumnSettings* column = settings->GetColumnSettings(); - for (int column_n = 0; column_n < settings->ColumnsCount; column_n++, column++) - { - // "Column 0 UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" - bool save_column = column->UserID != 0 || save_size || save_visible || save_order || (save_sort && column->SortOrder != -1); - if (!save_column) - continue; - buf->appendf("Column %-2d", column_n); - if (column->UserID != 0) buf->appendf(" UserID=%08X", column->UserID); - if (save_size && column->IsStretch) buf->appendf(" Weight=%.4f", column->WidthOrWeight); - if (save_size && !column->IsStretch) buf->appendf(" Width=%d", (int)column->WidthOrWeight); - if (save_visible) buf->appendf(" Visible=%d", column->IsEnabled); - if (save_order) buf->appendf(" Order=%d", column->DisplayOrder); - if (save_sort && column->SortOrder != -1) buf->appendf(" Sort=%d%c", column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? 'v' : '^'); - buf->append("\n"); - } - buf->append("\n"); - } -} - -void ImGui::TableSettingsAddSettingsHandler() -{ - ImGuiSettingsHandler ini_handler; - ini_handler.TypeName = "Table"; - ini_handler.TypeHash = ImHashStr("Table"); - ini_handler.ClearAllFn = TableSettingsHandler_ClearAll; - ini_handler.ReadOpenFn = TableSettingsHandler_ReadOpen; - ini_handler.ReadLineFn = TableSettingsHandler_ReadLine; - ini_handler.ApplyAllFn = TableSettingsHandler_ApplyAll; - ini_handler.WriteAllFn = TableSettingsHandler_WriteAll; - AddSettingsHandler(&ini_handler); -} - -//------------------------------------------------------------------------- -// [SECTION] Tables: Garbage Collection -//------------------------------------------------------------------------- -// - TableRemove() [Internal] -// - TableGcCompactTransientBuffers() [Internal] -// - TableGcCompactSettings() [Internal] -//------------------------------------------------------------------------- - -// Remove Table (currently only used by TestEngine) -void ImGui::TableRemove(ImGuiTable* table) -{ - //IMGUI_DEBUG_PRINT("TableRemove() id=0x%08X\n", table->ID); - ImGuiContext& g = *GImGui; - int table_idx = g.Tables.GetIndex(table); - //memset(table->RawData.Data, 0, table->RawData.size_in_bytes()); - //memset(table, 0, sizeof(ImGuiTable)); - g.Tables.Remove(table->ID, table); - g.TablesLastTimeActive[table_idx] = -1.0f; -} - -// Free up/compact internal Table buffers for when it gets unused -void ImGui::TableGcCompactTransientBuffers(ImGuiTable* table) -{ - //IMGUI_DEBUG_PRINT("TableGcCompactTransientBuffers() id=0x%08X\n", table->ID); - ImGuiContext& g = *GImGui; - IM_ASSERT(table->MemoryCompacted == false); - table->SortSpecs.Specs = NULL; - table->SortSpecsMulti.clear(); - table->IsSortSpecsDirty = true; // FIXME: shouldn't have to leak into user performing a sort - table->ColumnsNames.clear(); - table->MemoryCompacted = true; - for (int n = 0; n < table->ColumnsCount; n++) - table->Columns[n].NameOffset = -1; - g.TablesLastTimeActive[g.Tables.GetIndex(table)] = -1.0f; -} - -void ImGui::TableGcCompactTransientBuffers(ImGuiTableTempData* temp_data) -{ - temp_data->DrawSplitter.ClearFreeMemory(); - temp_data->LastTimeActive = -1.0f; -} - -// Compact and remove unused settings data (currently only used by TestEngine) -void ImGui::TableGcCompactSettings() -{ - ImGuiContext& g = *GImGui; - int required_memory = 0; - for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) - if (settings->ID != 0) - required_memory += (int)TableSettingsCalcChunkSize(settings->ColumnsCount); - if (required_memory == g.SettingsTables.Buf.Size) - return; - ImChunkStream new_chunk_stream; - new_chunk_stream.Buf.reserve(required_memory); - for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) - if (settings->ID != 0) - memcpy(new_chunk_stream.alloc_chunk(TableSettingsCalcChunkSize(settings->ColumnsCount)), settings, TableSettingsCalcChunkSize(settings->ColumnsCount)); - g.SettingsTables.swap(new_chunk_stream); -} - - -//------------------------------------------------------------------------- -// [SECTION] Tables: Debugging -//------------------------------------------------------------------------- -// - DebugNodeTable() [Internal] -//------------------------------------------------------------------------- - -#ifndef IMGUI_DISABLE_DEBUG_TOOLS - -static const char* DebugNodeTableGetSizingPolicyDesc(ImGuiTableFlags sizing_policy) -{ - sizing_policy &= ImGuiTableFlags_SizingMask_; - if (sizing_policy == ImGuiTableFlags_SizingFixedFit) { return "FixedFit"; } - if (sizing_policy == ImGuiTableFlags_SizingFixedSame) { return "FixedSame"; } - if (sizing_policy == ImGuiTableFlags_SizingStretchProp) { return "StretchProp"; } - if (sizing_policy == ImGuiTableFlags_SizingStretchSame) { return "StretchSame"; } - return "N/A"; -} - -void ImGui::DebugNodeTable(ImGuiTable* table) -{ - char buf[512]; - char* p = buf; - const char* buf_end = buf + IM_ARRAYSIZE(buf); - const bool is_active = (table->LastFrameActive >= ImGui::GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here. - ImFormatString(p, buf_end - p, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*"); - if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } - bool open = TreeNode(table, "%s", buf); - if (!is_active) { PopStyleColor(); } - if (IsItemHovered()) - GetForegroundDrawList()->AddRect(table->OuterRect.Min, table->OuterRect.Max, IM_COL32(255, 255, 0, 255)); - if (IsItemVisible() && table->HoveredColumnBody != -1) - GetForegroundDrawList()->AddRect(GetItemRectMin(), GetItemRectMax(), IM_COL32(255, 255, 0, 255)); - if (!open) - return; - if (table->InstanceCurrent > 0) - ImGui::Text("** %d instances of same table! Some data below will refer to last instance.", table->InstanceCurrent + 1); - bool clear_settings = SmallButton("Clear settings"); - BulletText("OuterRect: Pos: (%.1f,%.1f) Size: (%.1f,%.1f) Sizing: '%s'", table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.GetWidth(), table->OuterRect.GetHeight(), DebugNodeTableGetSizingPolicyDesc(table->Flags)); - BulletText("ColumnsGivenWidth: %.1f, ColumnsAutoFitWidth: %.1f, InnerWidth: %.1f%s", table->ColumnsGivenWidth, table->ColumnsAutoFitWidth, table->InnerWidth, table->InnerWidth == 0.0f ? " (auto)" : ""); - BulletText("CellPaddingX: %.1f, CellSpacingX: %.1f/%.1f, OuterPaddingX: %.1f", table->CellPaddingX, table->CellSpacingX1, table->CellSpacingX2, table->OuterPaddingX); - BulletText("HoveredColumnBody: %d, HoveredColumnBorder: %d", table->HoveredColumnBody, table->HoveredColumnBorder); - BulletText("ResizedColumn: %d, ReorderColumn: %d, HeldHeaderColumn: %d", table->ResizedColumn, table->ReorderColumn, table->HeldHeaderColumn); - //BulletText("BgDrawChannels: %d/%d", 0, table->BgDrawChannelUnfrozen); - float sum_weights = 0.0f; - for (int n = 0; n < table->ColumnsCount; n++) - if (table->Columns[n].Flags & ImGuiTableColumnFlags_WidthStretch) - sum_weights += table->Columns[n].StretchWeight; - for (int n = 0; n < table->ColumnsCount; n++) - { - ImGuiTableColumn* column = &table->Columns[n]; - const char* name = TableGetColumnName(table, n); - ImFormatString(buf, IM_ARRAYSIZE(buf), - "Column %d order %d '%s': offset %+.2f to %+.2f%s\n" - "Enabled: %d, VisibleX/Y: %d/%d, RequestOutput: %d, SkipItems: %d, DrawChannels: %d,%d\n" - "WidthGiven: %.1f, Request/Auto: %.1f/%.1f, StretchWeight: %.3f (%.1f%%)\n" - "MinX: %.1f, MaxX: %.1f (%+.1f), ClipRect: %.1f to %.1f (+%.1f)\n" - "ContentWidth: %.1f,%.1f, HeadersUsed/Ideal %.1f/%.1f\n" - "Sort: %d%s, UserID: 0x%08X, Flags: 0x%04X: %s%s%s..", - n, column->DisplayOrder, name, column->MinX - table->WorkRect.Min.x, column->MaxX - table->WorkRect.Min.x, (n < table->FreezeColumnsRequest) ? " (Frozen)" : "", - column->IsEnabled, column->IsVisibleX, column->IsVisibleY, column->IsRequestOutput, column->IsSkipItems, column->DrawChannelFrozen, column->DrawChannelUnfrozen, - column->WidthGiven, column->WidthRequest, column->WidthAuto, column->StretchWeight, column->StretchWeight > 0.0f ? (column->StretchWeight / sum_weights) * 100.0f : 0.0f, - column->MinX, column->MaxX, column->MaxX - column->MinX, column->ClipRect.Min.x, column->ClipRect.Max.x, column->ClipRect.Max.x - column->ClipRect.Min.x, - column->ContentMaxXFrozen - column->WorkMinX, column->ContentMaxXUnfrozen - column->WorkMinX, column->ContentMaxXHeadersUsed - column->WorkMinX, column->ContentMaxXHeadersIdeal - column->WorkMinX, - column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? " (Asc)" : (column->SortDirection == ImGuiSortDirection_Descending) ? " (Des)" : "", column->UserID, column->Flags, - (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? "WidthStretch " : "", - (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? "WidthFixed " : "", - (column->Flags & ImGuiTableColumnFlags_NoResize) ? "NoResize " : ""); - Bullet(); - Selectable(buf); - if (IsItemHovered()) - { - ImRect r(column->MinX, table->OuterRect.Min.y, column->MaxX, table->OuterRect.Max.y); - GetForegroundDrawList()->AddRect(r.Min, r.Max, IM_COL32(255, 255, 0, 255)); - } - } - if (ImGuiTableSettings* settings = TableGetBoundSettings(table)) - DebugNodeTableSettings(settings); - if (clear_settings) - table->IsResetAllRequest = true; - TreePop(); -} - -void ImGui::DebugNodeTableSettings(ImGuiTableSettings* settings) -{ - if (!TreeNode((void*)(intptr_t)settings->ID, "Settings 0x%08X (%d columns)", settings->ID, settings->ColumnsCount)) - return; - BulletText("SaveFlags: 0x%08X", settings->SaveFlags); - BulletText("ColumnsCount: %d (max %d)", settings->ColumnsCount, settings->ColumnsCountMax); - for (int n = 0; n < settings->ColumnsCount; n++) - { - ImGuiTableColumnSettings* column_settings = &settings->GetColumnSettings()[n]; - ImGuiSortDirection sort_dir = (column_settings->SortOrder != -1) ? (ImGuiSortDirection)column_settings->SortDirection : ImGuiSortDirection_None; - BulletText("Column %d Order %d SortOrder %d %s Vis %d %s %7.3f UserID 0x%08X", - n, column_settings->DisplayOrder, column_settings->SortOrder, - (sort_dir == ImGuiSortDirection_Ascending) ? "Asc" : (sort_dir == ImGuiSortDirection_Descending) ? "Des" : "---", - column_settings->IsEnabled, column_settings->IsStretch ? "Weight" : "Width ", column_settings->WidthOrWeight, column_settings->UserID); - } - TreePop(); -} - -#else // #ifndef IMGUI_DISABLE_DEBUG_TOOLS - -void ImGui::DebugNodeTable(ImGuiTable*) {} -void ImGui::DebugNodeTableSettings(ImGuiTableSettings*) {} - -#endif - - -//------------------------------------------------------------------------- -// [SECTION] Columns, BeginColumns, EndColumns, etc. -// (This is a legacy API, prefer using BeginTable/EndTable!) -//------------------------------------------------------------------------- -// FIXME: sizing is lossy when columns width is very small (default width may turn negative etc.) -//------------------------------------------------------------------------- -// - SetWindowClipRectBeforeSetChannel() [Internal] -// - GetColumnIndex() -// - GetColumnsCount() -// - GetColumnOffset() -// - GetColumnWidth() -// - SetColumnOffset() -// - SetColumnWidth() -// - PushColumnClipRect() [Internal] -// - PushColumnsBackground() [Internal] -// - PopColumnsBackground() [Internal] -// - FindOrCreateColumns() [Internal] -// - GetColumnsID() [Internal] -// - BeginColumns() -// - NextColumn() -// - EndColumns() -// - Columns() -//------------------------------------------------------------------------- - -// [Internal] Small optimization to avoid calls to PopClipRect/SetCurrentChannel/PushClipRect in sequences, -// they would meddle many times with the underlying ImDrawCmd. -// Instead, we do a preemptive overwrite of clipping rectangle _without_ altering the command-buffer and let -// the subsequent single call to SetCurrentChannel() does it things once. -void ImGui::SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect) -{ - ImVec4 clip_rect_vec4 = clip_rect.ToVec4(); - window->ClipRect = clip_rect; - window->DrawList->_CmdHeader.ClipRect = clip_rect_vec4; - window->DrawList->_ClipRectStack.Data[window->DrawList->_ClipRectStack.Size - 1] = clip_rect_vec4; -} - -int ImGui::GetColumnIndex() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CurrentColumns ? window->DC.CurrentColumns->Current : 0; -} - -int ImGui::GetColumnsCount() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - return window->DC.CurrentColumns ? window->DC.CurrentColumns->Count : 1; -} - -float ImGui::GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm) -{ - return offset_norm * (columns->OffMaxX - columns->OffMinX); -} - -float ImGui::GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset) -{ - return offset / (columns->OffMaxX - columns->OffMinX); -} - -static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f; - -static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index) -{ - // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing - // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning. - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(column_index > 0); // We are not supposed to drag column 0. - IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index)); - - float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x; - x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing); - if ((columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths)) - x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing); - - return x; -} - -float ImGui::GetColumnOffset(int column_index) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiOldColumns* columns = window->DC.CurrentColumns; - if (columns == NULL) - return 0.0f; - - if (column_index < 0) - column_index = columns->Current; - IM_ASSERT(column_index < columns->Columns.Size); - - const float t = columns->Columns[column_index].OffsetNorm; - const float x_offset = ImLerp(columns->OffMinX, columns->OffMaxX, t); - return x_offset; -} - -static float GetColumnWidthEx(ImGuiOldColumns* columns, int column_index, bool before_resize = false) -{ - if (column_index < 0) - column_index = columns->Current; - - float offset_norm; - if (before_resize) - offset_norm = columns->Columns[column_index + 1].OffsetNormBeforeResize - columns->Columns[column_index].OffsetNormBeforeResize; - else - offset_norm = columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm; - return ImGui::GetColumnOffsetFromNorm(columns, offset_norm); -} - -float ImGui::GetColumnWidth(int column_index) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiOldColumns* columns = window->DC.CurrentColumns; - if (columns == NULL) - return GetContentRegionAvail().x; - - if (column_index < 0) - column_index = columns->Current; - return GetColumnOffsetFromNorm(columns, columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm); -} - -void ImGui::SetColumnOffset(int column_index, float offset) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiOldColumns* columns = window->DC.CurrentColumns; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - IM_ASSERT(column_index < columns->Columns.Size); - - const bool preserve_width = !(columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths) && (column_index < columns->Count - 1); - const float width = preserve_width ? GetColumnWidthEx(columns, column_index, columns->IsBeingResized) : 0.0f; - - if (!(columns->Flags & ImGuiOldColumnFlags_NoForceWithinWindow)) - offset = ImMin(offset, columns->OffMaxX - g.Style.ColumnsMinSpacing * (columns->Count - column_index)); - columns->Columns[column_index].OffsetNorm = GetColumnNormFromOffset(columns, offset - columns->OffMinX); - - if (preserve_width) - SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width)); -} - -void ImGui::SetColumnWidth(int column_index, float width) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiOldColumns* columns = window->DC.CurrentColumns; - IM_ASSERT(columns != NULL); - - if (column_index < 0) - column_index = columns->Current; - SetColumnOffset(column_index + 1, GetColumnOffset(column_index) + width); -} - -void ImGui::PushColumnClipRect(int column_index) -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiOldColumns* columns = window->DC.CurrentColumns; - if (column_index < 0) - column_index = columns->Current; - - ImGuiOldColumnData* column = &columns->Columns[column_index]; - PushClipRect(column->ClipRect.Min, column->ClipRect.Max, false); -} - -// Get into the columns background draw command (which is generally the same draw command as before we called BeginColumns) -void ImGui::PushColumnsBackground() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiOldColumns* columns = window->DC.CurrentColumns; - if (columns->Count == 1) - return; - - // Optimization: avoid SetCurrentChannel() + PushClipRect() - columns->HostBackupClipRect = window->ClipRect; - SetWindowClipRectBeforeSetChannel(window, columns->HostInitialClipRect); - columns->Splitter.SetCurrentChannel(window->DrawList, 0); -} - -void ImGui::PopColumnsBackground() -{ - ImGuiWindow* window = GetCurrentWindowRead(); - ImGuiOldColumns* columns = window->DC.CurrentColumns; - if (columns->Count == 1) - return; - - // Optimization: avoid PopClipRect() + SetCurrentChannel() - SetWindowClipRectBeforeSetChannel(window, columns->HostBackupClipRect); - columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1); -} - -ImGuiOldColumns* ImGui::FindOrCreateColumns(ImGuiWindow* window, ImGuiID id) -{ - // We have few columns per window so for now we don't need bother much with turning this into a faster lookup. - for (int n = 0; n < window->ColumnsStorage.Size; n++) - if (window->ColumnsStorage[n].ID == id) - return &window->ColumnsStorage[n]; - - window->ColumnsStorage.push_back(ImGuiOldColumns()); - ImGuiOldColumns* columns = &window->ColumnsStorage.back(); - columns->ID = id; - return columns; -} - -ImGuiID ImGui::GetColumnsID(const char* str_id, int columns_count) -{ - ImGuiWindow* window = GetCurrentWindow(); - - // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget. - // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer. - PushID(0x11223347 + (str_id ? 0 : columns_count)); - ImGuiID id = window->GetID(str_id ? str_id : "columns"); - PopID(); - - return id; -} - -void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - IM_ASSERT(columns_count >= 1); - IM_ASSERT(window->DC.CurrentColumns == NULL); // Nested columns are currently not supported - - // Acquire storage for the columns set - ImGuiID id = GetColumnsID(str_id, columns_count); - ImGuiOldColumns* columns = FindOrCreateColumns(window, id); - IM_ASSERT(columns->ID == id); - columns->Current = 0; - columns->Count = columns_count; - columns->Flags = flags; - window->DC.CurrentColumns = columns; - - columns->HostCursorPosY = window->DC.CursorPos.y; - columns->HostCursorMaxPosX = window->DC.CursorMaxPos.x; - columns->HostInitialClipRect = window->ClipRect; - columns->HostBackupParentWorkRect = window->ParentWorkRect; - window->ParentWorkRect = window->WorkRect; - - // Set state for first column - // We aim so that the right-most column will have the same clipping width as other after being clipped by parent ClipRect - const float column_padding = g.Style.ItemSpacing.x; - const float half_clip_extend_x = ImFloor(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize)); - const float max_1 = window->WorkRect.Max.x + column_padding - ImMax(column_padding - window->WindowPadding.x, 0.0f); - const float max_2 = window->WorkRect.Max.x + half_clip_extend_x; - columns->OffMinX = window->DC.Indent.x - column_padding + ImMax(column_padding - window->WindowPadding.x, 0.0f); - columns->OffMaxX = ImMax(ImMin(max_1, max_2) - window->Pos.x, columns->OffMinX + 1.0f); - columns->LineMinY = columns->LineMaxY = window->DC.CursorPos.y; - - // Clear data if columns count changed - if (columns->Columns.Size != 0 && columns->Columns.Size != columns_count + 1) - columns->Columns.resize(0); - - // Initialize default widths - columns->IsFirstFrame = (columns->Columns.Size == 0); - if (columns->Columns.Size == 0) - { - columns->Columns.reserve(columns_count + 1); - for (int n = 0; n < columns_count + 1; n++) - { - ImGuiOldColumnData column; - column.OffsetNorm = n / (float)columns_count; - columns->Columns.push_back(column); - } - } - - for (int n = 0; n < columns_count; n++) - { - // Compute clipping rectangle - ImGuiOldColumnData* column = &columns->Columns[n]; - float clip_x1 = IM_ROUND(window->Pos.x + GetColumnOffset(n)); - float clip_x2 = IM_ROUND(window->Pos.x + GetColumnOffset(n + 1) - 1.0f); - column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX); - column->ClipRect.ClipWithFull(window->ClipRect); - } - - if (columns->Count > 1) - { - columns->Splitter.Split(window->DrawList, 1 + columns->Count); - columns->Splitter.SetCurrentChannel(window->DrawList, 1); - PushColumnClipRect(0); - } - - // We don't generally store Indent.x inside ColumnsOffset because it may be manipulated by the user. - float offset_0 = GetColumnOffset(columns->Current); - float offset_1 = GetColumnOffset(columns->Current + 1); - float width = offset_1 - offset_0; - PushItemWidth(width * 0.65f); - window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); - window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; -} - -void ImGui::NextColumn() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems || window->DC.CurrentColumns == NULL) - return; - - ImGuiContext& g = *GImGui; - ImGuiOldColumns* columns = window->DC.CurrentColumns; - - if (columns->Count == 1) - { - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); - IM_ASSERT(columns->Current == 0); - return; - } - - // Next column - if (++columns->Current == columns->Count) - columns->Current = 0; - - PopItemWidth(); - - // Optimization: avoid PopClipRect() + SetCurrentChannel() + PushClipRect() - // (which would needlessly attempt to update commands in the wrong channel, then pop or overwrite them), - ImGuiOldColumnData* column = &columns->Columns[columns->Current]; - SetWindowClipRectBeforeSetChannel(window, column->ClipRect); - columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1); - - const float column_padding = g.Style.ItemSpacing.x; - columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); - if (columns->Current > 0) - { - // Columns 1+ ignore IndentX (by canceling it out) - // FIXME-COLUMNS: Unnecessary, could be locked? - window->DC.ColumnsOffset.x = GetColumnOffset(columns->Current) - window->DC.Indent.x + column_padding; - } - else - { - // New row/line: column 0 honor IndentX. - window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); - window->DC.IsSameLine = false; - columns->LineMinY = columns->LineMaxY; - } - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); - window->DC.CursorPos.y = columns->LineMinY; - window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); - window->DC.CurrLineTextBaseOffset = 0.0f; - - // FIXME-COLUMNS: Share code with BeginColumns() - move code on columns setup. - float offset_0 = GetColumnOffset(columns->Current); - float offset_1 = GetColumnOffset(columns->Current + 1); - float width = offset_1 - offset_0; - PushItemWidth(width * 0.65f); - window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; -} - -void ImGui::EndColumns() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - ImGuiOldColumns* columns = window->DC.CurrentColumns; - IM_ASSERT(columns != NULL); - - PopItemWidth(); - if (columns->Count > 1) - { - PopClipRect(); - columns->Splitter.Merge(window->DrawList); - } - - const ImGuiOldColumnFlags flags = columns->Flags; - columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); - window->DC.CursorPos.y = columns->LineMaxY; - if (!(flags & ImGuiOldColumnFlags_GrowParentContentsSize)) - window->DC.CursorMaxPos.x = columns->HostCursorMaxPosX; // Restore cursor max pos, as columns don't grow parent - - // Draw columns borders and handle resize - // The IsBeingResized flag ensure we preserve pre-resize columns width so back-and-forth are not lossy - bool is_being_resized = false; - if (!(flags & ImGuiOldColumnFlags_NoBorder) && !window->SkipItems) - { - // We clip Y boundaries CPU side because very long triangles are mishandled by some GPU drivers. - const float y1 = ImMax(columns->HostCursorPosY, window->ClipRect.Min.y); - const float y2 = ImMin(window->DC.CursorPos.y, window->ClipRect.Max.y); - int dragging_column = -1; - for (int n = 1; n < columns->Count; n++) - { - ImGuiOldColumnData* column = &columns->Columns[n]; - float x = window->Pos.x + GetColumnOffset(n); - const ImGuiID column_id = columns->ID + ImGuiID(n); - const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH; - const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2)); - KeepAliveID(column_id); - if (IsClippedEx(column_hit_rect, column_id)) // FIXME: Can be removed or replaced with a lower-level test - continue; - - bool hovered = false, held = false; - if (!(flags & ImGuiOldColumnFlags_NoResize)) - { - ButtonBehavior(column_hit_rect, column_id, &hovered, &held); - if (hovered || held) - g.MouseCursor = ImGuiMouseCursor_ResizeEW; - if (held && !(column->Flags & ImGuiOldColumnFlags_NoResize)) - dragging_column = n; - } - - // Draw column - const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); - const float xi = IM_FLOOR(x); - window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); - } - - // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame. - if (dragging_column != -1) - { - if (!columns->IsBeingResized) - for (int n = 0; n < columns->Count + 1; n++) - columns->Columns[n].OffsetNormBeforeResize = columns->Columns[n].OffsetNorm; - columns->IsBeingResized = is_being_resized = true; - float x = GetDraggedColumnOffset(columns, dragging_column); - SetColumnOffset(dragging_column, x); - } - } - columns->IsBeingResized = is_being_resized; - - window->WorkRect = window->ParentWorkRect; - window->ParentWorkRect = columns->HostBackupParentWorkRect; - window->DC.CurrentColumns = NULL; - window->DC.ColumnsOffset.x = 0.0f; - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); -} - -void ImGui::Columns(int columns_count, const char* id, bool border) -{ - ImGuiWindow* window = GetCurrentWindow(); - IM_ASSERT(columns_count >= 1); - - ImGuiOldColumnFlags flags = (border ? 0 : ImGuiOldColumnFlags_NoBorder); - //flags |= ImGuiOldColumnFlags_NoPreserveWidths; // NB: Legacy behavior - ImGuiOldColumns* columns = window->DC.CurrentColumns; - if (columns != NULL && columns->Count == columns_count && columns->Flags == flags) - return; - - if (columns != NULL) - EndColumns(); - - if (columns_count != 1) - BeginColumns(id, columns_count, flags); -} - -//------------------------------------------------------------------------- - -#endif // #ifndef IMGUI_DISABLE diff --git a/dependencies/reboot/vendor/ImGui/imgui_widgets.cpp b/dependencies/reboot/vendor/ImGui/imgui_widgets.cpp deleted file mode 100644 index 8336db1..0000000 --- a/dependencies/reboot/vendor/ImGui/imgui_widgets.cpp +++ /dev/null @@ -1,8415 +0,0 @@ -// dear imgui, v1.89 WIP -// (widgets code) - -/* - -Index of this file: - -// [SECTION] Forward Declarations -// [SECTION] Widgets: Text, etc. -// [SECTION] Widgets: Main (Button, Image, Checkbox, RadioButton, ProgressBar, Bullet, etc.) -// [SECTION] Widgets: Low-level Layout helpers (Spacing, Dummy, NewLine, Separator, etc.) -// [SECTION] Widgets: ComboBox -// [SECTION] Data Type and Data Formatting Helpers -// [SECTION] Widgets: DragScalar, DragFloat, DragInt, etc. -// [SECTION] Widgets: SliderScalar, SliderFloat, SliderInt, etc. -// [SECTION] Widgets: InputScalar, InputFloat, InputInt, etc. -// [SECTION] Widgets: InputText, InputTextMultiline -// [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc. -// [SECTION] Widgets: TreeNode, CollapsingHeader, etc. -// [SECTION] Widgets: Selectable -// [SECTION] Widgets: ListBox -// [SECTION] Widgets: PlotLines, PlotHistogram -// [SECTION] Widgets: Value helpers -// [SECTION] Widgets: MenuItem, BeginMenu, EndMenu, etc. -// [SECTION] Widgets: BeginTabBar, EndTabBar, etc. -// [SECTION] Widgets: BeginTabItem, EndTabItem, etc. -// [SECTION] Widgets: Columns, BeginColumns, EndColumns, etc. - -*/ - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "imgui.h" -#ifndef IMGUI_DISABLE - -#ifndef IMGUI_DEFINE_MATH_OPERATORS -#define IMGUI_DEFINE_MATH_OPERATORS -#endif -#include "imgui_internal.h" - -// System includes -#include // toupper -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else -#include // intptr_t -#endif - -//------------------------------------------------------------------------- -// Warnings -//------------------------------------------------------------------------- - -// Visual Studio warnings -#ifdef _MSC_VER -#pragma warning (disable: 4127) // condition expression is constant -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later -#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types -#endif -#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). -#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). -#endif - -// Clang/GCC warnings with -Weverything -#if defined(__clang__) -#if __has_warning("-Wunknown-warning-option") -#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! -#endif -#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' -#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. -#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. -#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. -#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 -#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. -#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') -#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated -#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision -#elif defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind -#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked -#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead -#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated -#endif - -//------------------------------------------------------------------------- -// Data -//------------------------------------------------------------------------- - -// Widgets -static const float DRAGDROP_HOLD_TO_OPEN_TIMER = 0.70f; // Time for drag-hold to activate items accepting the ImGuiButtonFlags_PressedOnDragDropHold button behavior. -static const float DRAG_MOUSE_THRESHOLD_FACTOR = 0.50f; // Multiplier for the default value of io.MouseDragThreshold to make DragFloat/DragInt react faster to mouse drags. - -// Those MIN/MAX values are not define because we need to point to them -static const signed char IM_S8_MIN = -128; -static const signed char IM_S8_MAX = 127; -static const unsigned char IM_U8_MIN = 0; -static const unsigned char IM_U8_MAX = 0xFF; -static const signed short IM_S16_MIN = -32768; -static const signed short IM_S16_MAX = 32767; -static const unsigned short IM_U16_MIN = 0; -static const unsigned short IM_U16_MAX = 0xFFFF; -static const ImS32 IM_S32_MIN = INT_MIN; // (-2147483647 - 1), (0x80000000); -static const ImS32 IM_S32_MAX = INT_MAX; // (2147483647), (0x7FFFFFFF) -static const ImU32 IM_U32_MIN = 0; -static const ImU32 IM_U32_MAX = UINT_MAX; // (0xFFFFFFFF) -#ifdef LLONG_MIN -static const ImS64 IM_S64_MIN = LLONG_MIN; // (-9223372036854775807ll - 1ll); -static const ImS64 IM_S64_MAX = LLONG_MAX; // (9223372036854775807ll); -#else -static const ImS64 IM_S64_MIN = -9223372036854775807LL - 1; -static const ImS64 IM_S64_MAX = 9223372036854775807LL; -#endif -static const ImU64 IM_U64_MIN = 0; -#ifdef ULLONG_MAX -static const ImU64 IM_U64_MAX = ULLONG_MAX; // (0xFFFFFFFFFFFFFFFFull); -#else -static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1); -#endif - -//------------------------------------------------------------------------- -// [SECTION] Forward Declarations -//------------------------------------------------------------------------- - -// For InputTextEx() -static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source); -static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end); -static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false); - -//------------------------------------------------------------------------- -// [SECTION] Widgets: Text, etc. -//------------------------------------------------------------------------- -// - TextEx() [Internal] -// - TextUnformatted() -// - Text() -// - TextV() -// - TextColored() -// - TextColoredV() -// - TextDisabled() -// - TextDisabledV() -// - TextWrapped() -// - TextWrappedV() -// - LabelText() -// - LabelTextV() -// - BulletText() -// - BulletTextV() -//------------------------------------------------------------------------- - -void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - ImGuiContext& g = *GImGui; - - // Accept null ranges - if (text == text_end) - text = text_end = ""; - - // Calculate length - const char* text_begin = text; - if (text_end == NULL) - text_end = text + strlen(text); // FIXME-OPT - - const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); - const float wrap_pos_x = window->DC.TextWrapPos; - const bool wrap_enabled = (wrap_pos_x >= 0.0f); - if (text_end - text <= 2000 || wrap_enabled) - { - // Common case - const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f; - const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width); - - ImRect bb(text_pos, text_pos + text_size); - ItemSize(text_size, 0.0f); - if (!ItemAdd(bb, 0)) - return; - - // Render (we don't hide text after ## in this end-user function) - RenderTextWrapped(bb.Min, text_begin, text_end, wrap_width); - } - else - { - // Long text! - // Perform manual coarse clipping to optimize for long multi-line text - // - From this point we will only compute the width of lines that are visible. Optimization only available when word-wrapping is disabled. - // - We also don't vertically center the text within the line full height, which is unlikely to matter because we are likely the biggest and only item on the line. - // - We use memchr(), pay attention that well optimized versions of those str/mem functions are much faster than a casually written loop. - const char* line = text; - const float line_height = GetTextLineHeight(); - ImVec2 text_size(0, 0); - - // Lines to skip (can't skip when logging text) - ImVec2 pos = text_pos; - if (!g.LogEnabled) - { - int lines_skippable = (int)((window->ClipRect.Min.y - text_pos.y) / line_height); - if (lines_skippable > 0) - { - int lines_skipped = 0; - while (line < text_end && lines_skipped < lines_skippable) - { - const char* line_end = (const char*)memchr(line, '\n', text_end - line); - if (!line_end) - line_end = text_end; - if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0) - text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); - line = line_end + 1; - lines_skipped++; - } - pos.y += lines_skipped * line_height; - } - } - - // Lines to render - if (line < text_end) - { - ImRect line_rect(pos, pos + ImVec2(FLT_MAX, line_height)); - while (line < text_end) - { - if (IsClippedEx(line_rect, 0)) - break; - - const char* line_end = (const char*)memchr(line, '\n', text_end - line); - if (!line_end) - line_end = text_end; - text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); - RenderText(pos, line, line_end, false); - line = line_end + 1; - line_rect.Min.y += line_height; - line_rect.Max.y += line_height; - pos.y += line_height; - } - - // Count remaining lines - int lines_skipped = 0; - while (line < text_end) - { - const char* line_end = (const char*)memchr(line, '\n', text_end - line); - if (!line_end) - line_end = text_end; - if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0) - text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); - line = line_end + 1; - lines_skipped++; - } - pos.y += lines_skipped * line_height; - } - text_size.y = (pos - text_pos).y; - - ImRect bb(text_pos, text_pos + text_size); - ItemSize(text_size, 0.0f); - ItemAdd(bb, 0); - } -} - -void ImGui::TextUnformatted(const char* text, const char* text_end) -{ - TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText); -} - -void ImGui::Text(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - TextV(fmt, args); - va_end(args); -} - -void ImGui::TextV(const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - // FIXME-OPT: Handle the %s shortcut? - const char* text, *text_end; - ImFormatStringToTempBufferV(&text, &text_end, fmt, args); - TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText); -} - -void ImGui::TextColored(const ImVec4& col, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - TextColoredV(col, fmt, args); - va_end(args); -} - -void ImGui::TextColoredV(const ImVec4& col, const char* fmt, va_list args) -{ - PushStyleColor(ImGuiCol_Text, col); - if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) - TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting - else - TextV(fmt, args); - PopStyleColor(); -} - -void ImGui::TextDisabled(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - TextDisabledV(fmt, args); - va_end(args); -} - -void ImGui::TextDisabledV(const char* fmt, va_list args) -{ - ImGuiContext& g = *GImGui; - PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); - if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) - TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting - else - TextV(fmt, args); - PopStyleColor(); -} - -void ImGui::TextWrapped(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - TextWrappedV(fmt, args); - va_end(args); -} - -void ImGui::TextWrappedV(const char* fmt, va_list args) -{ - ImGuiContext& g = *GImGui; - bool need_backup = (g.CurrentWindow->DC.TextWrapPos < 0.0f); // Keep existing wrap position if one is already set - if (need_backup) - PushTextWrapPos(0.0f); - if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) - TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting - else - TextV(fmt, args); - if (need_backup) - PopTextWrapPos(); -} - -void ImGui::LabelText(const char* label, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - LabelTextV(label, fmt, args); - va_end(args); -} - -// Add a label+text combo aligned to other label+value widgets -void ImGui::LabelTextV(const char* label, const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const float w = CalcItemWidth(); - - const char* value_text_begin, *value_text_end; - ImFormatStringToTempBufferV(&value_text_begin, &value_text_end, fmt, args); - const ImVec2 value_size = CalcTextSize(value_text_begin, value_text_end, false); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - const ImVec2 pos = window->DC.CursorPos; - const ImRect value_bb(pos, pos + ImVec2(w, value_size.y + style.FramePadding.y * 2)); - const ImRect total_bb(pos, pos + ImVec2(w + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), ImMax(value_size.y, label_size.y) + style.FramePadding.y * 2)); - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, 0)) - return; - - // Render - RenderTextClipped(value_bb.Min + style.FramePadding, value_bb.Max, value_text_begin, value_text_end, &value_size, ImVec2(0.0f, 0.0f)); - if (label_size.x > 0.0f) - RenderText(ImVec2(value_bb.Max.x + style.ItemInnerSpacing.x, value_bb.Min.y + style.FramePadding.y), label); -} - -void ImGui::BulletText(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - BulletTextV(fmt, args); - va_end(args); -} - -// Text with a little bullet aligned to the typical tree node. -void ImGui::BulletTextV(const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - const char* text_begin, *text_end; - ImFormatStringToTempBufferV(&text_begin, &text_end, fmt, args); - const ImVec2 label_size = CalcTextSize(text_begin, text_end, false); - const ImVec2 total_size = ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x * 2) : 0.0f), label_size.y); // Empty text doesn't add padding - ImVec2 pos = window->DC.CursorPos; - pos.y += window->DC.CurrLineTextBaseOffset; - ItemSize(total_size, 0.0f); - const ImRect bb(pos, pos + total_size); - if (!ItemAdd(bb, 0)) - return; - - // Render - ImU32 text_col = GetColorU32(ImGuiCol_Text); - RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize * 0.5f, g.FontSize * 0.5f), text_col); - RenderText(bb.Min + ImVec2(g.FontSize + style.FramePadding.x * 2, 0.0f), text_begin, text_end, false); -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: Main -//------------------------------------------------------------------------- -// - ButtonBehavior() [Internal] -// - Button() -// - SmallButton() -// - InvisibleButton() -// - ArrowButton() -// - CloseButton() [Internal] -// - CollapseButton() [Internal] -// - GetWindowScrollbarID() [Internal] -// - GetWindowScrollbarRect() [Internal] -// - Scrollbar() [Internal] -// - ScrollbarEx() [Internal] -// - Image() -// - ImageButton() -// - Checkbox() -// - CheckboxFlagsT() [Internal] -// - CheckboxFlags() -// - RadioButton() -// - ProgressBar() -// - Bullet() -//------------------------------------------------------------------------- - -// The ButtonBehavior() function is key to many interactions and used by many/most widgets. -// Because we handle so many cases (keyboard/gamepad navigation, drag and drop) and many specific behavior (via ImGuiButtonFlags_), -// this code is a little complex. -// By far the most common path is interacting with the Mouse using the default ImGuiButtonFlags_PressedOnClickRelease button behavior. -// See the series of events below and the corresponding state reported by dear imgui: -//------------------------------------------------------------------------------------------------------------------------------------------------ -// with PressedOnClickRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() -// Frame N+0 (mouse is outside bb) - - - - - - -// Frame N+1 (mouse moves inside bb) - true - - - - -// Frame N+2 (mouse button is down) - true true true - true -// Frame N+3 (mouse button is down) - true true - - - -// Frame N+4 (mouse moves outside bb) - - true - - - -// Frame N+5 (mouse moves inside bb) - true true - - - -// Frame N+6 (mouse button is released) true true - - true - -// Frame N+7 (mouse button is released) - true - - - - -// Frame N+8 (mouse moves outside bb) - - - - - - -//------------------------------------------------------------------------------------------------------------------------------------------------ -// with PressedOnClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() -// Frame N+2 (mouse button is down) true true true true - true -// Frame N+3 (mouse button is down) - true true - - - -// Frame N+6 (mouse button is released) - true - - true - -// Frame N+7 (mouse button is released) - true - - - - -//------------------------------------------------------------------------------------------------------------------------------------------------ -// with PressedOnRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() -// Frame N+2 (mouse button is down) - true - - - true -// Frame N+3 (mouse button is down) - true - - - - -// Frame N+6 (mouse button is released) true true - - - - -// Frame N+7 (mouse button is released) - true - - - - -//------------------------------------------------------------------------------------------------------------------------------------------------ -// with PressedOnDoubleClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() -// Frame N+0 (mouse button is down) - true - - - true -// Frame N+1 (mouse button is down) - true - - - - -// Frame N+2 (mouse button is released) - true - - - - -// Frame N+3 (mouse button is released) - true - - - - -// Frame N+4 (mouse button is down) true true true true - true -// Frame N+5 (mouse button is down) - true true - - - -// Frame N+6 (mouse button is released) - true - - true - -// Frame N+7 (mouse button is released) - true - - - - -//------------------------------------------------------------------------------------------------------------------------------------------------ -// Note that some combinations are supported, -// - PressedOnDragDropHold can generally be associated with any flag. -// - PressedOnDoubleClick can be associated by PressedOnClickRelease/PressedOnRelease, in which case the second release event won't be reported. -//------------------------------------------------------------------------------------------------------------------------------------------------ -// The behavior of the return-value changes when ImGuiButtonFlags_Repeat is set: -// Repeat+ Repeat+ Repeat+ Repeat+ -// PressedOnClickRelease PressedOnClick PressedOnRelease PressedOnDoubleClick -//------------------------------------------------------------------------------------------------------------------------------------------------- -// Frame N+0 (mouse button is down) - true - true -// ... - - - - -// Frame N + RepeatDelay true true - true -// ... - - - - -// Frame N + RepeatDelay + RepeatRate*N true true - true -//------------------------------------------------------------------------------------------------------------------------------------------------- - -bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - // Default only reacts to left mouse button - if ((flags & ImGuiButtonFlags_MouseButtonMask_) == 0) - flags |= ImGuiButtonFlags_MouseButtonDefault_; - - // Default behavior requires click + release inside bounding box - if ((flags & ImGuiButtonFlags_PressedOnMask_) == 0) - flags |= ImGuiButtonFlags_PressedOnDefault_; - - ImGuiWindow* backup_hovered_window = g.HoveredWindow; - const bool flatten_hovered_children = (flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredWindow && g.HoveredWindow->RootWindow == window; - if (flatten_hovered_children) - g.HoveredWindow = window; - -#ifdef IMGUI_ENABLE_TEST_ENGINE - if (id != 0 && g.LastItemData.ID != id) - IMGUI_TEST_ENGINE_ITEM_ADD(bb, id); -#endif - - bool pressed = false; - bool hovered = ItemHoverable(bb, id); - - // Drag source doesn't report as hovered - if (hovered && g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover)) - hovered = false; - - // Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button - if (g.DragDropActive && (flags & ImGuiButtonFlags_PressedOnDragDropHold) && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) - if (IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) - { - hovered = true; - SetHoveredID(id); - if (g.HoveredIdTimer - g.IO.DeltaTime <= DRAGDROP_HOLD_TO_OPEN_TIMER && g.HoveredIdTimer >= DRAGDROP_HOLD_TO_OPEN_TIMER) - { - pressed = true; - g.DragDropHoldJustPressedId = id; - FocusWindow(window); - } - } - - if (flatten_hovered_children) - g.HoveredWindow = backup_hovered_window; - - // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. - if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) - hovered = false; - - // Mouse handling - if (hovered) - { - if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt)) - { - // Poll buttons - int mouse_button_clicked = -1; - if ((flags & ImGuiButtonFlags_MouseButtonLeft) && g.IO.MouseClicked[0]) { mouse_button_clicked = 0; } - else if ((flags & ImGuiButtonFlags_MouseButtonRight) && g.IO.MouseClicked[1]) { mouse_button_clicked = 1; } - else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && g.IO.MouseClicked[2]) { mouse_button_clicked = 2; } - - if (mouse_button_clicked != -1 && g.ActiveId != id) - { - if (flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere)) - { - SetActiveID(id, window); - g.ActiveIdMouseButton = mouse_button_clicked; - if (!(flags & ImGuiButtonFlags_NoNavFocus)) - SetFocusID(id, window); - FocusWindow(window); - } - if ((flags & ImGuiButtonFlags_PressedOnClick) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseClickedCount[mouse_button_clicked] == 2)) - { - pressed = true; - if (flags & ImGuiButtonFlags_NoHoldingActiveId) - ClearActiveID(); - else - SetActiveID(id, window); // Hold on ID - if (!(flags & ImGuiButtonFlags_NoNavFocus)) - SetFocusID(id, window); - g.ActiveIdMouseButton = mouse_button_clicked; - FocusWindow(window); - } - } - if (flags & ImGuiButtonFlags_PressedOnRelease) - { - int mouse_button_released = -1; - if ((flags & ImGuiButtonFlags_MouseButtonLeft) && g.IO.MouseReleased[0]) { mouse_button_released = 0; } - else if ((flags & ImGuiButtonFlags_MouseButtonRight) && g.IO.MouseReleased[1]) { mouse_button_released = 1; } - else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && g.IO.MouseReleased[2]) { mouse_button_released = 2; } - if (mouse_button_released != -1) - { - const bool has_repeated_at_least_once = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior - if (!has_repeated_at_least_once) - pressed = true; - if (!(flags & ImGuiButtonFlags_NoNavFocus)) - SetFocusID(id, window); - ClearActiveID(); - } - } - - // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). - // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. - if (g.ActiveId == id && (flags & ImGuiButtonFlags_Repeat)) - if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, true)) - pressed = true; - } - - if (pressed) - g.NavDisableHighlight = true; - } - - // Gamepad/Keyboard navigation - // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse. - if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId)) - if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus)) - hovered = true; - if (g.NavActivateDownId == id) - { - bool nav_activated_by_code = (g.NavActivateId == id); - bool nav_activated_by_inputs = (g.NavActivatePressedId == id); - if (!nav_activated_by_inputs && (flags & ImGuiButtonFlags_Repeat)) - { - // Avoid pressing both keys from triggering double amount of repeat events - const ImGuiKeyData* key1 = GetKeyData(ImGuiKey_Space); - const ImGuiKeyData* key2 = GetKeyData(ImGuiKey_NavGamepadActivate); - const float t1 = ImMax(key1->DownDuration, key2->DownDuration); - nav_activated_by_inputs = CalcTypematicRepeatAmount(t1 - g.IO.DeltaTime, t1, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0; - } - if (nav_activated_by_code || nav_activated_by_inputs) - { - // Set active id so it can be queried by user via IsItemActive(), equivalent of holding the mouse button. - pressed = true; - SetActiveID(id, window); - g.ActiveIdSource = ImGuiInputSource_Nav; - if (!(flags & ImGuiButtonFlags_NoNavFocus)) - SetFocusID(id, window); - } - } - - // Process while held - bool held = false; - if (g.ActiveId == id) - { - if (g.ActiveIdSource == ImGuiInputSource_Mouse) - { - if (g.ActiveIdIsJustActivated) - g.ActiveIdClickOffset = g.IO.MousePos - bb.Min; - - const int mouse_button = g.ActiveIdMouseButton; - IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT); - if (g.IO.MouseDown[mouse_button]) - { - held = true; - } - else - { - bool release_in = hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease) != 0; - bool release_anywhere = (flags & ImGuiButtonFlags_PressedOnClickReleaseAnywhere) != 0; - if ((release_in || release_anywhere) && !g.DragDropActive) - { - // Report as pressed when releasing the mouse (this is the most common path) - bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseReleased[mouse_button] && g.IO.MouseClickedLastCount[mouse_button] == 2; - bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps - if (!is_double_click_release && !is_repeating_already) - pressed = true; - } - ClearActiveID(); - } - if (!(flags & ImGuiButtonFlags_NoNavFocus)) - g.NavDisableHighlight = true; - } - else if (g.ActiveIdSource == ImGuiInputSource_Nav) - { - // When activated using Nav, we hold on the ActiveID until activation button is released - if (g.NavActivateDownId != id) - ClearActiveID(); - } - if (pressed) - g.ActiveIdHasBeenPressedBefore = true; - } - - if (out_hovered) *out_hovered = hovered; - if (out_held) *out_held = held; - - return pressed; -} - -bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - ImVec2 pos = window->DC.CursorPos; - if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag) - pos.y += window->DC.CurrLineTextBaseOffset - style.FramePadding.y; - ImVec2 size = CalcItemSize(size_arg, label_size.x + style.FramePadding.x * 2.0f, label_size.y + style.FramePadding.y * 2.0f); - - const ImRect bb(pos, pos + size); - ItemSize(size, style.FramePadding.y); - if (!ItemAdd(bb, id)) - return false; - - if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) - flags |= ImGuiButtonFlags_Repeat; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); - - // Render - const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); - RenderNavHighlight(bb, id); - RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); - - if (g.LogEnabled) - LogSetNextTextDecoration("[", "]"); - RenderTextClipped(bb.Min + style.FramePadding, bb.Max - style.FramePadding, label, NULL, &label_size, style.ButtonTextAlign, &bb); - - // Automatically close popups - //if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup)) - // CloseCurrentPopup(); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); - return pressed; -} - -bool ImGui::Button(const char* label, const ImVec2& size_arg) -{ - return ButtonEx(label, size_arg, ImGuiButtonFlags_None); -} - -// Small buttons fits within text without additional vertical spacing. -bool ImGui::SmallButton(const char* label) -{ - ImGuiContext& g = *GImGui; - float backup_padding_y = g.Style.FramePadding.y; - g.Style.FramePadding.y = 0.0f; - bool pressed = ButtonEx(label, ImVec2(0, 0), ImGuiButtonFlags_AlignTextBaseLine); - g.Style.FramePadding.y = backup_padding_y; - return pressed; -} - -// Tip: use ImGui::PushID()/PopID() to push indices or pointers in the ID stack. -// Then you can keep 'str_id' empty or the same for all your buttons (instead of creating a string based on a non-string id) -bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg, ImGuiButtonFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - // Cannot use zero-size for InvisibleButton(). Unlike Button() there is not way to fallback using the label size. - IM_ASSERT(size_arg.x != 0.0f && size_arg.y != 0.0f); - - const ImGuiID id = window->GetID(str_id); - ImVec2 size = CalcItemSize(size_arg, 0.0f, 0.0f); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - ItemSize(size); - if (!ItemAdd(bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags); - return pressed; -} - -bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiButtonFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - const ImGuiID id = window->GetID(str_id); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - const float default_size = GetFrameHeight(); - ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : -1.0f); - if (!ItemAdd(bb, id)) - return false; - - if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) - flags |= ImGuiButtonFlags_Repeat; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); - - // Render - const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); - const ImU32 text_col = GetColorU32(ImGuiCol_Text); - RenderNavHighlight(bb, id); - RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding); - RenderArrow(window->DrawList, bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), text_col, dir); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags); - return pressed; -} - -bool ImGui::ArrowButton(const char* str_id, ImGuiDir dir) -{ - float sz = GetFrameHeight(); - return ArrowButtonEx(str_id, dir, ImVec2(sz, sz), ImGuiButtonFlags_None); -} - -// Button to close a window -bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Tweak 1: Shrink hit-testing area if button covers an abnormally large proportion of the visible region. That's in order to facilitate moving the window away. (#3825) - // This may better be applied as a general hit-rect reduction mechanism for all widgets to ensure the area to move window is always accessible? - const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); - ImRect bb_interact = bb; - const float area_to_visible_ratio = window->OuterRectClipped.GetArea() / bb.GetArea(); - if (area_to_visible_ratio < 1.5f) - bb_interact.Expand(ImFloor(bb_interact.GetSize() * -0.25f)); - - // Tweak 2: We intentionally allow interaction when clipped so that a mechanical Alt,Right,Activate sequence can always close a window. - // (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible). - bool is_clipped = !ItemAdd(bb_interact, id); - - bool hovered, held; - bool pressed = ButtonBehavior(bb_interact, id, &hovered, &held); - if (is_clipped) - return pressed; - - // Render - // FIXME: Clarify this mess - ImU32 col = GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered); - ImVec2 center = bb.GetCenter(); - if (hovered) - window->DrawList->AddCircleFilled(center, ImMax(2.0f, g.FontSize * 0.5f + 1.0f), col, 12); - - float cross_extent = g.FontSize * 0.5f * 0.7071f - 1.0f; - ImU32 cross_col = GetColorU32(ImGuiCol_Text); - center -= ImVec2(0.5f, 0.5f); - window->DrawList->AddLine(center + ImVec2(+cross_extent, +cross_extent), center + ImVec2(-cross_extent, -cross_extent), cross_col, 1.0f); - window->DrawList->AddLine(center + ImVec2(+cross_extent, -cross_extent), center + ImVec2(-cross_extent, +cross_extent), cross_col, 1.0f); - - return pressed; -} - -bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); - ItemAdd(bb, id); - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None); - - // Render - ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); - ImU32 text_col = GetColorU32(ImGuiCol_Text); - if (hovered || held) - window->DrawList->AddCircleFilled(bb.GetCenter()/*+ ImVec2(0.0f, -0.5f)*/, g.FontSize * 0.5f + 1.0f, bg_col, 12); - RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); - - // Switch to moving the window after mouse is moved beyond the initial drag threshold - if (IsItemActive() && IsMouseDragging(0)) - StartMouseMovingWindow(window); - - return pressed; -} - -ImGuiID ImGui::GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis) -{ - return window->GetID(axis == ImGuiAxis_X ? "#SCROLLX" : "#SCROLLY"); -} - -// Return scrollbar rectangle, must only be called for corresponding axis if window->ScrollbarX/Y is set. -ImRect ImGui::GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis) -{ - const ImRect outer_rect = window->Rect(); - const ImRect inner_rect = window->InnerRect; - const float border_size = window->WindowBorderSize; - const float scrollbar_size = window->ScrollbarSizes[axis ^ 1]; // (ScrollbarSizes.x = width of Y scrollbar; ScrollbarSizes.y = height of X scrollbar) - IM_ASSERT(scrollbar_size > 0.0f); - if (axis == ImGuiAxis_X) - return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x, outer_rect.Max.y); - else - return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x, inner_rect.Max.y); -} - -void ImGui::Scrollbar(ImGuiAxis axis) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const ImGuiID id = GetWindowScrollbarID(window, axis); - - // Calculate scrollbar bounding box - ImRect bb = GetWindowScrollbarRect(window, axis); - ImDrawFlags rounding_corners = ImDrawFlags_RoundCornersNone; - if (axis == ImGuiAxis_X) - { - rounding_corners |= ImDrawFlags_RoundCornersBottomLeft; - if (!window->ScrollbarY) - rounding_corners |= ImDrawFlags_RoundCornersBottomRight; - } - else - { - if ((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) - rounding_corners |= ImDrawFlags_RoundCornersTopRight; - if (!window->ScrollbarX) - rounding_corners |= ImDrawFlags_RoundCornersBottomRight; - } - float size_avail = window->InnerRect.Max[axis] - window->InnerRect.Min[axis]; - float size_contents = window->ContentSize[axis] + window->WindowPadding[axis] * 2.0f; - ImS64 scroll = (ImS64)window->Scroll[axis]; - ScrollbarEx(bb, id, axis, &scroll, (ImS64)size_avail, (ImS64)size_contents, rounding_corners); - window->Scroll[axis] = (float)scroll; -} - -// Vertical/Horizontal scrollbar -// The entire piece of code below is rather confusing because: -// - We handle absolute seeking (when first clicking outside the grab) and relative manipulation (afterward or when clicking inside the grab) -// - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar -// - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal. -// Still, the code should probably be made simpler.. -bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 size_avail_v, ImS64 size_contents_v, ImDrawFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - - KeepAliveID(id); - - const float bb_frame_width = bb_frame.GetWidth(); - const float bb_frame_height = bb_frame.GetHeight(); - if (bb_frame_width <= 0.0f || bb_frame_height <= 0.0f) - return false; - - // When we are too small, start hiding and disabling the grab (this reduce visual noise on very small window and facilitate using the window resize grab) - float alpha = 1.0f; - if ((axis == ImGuiAxis_Y) && bb_frame_height < g.FontSize + g.Style.FramePadding.y * 2.0f) - alpha = ImSaturate((bb_frame_height - g.FontSize) / (g.Style.FramePadding.y * 2.0f)); - if (alpha <= 0.0f) - return false; - - const ImGuiStyle& style = g.Style; - const bool allow_interaction = (alpha >= 1.0f); - - ImRect bb = bb_frame; - bb.Expand(ImVec2(-ImClamp(IM_FLOOR((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_FLOOR((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f))); - - // V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar) - const float scrollbar_size_v = (axis == ImGuiAxis_X) ? bb.GetWidth() : bb.GetHeight(); - - // Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount) - // But we maintain a minimum size in pixel to allow for the user to still aim inside. - IM_ASSERT(ImMax(size_contents_v, size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers. - const ImS64 win_size_v = ImMax(ImMax(size_contents_v, size_avail_v), (ImS64)1); - const float grab_h_pixels = ImClamp(scrollbar_size_v * ((float)size_avail_v / (float)win_size_v), style.GrabMinSize, scrollbar_size_v); - const float grab_h_norm = grab_h_pixels / scrollbar_size_v; - - // Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar(). - bool held = false; - bool hovered = false; - ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_NoNavFocus); - - const ImS64 scroll_max = ImMax((ImS64)1, size_contents_v - size_avail_v); - float scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); - float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; // Grab position in normalized space - if (held && allow_interaction && grab_h_norm < 1.0f) - { - const float scrollbar_pos_v = bb.Min[axis]; - const float mouse_pos_v = g.IO.MousePos[axis]; - - // Click position in scrollbar normalized space (0.0f->1.0f) - const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v); - SetHoveredID(id); - - bool seek_absolute = false; - if (g.ActiveIdIsJustActivated) - { - // On initial click calculate the distance between mouse and the center of the grab - seek_absolute = (clicked_v_norm < grab_v_norm || clicked_v_norm > grab_v_norm + grab_h_norm); - if (seek_absolute) - g.ScrollbarClickDeltaToGrabCenter = 0.0f; - else - g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; - } - - // Apply scroll (p_scroll_v will generally point on one member of window->Scroll) - // It is ok to modify Scroll here because we are being called in Begin() after the calculation of ContentSize and before setting up our starting position - const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm)); - *p_scroll_v = (ImS64)(scroll_v_norm * scroll_max); - - // Update values for rendering - scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); - grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; - - // Update distance to grab now that we have seeked and saturated - if (seek_absolute) - g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; - } - - // Render - const ImU32 bg_col = GetColorU32(ImGuiCol_ScrollbarBg); - const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab, alpha); - window->DrawList->AddRectFilled(bb_frame.Min, bb_frame.Max, bg_col, window->WindowRounding, flags); - ImRect grab_rect; - if (axis == ImGuiAxis_X) - grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, bb.Max.y); - else - grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels); - window->DrawList->AddRectFilled(grab_rect.Min, grab_rect.Max, grab_col, style.ScrollbarRounding); - - return held; -} - -void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - if (border_col.w > 0.0f) - bb.Max += ImVec2(2, 2); - ItemSize(bb); - if (!ItemAdd(bb, 0)) - return; - - if (border_col.w > 0.0f) - { - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f); - window->DrawList->AddImage(user_texture_id, bb.Min + ImVec2(1, 1), bb.Max - ImVec2(1, 1), uv0, uv1, GetColorU32(tint_col)); - } - else - { - window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col)); - } -} - -// ImageButton() is flawed as 'id' is always derived from 'texture_id' (see #2464 #1390) -// We provide this internal helper to write your own variant while we figure out how to redesign the public ImageButton() API. -bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2); - ItemSize(bb); - if (!ItemAdd(bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); - - // Render - const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); - RenderNavHighlight(bb, id); - RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, g.Style.FrameRounding)); - if (bg_col.w > 0.0f) - window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, GetColorU32(bg_col)); - window->DrawList->AddImage(texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col)); - - return pressed; -} - -// frame_padding < 0: uses FramePadding from style (default) -// frame_padding = 0: no framing -// frame_padding > 0: set framing size -bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - - // Default to using texture ID as ID. User can still push string/integer prefixes. - PushID((void*)(intptr_t)user_texture_id); - const ImGuiID id = window->GetID("#image"); - PopID(); - - const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : g.Style.FramePadding; - return ImageButtonEx(id, user_texture_id, size, uv0, uv1, padding, bg_col, tint_col); -} - -bool ImGui::Checkbox(const char* label, bool* v) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - const float square_sz = GetFrameHeight(); - const ImVec2 pos = window->DC.CursorPos; - const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, id)) - { - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); - return false; - } - - bool hovered, held; - bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); - if (pressed) - { - *v = !(*v); - MarkItemEdited(id); - } - - const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); - RenderNavHighlight(total_bb, id); - RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding); - ImU32 check_col = GetColorU32(ImGuiCol_CheckMark); - bool mixed_value = (g.LastItemData.InFlags & ImGuiItemFlags_MixedValue) != 0; - if (mixed_value) - { - // Undocumented tristate/mixed/indeterminate checkbox (#2644) - // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox) - ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f))); - window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); - } - else if (*v) - { - const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); - RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); - } - - ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); - if (g.LogEnabled) - LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]"); - if (label_size.x > 0.0f) - RenderText(label_pos, label); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); - return pressed; -} - -template -bool ImGui::CheckboxFlagsT(const char* label, T* flags, T flags_value) -{ - bool all_on = (*flags & flags_value) == flags_value; - bool any_on = (*flags & flags_value) != 0; - bool pressed; - if (!all_on && any_on) - { - ImGuiContext& g = *GImGui; - ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; - g.CurrentItemFlags |= ImGuiItemFlags_MixedValue; - pressed = Checkbox(label, &all_on); - g.CurrentItemFlags = backup_item_flags; - } - else - { - pressed = Checkbox(label, &all_on); - - } - if (pressed) - { - if (all_on) - *flags |= flags_value; - else - *flags &= ~flags_value; - } - return pressed; -} - -bool ImGui::CheckboxFlags(const char* label, int* flags, int flags_value) -{ - return CheckboxFlagsT(label, flags, flags_value); -} - -bool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value) -{ - return CheckboxFlagsT(label, flags, flags_value); -} - -bool ImGui::CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value) -{ - return CheckboxFlagsT(label, flags, flags_value); -} - -bool ImGui::CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value) -{ - return CheckboxFlagsT(label, flags, flags_value); -} - -bool ImGui::RadioButton(const char* label, bool active) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - const float square_sz = GetFrameHeight(); - const ImVec2 pos = window->DC.CursorPos; - const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); - const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, id)) - return false; - - ImVec2 center = check_bb.GetCenter(); - center.x = IM_ROUND(center.x); - center.y = IM_ROUND(center.y); - const float radius = (square_sz - 1.0f) * 0.5f; - - bool hovered, held; - bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); - if (pressed) - MarkItemEdited(id); - - RenderNavHighlight(total_bb, id); - window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16); - if (active) - { - const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); - window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark), 16); - } - - if (style.FrameBorderSize > 0.0f) - { - window->DrawList->AddCircle(center + ImVec2(1, 1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize); - window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize); - } - - ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); - if (g.LogEnabled) - LogRenderedText(&label_pos, active ? "(x)" : "( )"); - if (label_size.x > 0.0f) - RenderText(label_pos, label); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); - return pressed; -} - -// FIXME: This would work nicely if it was a public template, e.g. 'template RadioButton(const char* label, T* v, T v_button)', but I'm not sure how we would expose it.. -bool ImGui::RadioButton(const char* label, int* v, int v_button) -{ - const bool pressed = RadioButton(label, *v == v_button); - if (pressed) - *v = v_button; - return pressed; -} - -// size_arg (for each axis) < 0.0f: align to end, 0.0f: auto, > 0.0f: specified size -void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* overlay) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - ImVec2 pos = window->DC.CursorPos; - ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y * 2.0f); - ImRect bb(pos, pos + size); - ItemSize(size, style.FramePadding.y); - if (!ItemAdd(bb, 0)) - return; - - // Render - fraction = ImSaturate(fraction); - RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize)); - const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y); - RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding); - - // Default displaying the fraction as percentage string, but user can override it - char overlay_buf[32]; - if (!overlay) - { - ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f); - overlay = overlay_buf; - } - - ImVec2 overlay_size = CalcTextSize(overlay, NULL); - if (overlay_size.x > 0.0f) - RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb); -} - -void ImGui::Bullet() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const float line_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), g.FontSize); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height)); - ItemSize(bb); - if (!ItemAdd(bb, 0)) - { - SameLine(0, style.FramePadding.x * 2); - return; - } - - // Render and stay on same line - ImU32 text_col = GetColorU32(ImGuiCol_Text); - RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize * 0.5f, line_height * 0.5f), text_col); - SameLine(0, style.FramePadding.x * 2.0f); -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: Low-level Layout helpers -//------------------------------------------------------------------------- -// - Spacing() -// - Dummy() -// - NewLine() -// - AlignTextToFramePadding() -// - SeparatorEx() [Internal] -// - Separator() -// - SplitterBehavior() [Internal] -// - ShrinkWidths() [Internal] -//------------------------------------------------------------------------- - -void ImGui::Spacing() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - ItemSize(ImVec2(0, 0)); -} - -void ImGui::Dummy(const ImVec2& size) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - ItemSize(size); - ItemAdd(bb, 0); -} - -void ImGui::NewLine() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - const ImGuiLayoutType backup_layout_type = window->DC.LayoutType; - window->DC.LayoutType = ImGuiLayoutType_Vertical; - window->DC.IsSameLine = false; - if (window->DC.CurrLineSize.y > 0.0f) // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height. - ItemSize(ImVec2(0, 0)); - else - ItemSize(ImVec2(0.0f, g.FontSize)); - window->DC.LayoutType = backup_layout_type; -} - -void ImGui::AlignTextToFramePadding() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - window->DC.CurrLineSize.y = ImMax(window->DC.CurrLineSize.y, g.FontSize + g.Style.FramePadding.y * 2); - window->DC.CurrLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, g.Style.FramePadding.y); -} - -// Horizontal/vertical separating line -void ImGui::SeparatorEx(ImGuiSeparatorFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiContext& g = *GImGui; - IM_ASSERT(ImIsPowerOfTwo(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical))); // Check that only 1 option is selected - - float thickness_draw = 1.0f; - float thickness_layout = 0.0f; - if (flags & ImGuiSeparatorFlags_Vertical) - { - // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout. - float y1 = window->DC.CursorPos.y; - float y2 = window->DC.CursorPos.y + window->DC.CurrLineSize.y; - const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + thickness_draw, y2)); - ItemSize(ImVec2(thickness_layout, 0.0f)); - if (!ItemAdd(bb, 0)) - return; - - // Draw - window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator)); - if (g.LogEnabled) - LogText(" |"); - } - else if (flags & ImGuiSeparatorFlags_Horizontal) - { - // Horizontal Separator - float x1 = window->Pos.x; - float x2 = window->Pos.x + window->Size.x; - - // FIXME-WORKRECT: old hack (#205) until we decide of consistent behavior with WorkRect/Indent and Separator - if (g.GroupStack.Size > 0 && g.GroupStack.back().WindowID == window->ID) - x1 += window->DC.Indent.x; - - // FIXME-WORKRECT: In theory we should simply be using WorkRect.Min.x/Max.x everywhere but it isn't aesthetically what we want, - // need to introduce a variant of WorkRect for that purpose. (#4787) - if (ImGuiTable* table = g.CurrentTable) - { - x1 = table->Columns[table->CurrentColumn].MinX; - x2 = table->Columns[table->CurrentColumn].MaxX; - } - - ImGuiOldColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL; - if (columns) - PushColumnsBackground(); - - // We don't provide our width to the layout so that it doesn't get feed back into AutoFit - // FIXME: This prevents ->CursorMaxPos based bounding box evaluation from working (e.g. TableEndCell) - const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y + thickness_draw)); - ItemSize(ImVec2(0.0f, thickness_layout)); - const bool item_visible = ItemAdd(bb, 0); - if (item_visible) - { - // Draw - window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x, bb.Min.y), GetColorU32(ImGuiCol_Separator)); - if (g.LogEnabled) - LogRenderedText(&bb.Min, "--------------------------------\n"); - - } - if (columns) - { - PopColumnsBackground(); - columns->LineMinY = window->DC.CursorPos.y; - } - } -} - -void ImGui::Separator() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - // Those flags should eventually be overridable by the user - ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal; - flags |= ImGuiSeparatorFlags_SpanAllColumns; // NB: this only applies to legacy Columns() api as they relied on Separator() a lot. - SeparatorEx(flags); -} - -// Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise. -bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend, float hover_visibility_delay) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - const ImGuiItemFlags item_flags_backup = g.CurrentItemFlags; - g.CurrentItemFlags |= ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus; - bool item_add = ItemAdd(bb, id); - g.CurrentItemFlags = item_flags_backup; - if (!item_add) - return false; - - bool hovered, held; - ImRect bb_interact = bb; - bb_interact.Expand(axis == ImGuiAxis_Y ? ImVec2(0.0f, hover_extend) : ImVec2(hover_extend, 0.0f)); - ButtonBehavior(bb_interact, id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap); - if (hovered) - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; // for IsItemHovered(), because bb_interact is larger than bb - if (g.ActiveId != id) - SetItemAllowOverlap(); - - if (held || (hovered && g.HoveredIdPreviousFrame == id && g.HoveredIdTimer >= hover_visibility_delay)) - SetMouseCursor(axis == ImGuiAxis_Y ? ImGuiMouseCursor_ResizeNS : ImGuiMouseCursor_ResizeEW); - - ImRect bb_render = bb; - if (held) - { - ImVec2 mouse_delta_2d = g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min; - float mouse_delta = (axis == ImGuiAxis_Y) ? mouse_delta_2d.y : mouse_delta_2d.x; - - // Minimum pane size - float size_1_maximum_delta = ImMax(0.0f, *size1 - min_size1); - float size_2_maximum_delta = ImMax(0.0f, *size2 - min_size2); - if (mouse_delta < -size_1_maximum_delta) - mouse_delta = -size_1_maximum_delta; - if (mouse_delta > size_2_maximum_delta) - mouse_delta = size_2_maximum_delta; - - // Apply resize - if (mouse_delta != 0.0f) - { - if (mouse_delta < 0.0f) - IM_ASSERT(*size1 + mouse_delta >= min_size1); - if (mouse_delta > 0.0f) - IM_ASSERT(*size2 - mouse_delta >= min_size2); - *size1 += mouse_delta; - *size2 -= mouse_delta; - bb_render.Translate((axis == ImGuiAxis_X) ? ImVec2(mouse_delta, 0.0f) : ImVec2(0.0f, mouse_delta)); - MarkItemEdited(id); - } - } - - // Render - const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : (hovered && g.HoveredIdTimer >= hover_visibility_delay) ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); - window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, 0.0f); - - return held; -} - -static int IMGUI_CDECL ShrinkWidthItemComparer(const void* lhs, const void* rhs) -{ - const ImGuiShrinkWidthItem* a = (const ImGuiShrinkWidthItem*)lhs; - const ImGuiShrinkWidthItem* b = (const ImGuiShrinkWidthItem*)rhs; - if (int d = (int)(b->Width - a->Width)) - return d; - return (b->Index - a->Index); -} - -// Shrink excess width from a set of item, by removing width from the larger items first. -// Set items Width to -1.0f to disable shrinking this item. -void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess) -{ - if (count == 1) - { - if (items[0].Width >= 0.0f) - items[0].Width = ImMax(items[0].Width - width_excess, 1.0f); - return; - } - ImQsort(items, (size_t)count, sizeof(ImGuiShrinkWidthItem), ShrinkWidthItemComparer); - int count_same_width = 1; - while (width_excess > 0.0f && count_same_width < count) - { - while (count_same_width < count && items[0].Width <= items[count_same_width].Width) - count_same_width++; - float max_width_to_remove_per_item = (count_same_width < count && items[count_same_width].Width >= 0.0f) ? (items[0].Width - items[count_same_width].Width) : (items[0].Width - 1.0f); - if (max_width_to_remove_per_item <= 0.0f) - break; - float width_to_remove_per_item = ImMin(width_excess / count_same_width, max_width_to_remove_per_item); - for (int item_n = 0; item_n < count_same_width; item_n++) - items[item_n].Width -= width_to_remove_per_item; - width_excess -= width_to_remove_per_item * count_same_width; - } - - // Round width and redistribute remainder - // Ensure that e.g. the right-most tab of a shrunk tab-bar always reaches exactly at the same distance from the right-most edge of the tab bar separator. - width_excess = 0.0f; - for (int n = 0; n < count; n++) - { - float width_rounded = ImFloor(items[n].Width); - width_excess += items[n].Width - width_rounded; - items[n].Width = width_rounded; - } - while (width_excess > 0.0f) - for (int n = 0; n < count; n++) - if (items[n].Width + 1.0f <= items[n].InitialWidth) - { - items[n].Width += 1.0f; - width_excess -= 1.0f; - } -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: ComboBox -//------------------------------------------------------------------------- -// - CalcMaxPopupHeightFromItemCount() [Internal] -// - BeginCombo() -// - BeginComboPopup() [Internal] -// - EndCombo() -// - BeginComboPreview() [Internal] -// - EndComboPreview() [Internal] -// - Combo() -//------------------------------------------------------------------------- - -static float CalcMaxPopupHeightFromItemCount(int items_count) -{ - ImGuiContext& g = *GImGui; - if (items_count <= 0) - return FLT_MAX; - return (g.FontSize + g.Style.ItemSpacing.y) * items_count - g.Style.ItemSpacing.y + (g.Style.WindowPadding.y * 2); -} - -bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - - ImGuiNextWindowDataFlags backup_next_window_data_flags = g.NextWindowData.Flags; - g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values - if (window->SkipItems) - return false; - - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - IM_ASSERT((flags & (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)) != (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)); // Can't use both flags together - - const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight(); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : CalcItemWidth(); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); - const ImRect total_bb(bb.Min, bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, id, &bb)) - return false; - - // Open on click - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); - const ImGuiID popup_id = ImHashStr("##ComboPopup", 0, id); - bool popup_open = IsPopupOpen(popup_id, ImGuiPopupFlags_None); - if (pressed && !popup_open) - { - OpenPopupEx(popup_id, ImGuiPopupFlags_None); - popup_open = true; - } - - // Render shape - const ImU32 frame_col = GetColorU32(hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); - const float value_x2 = ImMax(bb.Min.x, bb.Max.x - arrow_size); - RenderNavHighlight(bb, id); - if (!(flags & ImGuiComboFlags_NoPreview)) - window->DrawList->AddRectFilled(bb.Min, ImVec2(value_x2, bb.Max.y), frame_col, style.FrameRounding, (flags & ImGuiComboFlags_NoArrowButton) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersLeft); - if (!(flags & ImGuiComboFlags_NoArrowButton)) - { - ImU32 bg_col = GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button); - ImU32 text_col = GetColorU32(ImGuiCol_Text); - window->DrawList->AddRectFilled(ImVec2(value_x2, bb.Min.y), bb.Max, bg_col, style.FrameRounding, (w <= arrow_size) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersRight); - if (value_x2 + arrow_size - style.FramePadding.x <= bb.Max.x) - RenderArrow(window->DrawList, ImVec2(value_x2 + style.FramePadding.y, bb.Min.y + style.FramePadding.y), text_col, ImGuiDir_Down, 1.0f); - } - RenderFrameBorder(bb.Min, bb.Max, style.FrameRounding); - - // Custom preview - if (flags & ImGuiComboFlags_CustomPreview) - { - g.ComboPreviewData.PreviewRect = ImRect(bb.Min.x, bb.Min.y, value_x2, bb.Max.y); - IM_ASSERT(preview_value == NULL || preview_value[0] == 0); - preview_value = NULL; - } - - // Render preview and label - if (preview_value != NULL && !(flags & ImGuiComboFlags_NoPreview)) - { - if (g.LogEnabled) - LogSetNextTextDecoration("{", "}"); - RenderTextClipped(bb.Min + style.FramePadding, ImVec2(value_x2, bb.Max.y), preview_value, NULL, NULL); - } - if (label_size.x > 0) - RenderText(ImVec2(bb.Max.x + style.ItemInnerSpacing.x, bb.Min.y + style.FramePadding.y), label); - - if (!popup_open) - return false; - - g.NextWindowData.Flags = backup_next_window_data_flags; - return BeginComboPopup(popup_id, bb, flags); -} - -bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags) -{ - ImGuiContext& g = *GImGui; - if (!IsPopupOpen(popup_id, ImGuiPopupFlags_None)) - { - g.NextWindowData.ClearFlags(); - return false; - } - - // Set popup size - float w = bb.GetWidth(); - if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) - { - g.NextWindowData.SizeConstraintRect.Min.x = ImMax(g.NextWindowData.SizeConstraintRect.Min.x, w); - } - else - { - if ((flags & ImGuiComboFlags_HeightMask_) == 0) - flags |= ImGuiComboFlags_HeightRegular; - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiComboFlags_HeightMask_)); // Only one - int popup_max_height_in_items = -1; - if (flags & ImGuiComboFlags_HeightRegular) popup_max_height_in_items = 8; - else if (flags & ImGuiComboFlags_HeightSmall) popup_max_height_in_items = 4; - else if (flags & ImGuiComboFlags_HeightLarge) popup_max_height_in_items = 20; - SetNextWindowSizeConstraints(ImVec2(w, 0.0f), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items))); - } - - // This is essentially a specialized version of BeginPopupEx() - char name[16]; - ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth - - // Set position given a custom constraint (peak into expected window size so we can position it) - // FIXME: This might be easier to express with an hypothetical SetNextWindowPosConstraints() function? - // FIXME: This might be moved to Begin() or at least around the same spot where Tooltips and other Popups are calling FindBestWindowPosForPopupEx()? - if (ImGuiWindow* popup_window = FindWindowByName(name)) - if (popup_window->WasActive) - { - // Always override 'AutoPosLastDirection' to not leave a chance for a past value to affect us. - ImVec2 size_expected = CalcWindowNextAutoFitSize(popup_window); - popup_window->AutoPosLastDirection = (flags & ImGuiComboFlags_PopupAlignLeft) ? ImGuiDir_Left : ImGuiDir_Down; // Left = "Below, Toward Left", Down = "Below, Toward Right (default)" - ImRect r_outer = GetPopupAllowedExtentRect(popup_window); - ImVec2 pos = FindBestWindowPosForPopupEx(bb.GetBL(), size_expected, &popup_window->AutoPosLastDirection, r_outer, bb, ImGuiPopupPositionPolicy_ComboBox); - SetNextWindowPos(pos); - } - - // We don't use BeginPopupEx() solely because we have a custom name string, which we could make an argument to BeginPopupEx() - ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoMove; - PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(g.Style.FramePadding.x, g.Style.WindowPadding.y)); // Horizontally align ourselves with the framed text - bool ret = Begin(name, NULL, window_flags); - PopStyleVar(); - if (!ret) - { - EndPopup(); - IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above - return false; - } - return true; -} - -void ImGui::EndCombo() -{ - EndPopup(); -} - -// Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements -// (Experimental, see GitHub issues: #1658, #4168) -bool ImGui::BeginComboPreview() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiComboPreviewData* preview_data = &g.ComboPreviewData; - - if (window->SkipItems || !window->ClipRect.Overlaps(g.LastItemData.Rect)) // FIXME: Because we don't have a ImGuiItemStatusFlags_Visible flag to test last ItemAdd() result - return false; - IM_ASSERT(g.LastItemData.Rect.Min.x == preview_data->PreviewRect.Min.x && g.LastItemData.Rect.Min.y == preview_data->PreviewRect.Min.y); // Didn't call after BeginCombo/EndCombo block or forgot to pass ImGuiComboFlags_CustomPreview flag? - if (!window->ClipRect.Contains(preview_data->PreviewRect)) // Narrower test (optional) - return false; - - // FIXME: This could be contained in a PushWorkRect() api - preview_data->BackupCursorPos = window->DC.CursorPos; - preview_data->BackupCursorMaxPos = window->DC.CursorMaxPos; - preview_data->BackupCursorPosPrevLine = window->DC.CursorPosPrevLine; - preview_data->BackupPrevLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; - preview_data->BackupLayout = window->DC.LayoutType; - window->DC.CursorPos = preview_data->PreviewRect.Min + g.Style.FramePadding; - window->DC.CursorMaxPos = window->DC.CursorPos; - window->DC.LayoutType = ImGuiLayoutType_Horizontal; - window->DC.IsSameLine = false; - PushClipRect(preview_data->PreviewRect.Min, preview_data->PreviewRect.Max, true); - - return true; -} - -void ImGui::EndComboPreview() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiComboPreviewData* preview_data = &g.ComboPreviewData; - - // FIXME: Using CursorMaxPos approximation instead of correct AABB which we will store in ImDrawCmd in the future - ImDrawList* draw_list = window->DrawList; - if (window->DC.CursorMaxPos.x < preview_data->PreviewRect.Max.x && window->DC.CursorMaxPos.y < preview_data->PreviewRect.Max.y) - if (draw_list->CmdBuffer.Size > 1) // Unlikely case that the PushClipRect() didn't create a command - { - draw_list->_CmdHeader.ClipRect = draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ClipRect = draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 2].ClipRect; - draw_list->_TryMergeDrawCmds(); - } - PopClipRect(); - window->DC.CursorPos = preview_data->BackupCursorPos; - window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, preview_data->BackupCursorMaxPos); - window->DC.CursorPosPrevLine = preview_data->BackupCursorPosPrevLine; - window->DC.PrevLineTextBaseOffset = preview_data->BackupPrevLineTextBaseOffset; - window->DC.LayoutType = preview_data->BackupLayout; - window->DC.IsSameLine = false; - preview_data->PreviewRect = ImRect(); -} - -// Getter for the old Combo() API: const char*[] -static bool Items_ArrayGetter(void* data, int idx, const char** out_text) -{ - const char* const* items = (const char* const*)data; - if (out_text) - *out_text = items[idx]; - return true; -} - -// Getter for the old Combo() API: "item1\0item2\0item3\0" -static bool Items_SingleStringGetter(void* data, int idx, const char** out_text) -{ - // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited. - const char* items_separated_by_zeros = (const char*)data; - int items_count = 0; - const char* p = items_separated_by_zeros; - while (*p) - { - if (idx == items_count) - break; - p += strlen(p) + 1; - items_count++; - } - if (!*p) - return false; - if (out_text) - *out_text = p; - return true; -} - -// Old API, prefer using BeginCombo() nowadays if you can. -bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items) -{ - ImGuiContext& g = *GImGui; - - // Call the getter to obtain the preview string which is a parameter to BeginCombo() - const char* preview_value = NULL; - if (*current_item >= 0 && *current_item < items_count) - items_getter(data, *current_item, &preview_value); - - // The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here. - if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)) - SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items))); - - if (!BeginCombo(label, preview_value, ImGuiComboFlags_None)) - return false; - - // Display items - // FIXME-OPT: Use clipper (but we need to disable it on the appearing frame to make sure our call to SetItemDefaultFocus() is processed) - bool value_changed = false; - for (int i = 0; i < items_count; i++) - { - PushID(i); - const bool item_selected = (i == *current_item); - const char* item_text; - if (!items_getter(data, i, &item_text)) - item_text = "*Unknown item*"; - if (Selectable(item_text, item_selected)) - { - value_changed = true; - *current_item = i; - } - if (item_selected) - SetItemDefaultFocus(); - PopID(); - } - - EndCombo(); - - if (value_changed) - MarkItemEdited(g.LastItemData.ID); - - return value_changed; -} - -// Combo box helper allowing to pass an array of strings. -bool ImGui::Combo(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items) -{ - const bool value_changed = Combo(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_in_items); - return value_changed; -} - -// Combo box helper allowing to pass all items in a single string literal holding multiple zero-terminated items "item1\0item2\0" -bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items) -{ - int items_count = 0; - const char* p = items_separated_by_zeros; // FIXME-OPT: Avoid computing this, or at least only when combo is open - while (*p) - { - p += strlen(p) + 1; - items_count++; - } - bool value_changed = Combo(label, current_item, Items_SingleStringGetter, (void*)items_separated_by_zeros, items_count, height_in_items); - return value_changed; -} - -//------------------------------------------------------------------------- -// [SECTION] Data Type and Data Formatting Helpers [Internal] -//------------------------------------------------------------------------- -// - PatchFormatStringFloatToInt() -// - DataTypeGetInfo() -// - DataTypeFormatString() -// - DataTypeApplyOp() -// - DataTypeApplyOpFromText() -// - DataTypeCompare() -// - DataTypeClamp() -// - GetMinimumStepAtDecimalPrecision -// - RoundScalarWithFormat<>() -//------------------------------------------------------------------------- - -static const ImGuiDataTypeInfo GDataTypeInfo[] = -{ - { sizeof(char), "S8", "%d", "%d" }, // ImGuiDataType_S8 - { sizeof(unsigned char), "U8", "%u", "%u" }, - { sizeof(short), "S16", "%d", "%d" }, // ImGuiDataType_S16 - { sizeof(unsigned short), "U16", "%u", "%u" }, - { sizeof(int), "S32", "%d", "%d" }, // ImGuiDataType_S32 - { sizeof(unsigned int), "U32", "%u", "%u" }, -#ifdef _MSC_VER - { sizeof(ImS64), "S64", "%I64d","%I64d" }, // ImGuiDataType_S64 - { sizeof(ImU64), "U64", "%I64u","%I64u" }, -#else - { sizeof(ImS64), "S64", "%lld", "%lld" }, // ImGuiDataType_S64 - { sizeof(ImU64), "U64", "%llu", "%llu" }, -#endif - { sizeof(float), "float", "%.3f","%f" }, // ImGuiDataType_Float (float are promoted to double in va_arg) - { sizeof(double), "double","%f", "%lf" }, // ImGuiDataType_Double -}; -IM_STATIC_ASSERT(IM_ARRAYSIZE(GDataTypeInfo) == ImGuiDataType_COUNT); - -// FIXME-LEGACY: Prior to 1.61 our DragInt() function internally used floats and because of this the compile-time default value for format was "%.0f". -// Even though we changed the compile-time default, we expect users to have carried %f around, which would break the display of DragInt() calls. -// To honor backward compatibility we are rewriting the format string, unless IMGUI_DISABLE_OBSOLETE_FUNCTIONS is enabled. What could possibly go wrong?! -static const char* PatchFormatStringFloatToInt(const char* fmt) -{ - if (fmt[0] == '%' && fmt[1] == '.' && fmt[2] == '0' && fmt[3] == 'f' && fmt[4] == 0) // Fast legacy path for "%.0f" which is expected to be the most common case. - return "%d"; - const char* fmt_start = ImParseFormatFindStart(fmt); // Find % (if any, and ignore %%) - const char* fmt_end = ImParseFormatFindEnd(fmt_start); // Find end of format specifier, which itself is an exercise of confidence/recklessness (because snprintf is dependent on libc or user). - if (fmt_end > fmt_start && fmt_end[-1] == 'f') - { -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - if (fmt_start == fmt && fmt_end[0] == 0) - return "%d"; - const char* tmp_format; - ImFormatStringToTempBuffer(&tmp_format, NULL, "%.*s%%d%s", (int)(fmt_start - fmt), fmt, fmt_end); // Honor leading and trailing decorations, but lose alignment/precision. - return tmp_format; -#else - IM_ASSERT(0 && "DragInt(): Invalid format string!"); // Old versions used a default parameter of "%.0f", please replace with e.g. "%d" -#endif - } - return fmt; -} - -const ImGuiDataTypeInfo* ImGui::DataTypeGetInfo(ImGuiDataType data_type) -{ - IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT); - return &GDataTypeInfo[data_type]; -} - -int ImGui::DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format) -{ - // Signedness doesn't matter when pushing integer arguments - if (data_type == ImGuiDataType_S32 || data_type == ImGuiDataType_U32) - return ImFormatString(buf, buf_size, format, *(const ImU32*)p_data); - if (data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64) - return ImFormatString(buf, buf_size, format, *(const ImU64*)p_data); - if (data_type == ImGuiDataType_Float) - return ImFormatString(buf, buf_size, format, *(const float*)p_data); - if (data_type == ImGuiDataType_Double) - return ImFormatString(buf, buf_size, format, *(const double*)p_data); - if (data_type == ImGuiDataType_S8) - return ImFormatString(buf, buf_size, format, *(const ImS8*)p_data); - if (data_type == ImGuiDataType_U8) - return ImFormatString(buf, buf_size, format, *(const ImU8*)p_data); - if (data_type == ImGuiDataType_S16) - return ImFormatString(buf, buf_size, format, *(const ImS16*)p_data); - if (data_type == ImGuiDataType_U16) - return ImFormatString(buf, buf_size, format, *(const ImU16*)p_data); - IM_ASSERT(0); - return 0; -} - -void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg1, const void* arg2) -{ - IM_ASSERT(op == '+' || op == '-'); - switch (data_type) - { - case ImGuiDataType_S8: - if (op == '+') { *(ImS8*)output = ImAddClampOverflow(*(const ImS8*)arg1, *(const ImS8*)arg2, IM_S8_MIN, IM_S8_MAX); } - if (op == '-') { *(ImS8*)output = ImSubClampOverflow(*(const ImS8*)arg1, *(const ImS8*)arg2, IM_S8_MIN, IM_S8_MAX); } - return; - case ImGuiDataType_U8: - if (op == '+') { *(ImU8*)output = ImAddClampOverflow(*(const ImU8*)arg1, *(const ImU8*)arg2, IM_U8_MIN, IM_U8_MAX); } - if (op == '-') { *(ImU8*)output = ImSubClampOverflow(*(const ImU8*)arg1, *(const ImU8*)arg2, IM_U8_MIN, IM_U8_MAX); } - return; - case ImGuiDataType_S16: - if (op == '+') { *(ImS16*)output = ImAddClampOverflow(*(const ImS16*)arg1, *(const ImS16*)arg2, IM_S16_MIN, IM_S16_MAX); } - if (op == '-') { *(ImS16*)output = ImSubClampOverflow(*(const ImS16*)arg1, *(const ImS16*)arg2, IM_S16_MIN, IM_S16_MAX); } - return; - case ImGuiDataType_U16: - if (op == '+') { *(ImU16*)output = ImAddClampOverflow(*(const ImU16*)arg1, *(const ImU16*)arg2, IM_U16_MIN, IM_U16_MAX); } - if (op == '-') { *(ImU16*)output = ImSubClampOverflow(*(const ImU16*)arg1, *(const ImU16*)arg2, IM_U16_MIN, IM_U16_MAX); } - return; - case ImGuiDataType_S32: - if (op == '+') { *(ImS32*)output = ImAddClampOverflow(*(const ImS32*)arg1, *(const ImS32*)arg2, IM_S32_MIN, IM_S32_MAX); } - if (op == '-') { *(ImS32*)output = ImSubClampOverflow(*(const ImS32*)arg1, *(const ImS32*)arg2, IM_S32_MIN, IM_S32_MAX); } - return; - case ImGuiDataType_U32: - if (op == '+') { *(ImU32*)output = ImAddClampOverflow(*(const ImU32*)arg1, *(const ImU32*)arg2, IM_U32_MIN, IM_U32_MAX); } - if (op == '-') { *(ImU32*)output = ImSubClampOverflow(*(const ImU32*)arg1, *(const ImU32*)arg2, IM_U32_MIN, IM_U32_MAX); } - return; - case ImGuiDataType_S64: - if (op == '+') { *(ImS64*)output = ImAddClampOverflow(*(const ImS64*)arg1, *(const ImS64*)arg2, IM_S64_MIN, IM_S64_MAX); } - if (op == '-') { *(ImS64*)output = ImSubClampOverflow(*(const ImS64*)arg1, *(const ImS64*)arg2, IM_S64_MIN, IM_S64_MAX); } - return; - case ImGuiDataType_U64: - if (op == '+') { *(ImU64*)output = ImAddClampOverflow(*(const ImU64*)arg1, *(const ImU64*)arg2, IM_U64_MIN, IM_U64_MAX); } - if (op == '-') { *(ImU64*)output = ImSubClampOverflow(*(const ImU64*)arg1, *(const ImU64*)arg2, IM_U64_MIN, IM_U64_MAX); } - return; - case ImGuiDataType_Float: - if (op == '+') { *(float*)output = *(const float*)arg1 + *(const float*)arg2; } - if (op == '-') { *(float*)output = *(const float*)arg1 - *(const float*)arg2; } - return; - case ImGuiDataType_Double: - if (op == '+') { *(double*)output = *(const double*)arg1 + *(const double*)arg2; } - if (op == '-') { *(double*)output = *(const double*)arg1 - *(const double*)arg2; } - return; - case ImGuiDataType_COUNT: break; - } - IM_ASSERT(0); -} - -// User can input math operators (e.g. +100) to edit a numerical values. -// NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess.. -bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format) -{ - while (ImCharIsBlankA(*buf)) - buf++; - if (!buf[0]) - return false; - - // Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all. - const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type); - ImGuiDataTypeTempStorage data_backup; - memcpy(&data_backup, p_data, type_info->Size); - - // Sanitize format - // For float/double we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in, so force them into %f and %lf - char format_sanitized[32]; - if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) - format = type_info->ScanFmt; - else - format = ImParseFormatSanitizeForScanning(format, format_sanitized, IM_ARRAYSIZE(format_sanitized)); - - // Small types need a 32-bit buffer to receive the result from scanf() - int v32 = 0; - if (sscanf(buf, format, type_info->Size >= 4 ? p_data : &v32) < 1) - return false; - if (type_info->Size < 4) - { - if (data_type == ImGuiDataType_S8) - *(ImS8*)p_data = (ImS8)ImClamp(v32, (int)IM_S8_MIN, (int)IM_S8_MAX); - else if (data_type == ImGuiDataType_U8) - *(ImU8*)p_data = (ImU8)ImClamp(v32, (int)IM_U8_MIN, (int)IM_U8_MAX); - else if (data_type == ImGuiDataType_S16) - *(ImS16*)p_data = (ImS16)ImClamp(v32, (int)IM_S16_MIN, (int)IM_S16_MAX); - else if (data_type == ImGuiDataType_U16) - *(ImU16*)p_data = (ImU16)ImClamp(v32, (int)IM_U16_MIN, (int)IM_U16_MAX); - else - IM_ASSERT(0); - } - - return memcmp(&data_backup, p_data, type_info->Size) != 0; -} - -template -static int DataTypeCompareT(const T* lhs, const T* rhs) -{ - if (*lhs < *rhs) return -1; - if (*lhs > *rhs) return +1; - return 0; -} - -int ImGui::DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2) -{ - switch (data_type) - { - case ImGuiDataType_S8: return DataTypeCompareT((const ImS8* )arg_1, (const ImS8* )arg_2); - case ImGuiDataType_U8: return DataTypeCompareT((const ImU8* )arg_1, (const ImU8* )arg_2); - case ImGuiDataType_S16: return DataTypeCompareT((const ImS16* )arg_1, (const ImS16* )arg_2); - case ImGuiDataType_U16: return DataTypeCompareT((const ImU16* )arg_1, (const ImU16* )arg_2); - case ImGuiDataType_S32: return DataTypeCompareT((const ImS32* )arg_1, (const ImS32* )arg_2); - case ImGuiDataType_U32: return DataTypeCompareT((const ImU32* )arg_1, (const ImU32* )arg_2); - case ImGuiDataType_S64: return DataTypeCompareT((const ImS64* )arg_1, (const ImS64* )arg_2); - case ImGuiDataType_U64: return DataTypeCompareT((const ImU64* )arg_1, (const ImU64* )arg_2); - case ImGuiDataType_Float: return DataTypeCompareT((const float* )arg_1, (const float* )arg_2); - case ImGuiDataType_Double: return DataTypeCompareT((const double*)arg_1, (const double*)arg_2); - case ImGuiDataType_COUNT: break; - } - IM_ASSERT(0); - return 0; -} - -template -static bool DataTypeClampT(T* v, const T* v_min, const T* v_max) -{ - // Clamp, both sides are optional, return true if modified - if (v_min && *v < *v_min) { *v = *v_min; return true; } - if (v_max && *v > *v_max) { *v = *v_max; return true; } - return false; -} - -bool ImGui::DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max) -{ - switch (data_type) - { - case ImGuiDataType_S8: return DataTypeClampT((ImS8* )p_data, (const ImS8* )p_min, (const ImS8* )p_max); - case ImGuiDataType_U8: return DataTypeClampT((ImU8* )p_data, (const ImU8* )p_min, (const ImU8* )p_max); - case ImGuiDataType_S16: return DataTypeClampT((ImS16* )p_data, (const ImS16* )p_min, (const ImS16* )p_max); - case ImGuiDataType_U16: return DataTypeClampT((ImU16* )p_data, (const ImU16* )p_min, (const ImU16* )p_max); - case ImGuiDataType_S32: return DataTypeClampT((ImS32* )p_data, (const ImS32* )p_min, (const ImS32* )p_max); - case ImGuiDataType_U32: return DataTypeClampT((ImU32* )p_data, (const ImU32* )p_min, (const ImU32* )p_max); - case ImGuiDataType_S64: return DataTypeClampT((ImS64* )p_data, (const ImS64* )p_min, (const ImS64* )p_max); - case ImGuiDataType_U64: return DataTypeClampT((ImU64* )p_data, (const ImU64* )p_min, (const ImU64* )p_max); - case ImGuiDataType_Float: return DataTypeClampT((float* )p_data, (const float* )p_min, (const float* )p_max); - case ImGuiDataType_Double: return DataTypeClampT((double*)p_data, (const double*)p_min, (const double*)p_max); - case ImGuiDataType_COUNT: break; - } - IM_ASSERT(0); - return false; -} - -static float GetMinimumStepAtDecimalPrecision(int decimal_precision) -{ - static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f }; - if (decimal_precision < 0) - return FLT_MIN; - return (decimal_precision < IM_ARRAYSIZE(min_steps)) ? min_steps[decimal_precision] : ImPow(10.0f, (float)-decimal_precision); -} - -template -TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, TYPE v) -{ - IM_UNUSED(data_type); - IM_ASSERT(data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double); - const char* fmt_start = ImParseFormatFindStart(format); - if (fmt_start[0] != '%' || fmt_start[1] == '%') // Don't apply if the value is not visible in the format string - return v; - - // Sanitize format - char fmt_sanitized[32]; - ImParseFormatSanitizeForPrinting(fmt_start, fmt_sanitized, IM_ARRAYSIZE(fmt_sanitized)); - fmt_start = fmt_sanitized; - - // Format value with our rounding, and read back - char v_str[64]; - ImFormatString(v_str, IM_ARRAYSIZE(v_str), fmt_start, v); - const char* p = v_str; - while (*p == ' ') - p++; - v = (TYPE)ImAtof(p); - - return v; -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: DragScalar, DragFloat, DragInt, etc. -//------------------------------------------------------------------------- -// - DragBehaviorT<>() [Internal] -// - DragBehavior() [Internal] -// - DragScalar() -// - DragScalarN() -// - DragFloat() -// - DragFloat2() -// - DragFloat3() -// - DragFloat4() -// - DragFloatRange2() -// - DragInt() -// - DragInt2() -// - DragInt3() -// - DragInt4() -// - DragIntRange2() -//------------------------------------------------------------------------- - -// This is called by DragBehavior() when the widget is active (held by mouse or being manipulated with Nav controls) -template -bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_min, const TYPE v_max, const char* format, ImGuiSliderFlags flags) -{ - ImGuiContext& g = *GImGui; - const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; - const bool is_clamped = (v_min < v_max); - const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; - const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); - - // Default tweak speed - if (v_speed == 0.0f && is_clamped && (v_max - v_min < FLT_MAX)) - v_speed = (float)((v_max - v_min) * g.DragSpeedDefaultRatio); - - // Inputs accumulates into g.DragCurrentAccum, which is flushed into the current value as soon as it makes a difference with our precision settings - float adjust_delta = 0.0f; - if (g.ActiveIdSource == ImGuiInputSource_Mouse && IsMousePosValid() && IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR)) - { - adjust_delta = g.IO.MouseDelta[axis]; - if (g.IO.KeyAlt) - adjust_delta *= 1.0f / 100.0f; - if (g.IO.KeyShift) - adjust_delta *= 10.0f; - } - else if (g.ActiveIdSource == ImGuiInputSource_Nav) - { - const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; - const bool tweak_slow = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakSlow : ImGuiKey_NavKeyboardTweakSlow); - const bool tweak_fast = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakFast : ImGuiKey_NavKeyboardTweakFast); - const float tweak_factor = tweak_slow ? 1.0f / 1.0f : tweak_fast ? 10.0f : 1.0f; - adjust_delta = GetNavTweakPressedAmount(axis) * tweak_factor; - v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision)); - } - adjust_delta *= v_speed; - - // For vertical drag we currently assume that Up=higher value (like we do with vertical sliders). This may become a parameter. - if (axis == ImGuiAxis_Y) - adjust_delta = -adjust_delta; - - // For logarithmic use our range is effectively 0..1 so scale the delta into that range - if (is_logarithmic && (v_max - v_min < FLT_MAX) && ((v_max - v_min) > 0.000001f)) // Epsilon to avoid /0 - adjust_delta /= (float)(v_max - v_min); - - // Clear current value on activation - // Avoid altering values and clamping when we are _already_ past the limits and heading in the same direction, so e.g. if range is 0..255, current value is 300 and we are pushing to the right side, keep the 300. - bool is_just_activated = g.ActiveIdIsJustActivated; - bool is_already_past_limits_and_pushing_outward = is_clamped && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f)); - if (is_just_activated || is_already_past_limits_and_pushing_outward) - { - g.DragCurrentAccum = 0.0f; - g.DragCurrentAccumDirty = false; - } - else if (adjust_delta != 0.0f) - { - g.DragCurrentAccum += adjust_delta; - g.DragCurrentAccumDirty = true; - } - - if (!g.DragCurrentAccumDirty) - return false; - - TYPE v_cur = *v; - FLOATTYPE v_old_ref_for_accum_remainder = (FLOATTYPE)0.0f; - - float logarithmic_zero_epsilon = 0.0f; // Only valid when is_logarithmic is true - const float zero_deadzone_halfsize = 0.0f; // Drag widgets have no deadzone (as it doesn't make sense) - if (is_logarithmic) - { - // When using logarithmic sliders, we need to clamp to avoid hitting zero, but our choice of clamp value greatly affects slider precision. We attempt to use the specified precision to estimate a good lower bound. - const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 1; - logarithmic_zero_epsilon = ImPow(0.1f, (float)decimal_precision); - - // Convert to parametric space, apply delta, convert back - float v_old_parametric = ScaleRatioFromValueT(data_type, v_cur, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - float v_new_parametric = v_old_parametric + g.DragCurrentAccum; - v_cur = ScaleValueFromRatioT(data_type, v_new_parametric, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - v_old_ref_for_accum_remainder = v_old_parametric; - } - else - { - v_cur += (SIGNEDTYPE)g.DragCurrentAccum; - } - - // Round to user desired precision based on format string - if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) - v_cur = RoundScalarWithFormatT(format, data_type, v_cur); - - // Preserve remainder after rounding has been applied. This also allow slow tweaking of values. - g.DragCurrentAccumDirty = false; - if (is_logarithmic) - { - // Convert to parametric space, apply delta, convert back - float v_new_parametric = ScaleRatioFromValueT(data_type, v_cur, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - g.DragCurrentAccum -= (float)(v_new_parametric - v_old_ref_for_accum_remainder); - } - else - { - g.DragCurrentAccum -= (float)((SIGNEDTYPE)v_cur - (SIGNEDTYPE)*v); - } - - // Lose zero sign for float/double - if (v_cur == (TYPE)-0) - v_cur = (TYPE)0; - - // Clamp values (+ handle overflow/wrap-around for integer types) - if (*v != v_cur && is_clamped) - { - if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_floating_point)) - v_cur = v_min; - if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f && !is_floating_point)) - v_cur = v_max; - } - - // Apply result - if (*v == v_cur) - return false; - *v = v_cur; - return true; -} - -bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) -{ - // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. - IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flags! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); - - ImGuiContext& g = *GImGui; - if (g.ActiveId == id) - { - // Those are the things we can do easily outside the DragBehaviorT<> template, saves code generation. - if (g.ActiveIdSource == ImGuiInputSource_Mouse && !g.IO.MouseDown[0]) - ClearActiveID(); - else if (g.ActiveIdSource == ImGuiInputSource_Nav && g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated) - ClearActiveID(); - } - if (g.ActiveId != id) - return false; - if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) - return false; - - switch (data_type) - { - case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = DragBehaviorT(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS8*) p_min : IM_S8_MIN, p_max ? *(const ImS8*)p_max : IM_S8_MAX, format, flags); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } - case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = DragBehaviorT(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU8*) p_min : IM_U8_MIN, p_max ? *(const ImU8*)p_max : IM_U8_MAX, format, flags); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } - case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = DragBehaviorT(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS16*)p_min : IM_S16_MIN, p_max ? *(const ImS16*)p_max : IM_S16_MAX, format, flags); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } - case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = DragBehaviorT(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU16*)p_min : IM_U16_MIN, p_max ? *(const ImU16*)p_max : IM_U16_MAX, format, flags); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } - case ImGuiDataType_S32: return DragBehaviorT(data_type, (ImS32*)p_v, v_speed, p_min ? *(const ImS32* )p_min : IM_S32_MIN, p_max ? *(const ImS32* )p_max : IM_S32_MAX, format, flags); - case ImGuiDataType_U32: return DragBehaviorT(data_type, (ImU32*)p_v, v_speed, p_min ? *(const ImU32* )p_min : IM_U32_MIN, p_max ? *(const ImU32* )p_max : IM_U32_MAX, format, flags); - case ImGuiDataType_S64: return DragBehaviorT(data_type, (ImS64*)p_v, v_speed, p_min ? *(const ImS64* )p_min : IM_S64_MIN, p_max ? *(const ImS64* )p_max : IM_S64_MAX, format, flags); - case ImGuiDataType_U64: return DragBehaviorT(data_type, (ImU64*)p_v, v_speed, p_min ? *(const ImU64* )p_min : IM_U64_MIN, p_max ? *(const ImU64* )p_max : IM_U64_MAX, format, flags); - case ImGuiDataType_Float: return DragBehaviorT(data_type, (float*)p_v, v_speed, p_min ? *(const float* )p_min : -FLT_MAX, p_max ? *(const float* )p_max : FLT_MAX, format, flags); - case ImGuiDataType_Double: return DragBehaviorT(data_type, (double*)p_v, v_speed, p_min ? *(const double*)p_min : -DBL_MAX, p_max ? *(const double*)p_max : DBL_MAX, format, flags); - case ImGuiDataType_COUNT: break; - } - IM_ASSERT(0); - return false; -} - -// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a Drag widget, p_min and p_max are optional. -// Read code of e.g. DragFloat(), DragInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. -bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const float w = CalcItemWidth(); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - - const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0; - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, id, &frame_bb, temp_input_allowed ? ImGuiItemFlags_Inputable : 0)) - return false; - - // Default format string when passing NULL - if (format == NULL) - format = DataTypeGetInfo(data_type)->PrintFmt; - else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) - format = PatchFormatStringFloatToInt(format); - - const bool hovered = ItemHoverable(frame_bb, id); - bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); - if (!temp_input_is_active) - { - // Tabbing or CTRL-clicking on Drag turns it into an InputText - const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; - const bool clicked = (hovered && g.IO.MouseClicked[0]); - const bool double_clicked = (hovered && g.IO.MouseClickedCount[0] == 2); - const bool make_active = (input_requested_by_tabbing || clicked || double_clicked || g.NavActivateId == id || g.NavActivateInputId == id); - if (make_active && temp_input_allowed) - if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || double_clicked || g.NavActivateInputId == id) - temp_input_is_active = true; - - // (Optional) simple click (without moving) turns Drag into an InputText - if (g.IO.ConfigDragClickToInputText && temp_input_allowed && !temp_input_is_active) - if (g.ActiveId == id && hovered && g.IO.MouseReleased[0] && !IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR)) - { - g.NavActivateId = g.NavActivateInputId = id; - g.NavActivateFlags = ImGuiActivateFlags_PreferInput; - temp_input_is_active = true; - } - - if (make_active && !temp_input_is_active) - { - SetActiveID(id, window); - SetFocusID(id, window); - FocusWindow(window); - g.ActiveIdUsingNavDirMask = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); - } - } - - if (temp_input_is_active) - { - // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set - const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0 && (p_min == NULL || p_max == NULL || DataTypeCompare(data_type, p_min, p_max) < 0); - return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL); - } - - // Draw frame - const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); - RenderNavHighlight(frame_bb, id); - RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding); - - // Drag behavior - const bool value_changed = DragBehavior(id, data_type, p_data, v_speed, p_min, p_max, format, flags); - if (value_changed) - MarkItemEdited(id); - - // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. - char value_buf[64]; - const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); - if (g.LogEnabled) - LogSetNextTextDecoration("{", "}"); - RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); - - if (label_size.x > 0.0f) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); - return value_changed; -} - -bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components, CalcItemWidth()); - size_t type_size = GDataTypeInfo[data_type].Size; - for (int i = 0; i < components; i++) - { - PushID(i); - if (i > 0) - SameLine(0, g.Style.ItemInnerSpacing.x); - value_changed |= DragScalar("", data_type, p_data, v_speed, p_min, p_max, format, flags); - PopID(); - PopItemWidth(); - p_data = (void*)((char*)p_data + type_size); - } - PopID(); - - const char* label_end = FindRenderedTextEnd(label); - if (label != label_end) - { - SameLine(0, g.Style.ItemInnerSpacing.x); - TextEx(label, label_end); - } - - EndGroup(); - return value_changed; -} - -bool ImGui::DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, flags); -} - -bool ImGui::DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, flags); -} - -bool ImGui::DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, flags); -} - -bool ImGui::DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, flags); -} - -// NB: You likely want to specify the ImGuiSliderFlags_AlwaysClamp when using this. -bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed, float v_min, float v_max, const char* format, const char* format_max, ImGuiSliderFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - PushID(label); - BeginGroup(); - PushMultiItemsWidths(2, CalcItemWidth()); - - float min_min = (v_min >= v_max) ? -FLT_MAX : v_min; - float min_max = (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max); - ImGuiSliderFlags min_flags = flags | ((min_min == min_max) ? ImGuiSliderFlags_ReadOnly : 0); - bool value_changed = DragScalar("##min", ImGuiDataType_Float, v_current_min, v_speed, &min_min, &min_max, format, min_flags); - PopItemWidth(); - SameLine(0, g.Style.ItemInnerSpacing.x); - - float max_min = (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min); - float max_max = (v_min >= v_max) ? FLT_MAX : v_max; - ImGuiSliderFlags max_flags = flags | ((max_min == max_max) ? ImGuiSliderFlags_ReadOnly : 0); - value_changed |= DragScalar("##max", ImGuiDataType_Float, v_current_max, v_speed, &max_min, &max_max, format_max ? format_max : format, max_flags); - PopItemWidth(); - SameLine(0, g.Style.ItemInnerSpacing.x); - - TextEx(label, FindRenderedTextEnd(label)); - EndGroup(); - PopID(); - - return value_changed; -} - -// NB: v_speed is float to allow adjusting the drag speed with more precision -bool ImGui::DragInt(const char* label, int* v, float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return DragScalar(label, ImGuiDataType_S32, v, v_speed, &v_min, &v_max, format, flags); -} - -bool ImGui::DragInt2(const char* label, int v[2], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return DragScalarN(label, ImGuiDataType_S32, v, 2, v_speed, &v_min, &v_max, format, flags); -} - -bool ImGui::DragInt3(const char* label, int v[3], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return DragScalarN(label, ImGuiDataType_S32, v, 3, v_speed, &v_min, &v_max, format, flags); -} - -bool ImGui::DragInt4(const char* label, int v[4], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return DragScalarN(label, ImGuiDataType_S32, v, 4, v_speed, &v_min, &v_max, format, flags); -} - -// NB: You likely want to specify the ImGuiSliderFlags_AlwaysClamp when using this. -bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed, int v_min, int v_max, const char* format, const char* format_max, ImGuiSliderFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - PushID(label); - BeginGroup(); - PushMultiItemsWidths(2, CalcItemWidth()); - - int min_min = (v_min >= v_max) ? INT_MIN : v_min; - int min_max = (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max); - ImGuiSliderFlags min_flags = flags | ((min_min == min_max) ? ImGuiSliderFlags_ReadOnly : 0); - bool value_changed = DragInt("##min", v_current_min, v_speed, min_min, min_max, format, min_flags); - PopItemWidth(); - SameLine(0, g.Style.ItemInnerSpacing.x); - - int max_min = (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min); - int max_max = (v_min >= v_max) ? INT_MAX : v_max; - ImGuiSliderFlags max_flags = flags | ((max_min == max_max) ? ImGuiSliderFlags_ReadOnly : 0); - value_changed |= DragInt("##max", v_current_max, v_speed, max_min, max_max, format_max ? format_max : format, max_flags); - PopItemWidth(); - SameLine(0, g.Style.ItemInnerSpacing.x); - - TextEx(label, FindRenderedTextEnd(label)); - EndGroup(); - PopID(); - - return value_changed; -} - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - -// Obsolete versions with power parameter. See https://github.com/ocornut/imgui/issues/3361 for details. -bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power) -{ - ImGuiSliderFlags drag_flags = ImGuiSliderFlags_None; - if (power != 1.0f) - { - IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); - IM_ASSERT(p_min != NULL && p_max != NULL); // When using a power curve the drag needs to have known bounds - drag_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths - } - return DragScalar(label, data_type, p_data, v_speed, p_min, p_max, format, drag_flags); -} - -bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power) -{ - ImGuiSliderFlags drag_flags = ImGuiSliderFlags_None; - if (power != 1.0f) - { - IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); - IM_ASSERT(p_min != NULL && p_max != NULL); // When using a power curve the drag needs to have known bounds - drag_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths - } - return DragScalarN(label, data_type, p_data, components, v_speed, p_min, p_max, format, drag_flags); -} - -#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS - -//------------------------------------------------------------------------- -// [SECTION] Widgets: SliderScalar, SliderFloat, SliderInt, etc. -//------------------------------------------------------------------------- -// - ScaleRatioFromValueT<> [Internal] -// - ScaleValueFromRatioT<> [Internal] -// - SliderBehaviorT<>() [Internal] -// - SliderBehavior() [Internal] -// - SliderScalar() -// - SliderScalarN() -// - SliderFloat() -// - SliderFloat2() -// - SliderFloat3() -// - SliderFloat4() -// - SliderAngle() -// - SliderInt() -// - SliderInt2() -// - SliderInt3() -// - SliderInt4() -// - VSliderScalar() -// - VSliderFloat() -// - VSliderInt() -//------------------------------------------------------------------------- - -// Convert a value v in the output space of a slider into a parametric position on the slider itself (the logical opposite of ScaleValueFromRatioT) -template -float ImGui::ScaleRatioFromValueT(ImGuiDataType data_type, TYPE v, TYPE v_min, TYPE v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize) -{ - if (v_min == v_max) - return 0.0f; - IM_UNUSED(data_type); - - const TYPE v_clamped = (v_min < v_max) ? ImClamp(v, v_min, v_max) : ImClamp(v, v_max, v_min); - if (is_logarithmic) - { - bool flipped = v_max < v_min; - - if (flipped) // Handle the case where the range is backwards - ImSwap(v_min, v_max); - - // Fudge min/max to avoid getting close to log(0) - FLOATTYPE v_min_fudged = (ImAbs((FLOATTYPE)v_min) < logarithmic_zero_epsilon) ? ((v_min < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_min; - FLOATTYPE v_max_fudged = (ImAbs((FLOATTYPE)v_max) < logarithmic_zero_epsilon) ? ((v_max < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_max; - - // Awkward special cases - we need ranges of the form (-100 .. 0) to convert to (-100 .. -epsilon), not (-100 .. epsilon) - if ((v_min == 0.0f) && (v_max < 0.0f)) - v_min_fudged = -logarithmic_zero_epsilon; - else if ((v_max == 0.0f) && (v_min < 0.0f)) - v_max_fudged = -logarithmic_zero_epsilon; - - float result; - if (v_clamped <= v_min_fudged) - result = 0.0f; // Workaround for values that are in-range but below our fudge - else if (v_clamped >= v_max_fudged) - result = 1.0f; // Workaround for values that are in-range but above our fudge - else if ((v_min * v_max) < 0.0f) // Range crosses zero, so split into two portions - { - float zero_point_center = (-(float)v_min) / ((float)v_max - (float)v_min); // The zero point in parametric space. There's an argument we should take the logarithmic nature into account when calculating this, but for now this should do (and the most common case of a symmetrical range works fine) - float zero_point_snap_L = zero_point_center - zero_deadzone_halfsize; - float zero_point_snap_R = zero_point_center + zero_deadzone_halfsize; - if (v == 0.0f) - result = zero_point_center; // Special case for exactly zero - else if (v < 0.0f) - result = (1.0f - (float)(ImLog(-(FLOATTYPE)v_clamped / logarithmic_zero_epsilon) / ImLog(-v_min_fudged / logarithmic_zero_epsilon))) * zero_point_snap_L; - else - result = zero_point_snap_R + ((float)(ImLog((FLOATTYPE)v_clamped / logarithmic_zero_epsilon) / ImLog(v_max_fudged / logarithmic_zero_epsilon)) * (1.0f - zero_point_snap_R)); - } - else if ((v_min < 0.0f) || (v_max < 0.0f)) // Entirely negative slider - result = 1.0f - (float)(ImLog(-(FLOATTYPE)v_clamped / -v_max_fudged) / ImLog(-v_min_fudged / -v_max_fudged)); - else - result = (float)(ImLog((FLOATTYPE)v_clamped / v_min_fudged) / ImLog(v_max_fudged / v_min_fudged)); - - return flipped ? (1.0f - result) : result; - } - else - { - // Linear slider - return (float)((FLOATTYPE)(SIGNEDTYPE)(v_clamped - v_min) / (FLOATTYPE)(SIGNEDTYPE)(v_max - v_min)); - } -} - -// Convert a parametric position on a slider into a value v in the output space (the logical opposite of ScaleRatioFromValueT) -template -TYPE ImGui::ScaleValueFromRatioT(ImGuiDataType data_type, float t, TYPE v_min, TYPE v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize) -{ - // We special-case the extents because otherwise our logarithmic fudging can lead to "mathematically correct" - // but non-intuitive behaviors like a fully-left slider not actually reaching the minimum value. Also generally simpler. - if (t <= 0.0f || v_min == v_max) - return v_min; - if (t >= 1.0f) - return v_max; - - TYPE result = (TYPE)0; - if (is_logarithmic) - { - // Fudge min/max to avoid getting silly results close to zero - FLOATTYPE v_min_fudged = (ImAbs((FLOATTYPE)v_min) < logarithmic_zero_epsilon) ? ((v_min < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_min; - FLOATTYPE v_max_fudged = (ImAbs((FLOATTYPE)v_max) < logarithmic_zero_epsilon) ? ((v_max < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_max; - - const bool flipped = v_max < v_min; // Check if range is "backwards" - if (flipped) - ImSwap(v_min_fudged, v_max_fudged); - - // Awkward special case - we need ranges of the form (-100 .. 0) to convert to (-100 .. -epsilon), not (-100 .. epsilon) - if ((v_max == 0.0f) && (v_min < 0.0f)) - v_max_fudged = -logarithmic_zero_epsilon; - - float t_with_flip = flipped ? (1.0f - t) : t; // t, but flipped if necessary to account for us flipping the range - - if ((v_min * v_max) < 0.0f) // Range crosses zero, so we have to do this in two parts - { - float zero_point_center = (-(float)ImMin(v_min, v_max)) / ImAbs((float)v_max - (float)v_min); // The zero point in parametric space - float zero_point_snap_L = zero_point_center - zero_deadzone_halfsize; - float zero_point_snap_R = zero_point_center + zero_deadzone_halfsize; - if (t_with_flip >= zero_point_snap_L && t_with_flip <= zero_point_snap_R) - result = (TYPE)0.0f; // Special case to make getting exactly zero possible (the epsilon prevents it otherwise) - else if (t_with_flip < zero_point_center) - result = (TYPE)-(logarithmic_zero_epsilon * ImPow(-v_min_fudged / logarithmic_zero_epsilon, (FLOATTYPE)(1.0f - (t_with_flip / zero_point_snap_L)))); - else - result = (TYPE)(logarithmic_zero_epsilon * ImPow(v_max_fudged / logarithmic_zero_epsilon, (FLOATTYPE)((t_with_flip - zero_point_snap_R) / (1.0f - zero_point_snap_R)))); - } - else if ((v_min < 0.0f) || (v_max < 0.0f)) // Entirely negative slider - result = (TYPE)-(-v_max_fudged * ImPow(-v_min_fudged / -v_max_fudged, (FLOATTYPE)(1.0f - t_with_flip))); - else - result = (TYPE)(v_min_fudged * ImPow(v_max_fudged / v_min_fudged, (FLOATTYPE)t_with_flip)); - } - else - { - // Linear slider - const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); - if (is_floating_point) - { - result = ImLerp(v_min, v_max, t); - } - else if (t < 1.0) - { - // - For integer values we want the clicking position to match the grab box so we round above - // This code is carefully tuned to work with large values (e.g. high ranges of U64) while preserving this property.. - // - Not doing a *1.0 multiply at the end of a range as it tends to be lossy. While absolute aiming at a large s64/u64 - // range is going to be imprecise anyway, with this check we at least make the edge values matches expected limits. - FLOATTYPE v_new_off_f = (SIGNEDTYPE)(v_max - v_min) * t; - result = (TYPE)((SIGNEDTYPE)v_min + (SIGNEDTYPE)(v_new_off_f + (FLOATTYPE)(v_min > v_max ? -0.5 : 0.5))); - } - } - - return result; -} - -// FIXME: Try to move more of the code into shared SliderBehavior() -template -bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, TYPE* v, const TYPE v_min, const TYPE v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) -{ - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; - const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; - const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); - const SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max); - - // Calculate bounds - const float grab_padding = 2.0f; // FIXME: Should be part of style. - const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f; - float grab_sz = style.GrabMinSize; - if (!is_floating_point && v_range >= 0) // v_range < 0 may happen on integer overflows - grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit - grab_sz = ImMin(grab_sz, slider_sz); - const float slider_usable_sz = slider_sz - grab_sz; - const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f; - const float slider_usable_pos_max = bb.Max[axis] - grab_padding - grab_sz * 0.5f; - - float logarithmic_zero_epsilon = 0.0f; // Only valid when is_logarithmic is true - float zero_deadzone_halfsize = 0.0f; // Only valid when is_logarithmic is true - if (is_logarithmic) - { - // When using logarithmic sliders, we need to clamp to avoid hitting zero, but our choice of clamp value greatly affects slider precision. We attempt to use the specified precision to estimate a good lower bound. - const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 1; - logarithmic_zero_epsilon = ImPow(0.1f, (float)decimal_precision); - zero_deadzone_halfsize = (style.LogSliderDeadzone * 0.5f) / ImMax(slider_usable_sz, 1.0f); - } - - // Process interacting with the slider - bool value_changed = false; - if (g.ActiveId == id) - { - bool set_new_value = false; - float clicked_t = 0.0f; - if (g.ActiveIdSource == ImGuiInputSource_Mouse) - { - if (!g.IO.MouseDown[0]) - { - ClearActiveID(); - } - else - { - const float mouse_abs_pos = g.IO.MousePos[axis]; - if (g.ActiveIdIsJustActivated) - { - float grab_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - if (axis == ImGuiAxis_Y) - grab_t = 1.0f - grab_t; - const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t); - const bool clicked_around_grab = (mouse_abs_pos >= grab_pos - grab_sz * 0.5f - 1.0f) && (mouse_abs_pos <= grab_pos + grab_sz * 0.5f + 1.0f); // No harm being extra generous here. - g.SliderGrabClickOffset = (clicked_around_grab && is_floating_point) ? mouse_abs_pos - grab_pos : 0.0f; - } - if (slider_usable_sz > 0.0f) - clicked_t = ImSaturate((mouse_abs_pos - g.SliderGrabClickOffset - slider_usable_pos_min) / slider_usable_sz); - if (axis == ImGuiAxis_Y) - clicked_t = 1.0f - clicked_t; - set_new_value = true; - } - } - else if (g.ActiveIdSource == ImGuiInputSource_Nav) - { - if (g.ActiveIdIsJustActivated) - { - g.SliderCurrentAccum = 0.0f; // Reset any stored nav delta upon activation - g.SliderCurrentAccumDirty = false; - } - - float input_delta = (axis == ImGuiAxis_X) ? GetNavTweakPressedAmount(axis) : -GetNavTweakPressedAmount(axis); - if (input_delta != 0.0f) - { - const bool tweak_slow = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakSlow : ImGuiKey_NavKeyboardTweakSlow); - const bool tweak_fast = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakFast : ImGuiKey_NavKeyboardTweakFast); - const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; - if (decimal_precision > 0) - { - input_delta /= 100.0f; // Gamepad/keyboard tweak speeds in % of slider bounds - if (tweak_slow) - input_delta /= 10.0f; - } - else - { - if ((v_range >= -100.0f && v_range <= 100.0f) || tweak_slow) - input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / (float)v_range; // Gamepad/keyboard tweak speeds in integer steps - else - input_delta /= 100.0f; - } - if (tweak_fast) - input_delta *= 10.0f; - - g.SliderCurrentAccum += input_delta; - g.SliderCurrentAccumDirty = true; - } - - float delta = g.SliderCurrentAccum; - if (g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated) - { - ClearActiveID(); - } - else if (g.SliderCurrentAccumDirty) - { - clicked_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - - if ((clicked_t >= 1.0f && delta > 0.0f) || (clicked_t <= 0.0f && delta < 0.0f)) // This is to avoid applying the saturation when already past the limits - { - set_new_value = false; - g.SliderCurrentAccum = 0.0f; // If pushing up against the limits, don't continue to accumulate - } - else - { - set_new_value = true; - float old_clicked_t = clicked_t; - clicked_t = ImSaturate(clicked_t + delta); - - // Calculate what our "new" clicked_t will be, and thus how far we actually moved the slider, and subtract this from the accumulator - TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) - v_new = RoundScalarWithFormatT(format, data_type, v_new); - float new_clicked_t = ScaleRatioFromValueT(data_type, v_new, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - - if (delta > 0) - g.SliderCurrentAccum -= ImMin(new_clicked_t - old_clicked_t, delta); - else - g.SliderCurrentAccum -= ImMax(new_clicked_t - old_clicked_t, delta); - } - - g.SliderCurrentAccumDirty = false; - } - } - - if (set_new_value) - { - TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - - // Round to user desired precision based on format string - if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) - v_new = RoundScalarWithFormatT(format, data_type, v_new); - - // Apply result - if (*v != v_new) - { - *v = v_new; - value_changed = true; - } - } - } - - if (slider_sz < 1.0f) - { - *out_grab_bb = ImRect(bb.Min, bb.Min); - } - else - { - // Output grab position so it can be displayed by the caller - float grab_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); - if (axis == ImGuiAxis_Y) - grab_t = 1.0f - grab_t; - const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t); - if (axis == ImGuiAxis_X) - *out_grab_bb = ImRect(grab_pos - grab_sz * 0.5f, bb.Min.y + grab_padding, grab_pos + grab_sz * 0.5f, bb.Max.y - grab_padding); - else - *out_grab_bb = ImRect(bb.Min.x + grab_padding, grab_pos - grab_sz * 0.5f, bb.Max.x - grab_padding, grab_pos + grab_sz * 0.5f); - } - - return value_changed; -} - -// For 32-bit and larger types, slider bounds are limited to half the natural type range. -// So e.g. an integer Slider between INT_MAX-10 and INT_MAX will fail, but an integer Slider between INT_MAX/2-10 and INT_MAX/2 will be ok. -// It would be possible to lift that limitation with some work but it doesn't seem to be worth it for sliders. -bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) -{ - // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. - IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flag! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); - - // Those are the things we can do easily outside the SliderBehaviorT<> template, saves code generation. - ImGuiContext& g = *GImGui; - if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) - return false; - - switch (data_type) - { - case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)p_min, *(const ImS8*)p_max, format, flags, out_grab_bb); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } - case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_U32, &v32, *(const ImU8*)p_min, *(const ImU8*)p_max, format, flags, out_grab_bb); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } - case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_S32, &v32, *(const ImS16*)p_min, *(const ImS16*)p_max, format, flags, out_grab_bb); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } - case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_U32, &v32, *(const ImU16*)p_min, *(const ImU16*)p_max, format, flags, out_grab_bb); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } - case ImGuiDataType_S32: - IM_ASSERT(*(const ImS32*)p_min >= IM_S32_MIN / 2 && *(const ImS32*)p_max <= IM_S32_MAX / 2); - return SliderBehaviorT(bb, id, data_type, (ImS32*)p_v, *(const ImS32*)p_min, *(const ImS32*)p_max, format, flags, out_grab_bb); - case ImGuiDataType_U32: - IM_ASSERT(*(const ImU32*)p_max <= IM_U32_MAX / 2); - return SliderBehaviorT(bb, id, data_type, (ImU32*)p_v, *(const ImU32*)p_min, *(const ImU32*)p_max, format, flags, out_grab_bb); - case ImGuiDataType_S64: - IM_ASSERT(*(const ImS64*)p_min >= IM_S64_MIN / 2 && *(const ImS64*)p_max <= IM_S64_MAX / 2); - return SliderBehaviorT(bb, id, data_type, (ImS64*)p_v, *(const ImS64*)p_min, *(const ImS64*)p_max, format, flags, out_grab_bb); - case ImGuiDataType_U64: - IM_ASSERT(*(const ImU64*)p_max <= IM_U64_MAX / 2); - return SliderBehaviorT(bb, id, data_type, (ImU64*)p_v, *(const ImU64*)p_min, *(const ImU64*)p_max, format, flags, out_grab_bb); - case ImGuiDataType_Float: - IM_ASSERT(*(const float*)p_min >= -FLT_MAX / 2.0f && *(const float*)p_max <= FLT_MAX / 2.0f); - return SliderBehaviorT(bb, id, data_type, (float*)p_v, *(const float*)p_min, *(const float*)p_max, format, flags, out_grab_bb); - case ImGuiDataType_Double: - IM_ASSERT(*(const double*)p_min >= -DBL_MAX / 2.0f && *(const double*)p_max <= DBL_MAX / 2.0f); - return SliderBehaviorT(bb, id, data_type, (double*)p_v, *(const double*)p_min, *(const double*)p_max, format, flags, out_grab_bb); - case ImGuiDataType_COUNT: break; - } - IM_ASSERT(0); - return false; -} - -// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a slider, they are all required. -// Read code of e.g. SliderFloat(), SliderInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. -bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const float w = CalcItemWidth(); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - - const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0; - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, id, &frame_bb, temp_input_allowed ? ImGuiItemFlags_Inputable : 0)) - return false; - - // Default format string when passing NULL - if (format == NULL) - format = DataTypeGetInfo(data_type)->PrintFmt; - else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) - format = PatchFormatStringFloatToInt(format); - - const bool hovered = ItemHoverable(frame_bb, id); - bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); - if (!temp_input_is_active) - { - // Tabbing or CTRL-clicking on Slider turns it into an input box - const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; - const bool clicked = (hovered && g.IO.MouseClicked[0]); - const bool make_active = (input_requested_by_tabbing || clicked || g.NavActivateId == id || g.NavActivateInputId == id); - if (make_active && temp_input_allowed) - if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || g.NavActivateInputId == id) - temp_input_is_active = true; - - if (make_active && !temp_input_is_active) - { - SetActiveID(id, window); - SetFocusID(id, window); - FocusWindow(window); - g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); - } - } - - if (temp_input_is_active) - { - // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set - const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0; - return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL); - } - - // Draw frame - const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); - RenderNavHighlight(frame_bb, id); - RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding); - - // Slider behavior - ImRect grab_bb; - const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags, &grab_bb); - if (value_changed) - MarkItemEdited(id); - - // Render grab - if (grab_bb.Max.x > grab_bb.Min.x) - window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding); - - // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. - char value_buf[64]; - const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); - if (g.LogEnabled) - LogSetNextTextDecoration("{", "}"); - RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); - - if (label_size.x > 0.0f) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); - return value_changed; -} - -// Add multiple sliders on 1 line for compact edition of multiple components -bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, ImGuiSliderFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components, CalcItemWidth()); - size_t type_size = GDataTypeInfo[data_type].Size; - for (int i = 0; i < components; i++) - { - PushID(i); - if (i > 0) - SameLine(0, g.Style.ItemInnerSpacing.x); - value_changed |= SliderScalar("", data_type, v, v_min, v_max, format, flags); - PopID(); - PopItemWidth(); - v = (void*)((char*)v + type_size); - } - PopID(); - - const char* label_end = FindRenderedTextEnd(label); - if (label != label_end) - { - SameLine(0, g.Style.ItemInnerSpacing.x); - TextEx(label, label_end); - } - - EndGroup(); - return value_changed; -} - -bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, flags); -} - -bool ImGui::SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, flags); -} - -bool ImGui::SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, flags); -} - -bool ImGui::SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, flags); -} - -bool ImGui::SliderAngle(const char* label, float* v_rad, float v_degrees_min, float v_degrees_max, const char* format, ImGuiSliderFlags flags) -{ - if (format == NULL) - format = "%.0f deg"; - float v_deg = (*v_rad) * 360.0f / (2 * IM_PI); - bool value_changed = SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, format, flags); - *v_rad = v_deg * (2 * IM_PI) / 360.0f; - return value_changed; -} - -bool ImGui::SliderInt(const char* label, int* v, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return SliderScalar(label, ImGuiDataType_S32, v, &v_min, &v_max, format, flags); -} - -bool ImGui::SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return SliderScalarN(label, ImGuiDataType_S32, v, 2, &v_min, &v_max, format, flags); -} - -bool ImGui::SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return SliderScalarN(label, ImGuiDataType_S32, v, 3, &v_min, &v_max, format, flags); -} - -bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return SliderScalarN(label, ImGuiDataType_S32, v, 4, &v_min, &v_max, format, flags); -} - -bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size); - const ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - - ItemSize(bb, style.FramePadding.y); - if (!ItemAdd(frame_bb, id)) - return false; - - // Default format string when passing NULL - if (format == NULL) - format = DataTypeGetInfo(data_type)->PrintFmt; - else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) - format = PatchFormatStringFloatToInt(format); - - const bool hovered = ItemHoverable(frame_bb, id); - if ((hovered && g.IO.MouseClicked[0]) || g.NavActivateId == id || g.NavActivateInputId == id) - { - SetActiveID(id, window); - SetFocusID(id, window); - FocusWindow(window); - g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); - } - - // Draw frame - const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); - RenderNavHighlight(frame_bb, id); - RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding); - - // Slider behavior - ImRect grab_bb; - const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags | ImGuiSliderFlags_Vertical, &grab_bb); - if (value_changed) - MarkItemEdited(id); - - // Render grab - if (grab_bb.Max.y > grab_bb.Min.y) - window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding); - - // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. - // For the vertical slider we allow centered text to overlap the frame padding - char value_buf[64]; - const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); - RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.0f)); - if (label_size.x > 0.0f) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - return value_changed; -} - -bool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) -{ - return VSliderScalar(label, size, ImGuiDataType_Float, v, &v_min, &v_max, format, flags); -} - -bool ImGui::VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) -{ - return VSliderScalar(label, size, ImGuiDataType_S32, v, &v_min, &v_max, format, flags); -} - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - -// Obsolete versions with power parameter. See https://github.com/ocornut/imgui/issues/3361 for details. -bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power) -{ - ImGuiSliderFlags slider_flags = ImGuiSliderFlags_None; - if (power != 1.0f) - { - IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); - slider_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths - } - return SliderScalar(label, data_type, p_data, p_min, p_max, format, slider_flags); -} - -bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, float power) -{ - ImGuiSliderFlags slider_flags = ImGuiSliderFlags_None; - if (power != 1.0f) - { - IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); - slider_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths - } - return SliderScalarN(label, data_type, v, components, v_min, v_max, format, slider_flags); -} - -#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS - -//------------------------------------------------------------------------- -// [SECTION] Widgets: InputScalar, InputFloat, InputInt, etc. -//------------------------------------------------------------------------- -// - ImParseFormatFindStart() [Internal] -// - ImParseFormatFindEnd() [Internal] -// - ImParseFormatTrimDecorations() [Internal] -// - ImParseFormatSanitizeForPrinting() [Internal] -// - ImParseFormatSanitizeForScanning() [Internal] -// - ImParseFormatPrecision() [Internal] -// - TempInputTextScalar() [Internal] -// - InputScalar() -// - InputScalarN() -// - InputFloat() -// - InputFloat2() -// - InputFloat3() -// - InputFloat4() -// - InputInt() -// - InputInt2() -// - InputInt3() -// - InputInt4() -// - InputDouble() -//------------------------------------------------------------------------- - -// We don't use strchr() because our strings are usually very short and often start with '%' -const char* ImParseFormatFindStart(const char* fmt) -{ - while (char c = fmt[0]) - { - if (c == '%' && fmt[1] != '%') - return fmt; - else if (c == '%') - fmt++; - fmt++; - } - return fmt; -} - -const char* ImParseFormatFindEnd(const char* fmt) -{ - // Printf/scanf types modifiers: I/L/h/j/l/t/w/z. Other uppercase letters qualify as types aka end of the format. - if (fmt[0] != '%') - return fmt; - const unsigned int ignored_uppercase_mask = (1 << ('I'-'A')) | (1 << ('L'-'A')); - const unsigned int ignored_lowercase_mask = (1 << ('h'-'a')) | (1 << ('j'-'a')) | (1 << ('l'-'a')) | (1 << ('t'-'a')) | (1 << ('w'-'a')) | (1 << ('z'-'a')); - for (char c; (c = *fmt) != 0; fmt++) - { - if (c >= 'A' && c <= 'Z' && ((1 << (c - 'A')) & ignored_uppercase_mask) == 0) - return fmt + 1; - if (c >= 'a' && c <= 'z' && ((1 << (c - 'a')) & ignored_lowercase_mask) == 0) - return fmt + 1; - } - return fmt; -} - -// Extract the format out of a format string with leading or trailing decorations -// fmt = "blah blah" -> return fmt -// fmt = "%.3f" -> return fmt -// fmt = "hello %.3f" -> return fmt + 6 -// fmt = "%.3f hello" -> return buf written with "%.3f" -const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, size_t buf_size) -{ - const char* fmt_start = ImParseFormatFindStart(fmt); - if (fmt_start[0] != '%') - return fmt; - const char* fmt_end = ImParseFormatFindEnd(fmt_start); - if (fmt_end[0] == 0) // If we only have leading decoration, we don't need to copy the data. - return fmt_start; - ImStrncpy(buf, fmt_start, ImMin((size_t)(fmt_end - fmt_start) + 1, buf_size)); - return buf; -} - -// Sanitize format -// - Zero terminate so extra characters after format (e.g. "%f123") don't confuse atof/atoi -// - stb_sprintf.h supports several new modifiers which format numbers in a way that also makes them incompatible atof/atoi. -void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size) -{ - const char* fmt_end = ImParseFormatFindEnd(fmt_in); - IM_UNUSED(fmt_out_size); - IM_ASSERT((size_t)(fmt_end - fmt_in + 1) < fmt_out_size); // Format is too long, let us know if this happens to you! - while (fmt_in < fmt_end) - { - char c = *fmt_in++; - if (c != '\'' && c != '$' && c != '_') // Custom flags provided by stb_sprintf.h. POSIX 2008 also supports '. - *(fmt_out++) = c; - } - *fmt_out = 0; // Zero-terminate -} - -// - For scanning we need to remove all width and precision fields "%3.7f" -> "%f". BUT don't strip types like "%I64d" which includes digits. ! "%07I64d" -> "%I64d" -const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size) -{ - const char* fmt_end = ImParseFormatFindEnd(fmt_in); - const char* fmt_out_begin = fmt_out; - IM_UNUSED(fmt_out_size); - IM_ASSERT((size_t)(fmt_end - fmt_in + 1) < fmt_out_size); // Format is too long, let us know if this happens to you! - bool has_type = false; - while (fmt_in < fmt_end) - { - char c = *fmt_in++; - if (!has_type && ((c >= '0' && c <= '9') || c == '.')) - continue; - has_type |= ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); // Stop skipping digits - if (c != '\'' && c != '$' && c != '_') // Custom flags provided by stb_sprintf.h. POSIX 2008 also supports '. - *(fmt_out++) = c; - } - *fmt_out = 0; // Zero-terminate - return fmt_out_begin; -} - -template -static const char* ImAtoi(const char* src, TYPE* output) -{ - int negative = 0; - if (*src == '-') { negative = 1; src++; } - if (*src == '+') { src++; } - TYPE v = 0; - while (*src >= '0' && *src <= '9') - v = (v * 10) + (*src++ - '0'); - *output = negative ? -v : v; - return src; -} - -// Parse display precision back from the display format string -// FIXME: This is still used by some navigation code path to infer a minimum tweak step, but we should aim to rework widgets so it isn't needed. -int ImParseFormatPrecision(const char* fmt, int default_precision) -{ - fmt = ImParseFormatFindStart(fmt); - if (fmt[0] != '%') - return default_precision; - fmt++; - while (*fmt >= '0' && *fmt <= '9') - fmt++; - int precision = INT_MAX; - if (*fmt == '.') - { - fmt = ImAtoi(fmt + 1, &precision); - if (precision < 0 || precision > 99) - precision = default_precision; - } - if (*fmt == 'e' || *fmt == 'E') // Maximum precision with scientific notation - precision = -1; - if ((*fmt == 'g' || *fmt == 'G') && precision == INT_MAX) - precision = -1; - return (precision == INT_MAX) ? default_precision : precision; -} - -// Create text input in place of another active widget (e.g. used when doing a CTRL+Click on drag/slider widgets) -// FIXME: Facilitate using this in variety of other situations. -bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags) -{ - // On the first frame, g.TempInputTextId == 0, then on subsequent frames it becomes == id. - // We clear ActiveID on the first frame to allow the InputText() taking it back. - ImGuiContext& g = *GImGui; - const bool init = (g.TempInputId != id); - if (init) - ClearActiveID(); - - g.CurrentWindow->DC.CursorPos = bb.Min; - bool value_changed = InputTextEx(label, NULL, buf, buf_size, bb.GetSize(), flags | ImGuiInputTextFlags_MergedItem); - if (init) - { - // First frame we started displaying the InputText widget, we expect it to take the active id. - IM_ASSERT(g.ActiveId == id); - g.TempInputId = g.ActiveId; - } - return value_changed; -} - -static inline ImGuiInputTextFlags InputScalar_DefaultCharsFilter(ImGuiDataType data_type, const char* format) -{ - if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) - return ImGuiInputTextFlags_CharsScientific; - const char format_last_char = format[0] ? format[strlen(format) - 1] : 0; - return (format_last_char == 'x' || format_last_char == 'X') ? ImGuiInputTextFlags_CharsHexadecimal : ImGuiInputTextFlags_CharsDecimal; -} - -// Note that Drag/Slider functions are only forwarding the min/max values clamping values if the ImGuiSliderFlags_AlwaysClamp flag is set! -// This is intended: this way we allow CTRL+Click manual input to set a value out of bounds, for maximum flexibility. -// However this may not be ideal for all uses, as some user code may break on out of bound values. -bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min, const void* p_clamp_max) -{ - char fmt_buf[32]; - char data_buf[32]; - format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf)); - DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format); - ImStrTrimBlanks(data_buf); - - ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; - flags |= InputScalar_DefaultCharsFilter(data_type, format); - - bool value_changed = false; - if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags)) - { - // Backup old value - size_t data_type_size = DataTypeGetInfo(data_type)->Size; - ImGuiDataTypeTempStorage data_backup; - memcpy(&data_backup, p_data, data_type_size); - - // Apply new value (or operations) then clamp - DataTypeApplyFromText(data_buf, data_type, p_data, format); - if (p_clamp_min || p_clamp_max) - { - if (p_clamp_min && p_clamp_max && DataTypeCompare(data_type, p_clamp_min, p_clamp_max) > 0) - ImSwap(p_clamp_min, p_clamp_max); - DataTypeClamp(data_type, p_data, p_clamp_min, p_clamp_max); - } - - // Only mark as edited if new value is different - value_changed = memcmp(&data_backup, p_data, data_type_size) != 0; - if (value_changed) - MarkItemEdited(id); - } - return value_changed; -} - -// Note: p_data, p_step, p_step_fast are _pointers_ to a memory address holding the data. For an Input widget, p_step and p_step_fast are optional. -// Read code of e.g. InputFloat(), InputInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. -bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - ImGuiStyle& style = g.Style; - - if (format == NULL) - format = DataTypeGetInfo(data_type)->PrintFmt; - - char buf[64]; - DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); - - // Testing ActiveId as a minor optimization as filtering is not needed until active - if (g.ActiveId == 0 && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0) - flags |= InputScalar_DefaultCharsFilter(data_type, format); - flags |= ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string. - - bool value_changed = false; - if (p_step != NULL) - { - const float button_size = GetFrameHeight(); - - BeginGroup(); // The only purpose of the group here is to allow the caller to query item data e.g. IsItemActive() - PushID(label); - SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2)); - if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view - value_changed = DataTypeApplyFromText(buf, data_type, p_data, format); - - // Step buttons - const ImVec2 backup_frame_padding = style.FramePadding; - style.FramePadding.x = style.FramePadding.y; - ImGuiButtonFlags button_flags = ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups; - if (flags & ImGuiInputTextFlags_ReadOnly) - BeginDisabled(); - SameLine(0, style.ItemInnerSpacing.x); - if (ButtonEx("-", ImVec2(button_size, button_size), button_flags)) - { - DataTypeApplyOp(data_type, '-', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); - value_changed = true; - } - SameLine(0, style.ItemInnerSpacing.x); - if (ButtonEx("+", ImVec2(button_size, button_size), button_flags)) - { - DataTypeApplyOp(data_type, '+', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); - value_changed = true; - } - if (flags & ImGuiInputTextFlags_ReadOnly) - EndDisabled(); - - const char* label_end = FindRenderedTextEnd(label); - if (label != label_end) - { - SameLine(0, style.ItemInnerSpacing.x); - TextEx(label, label_end); - } - style.FramePadding = backup_frame_padding; - - PopID(); - EndGroup(); - } - else - { - if (InputText(label, buf, IM_ARRAYSIZE(buf), flags)) - value_changed = DataTypeApplyFromText(buf, data_type, p_data, format); - } - if (value_changed) - MarkItemEdited(g.LastItemData.ID); - - return value_changed; -} - -bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - bool value_changed = false; - BeginGroup(); - PushID(label); - PushMultiItemsWidths(components, CalcItemWidth()); - size_t type_size = GDataTypeInfo[data_type].Size; - for (int i = 0; i < components; i++) - { - PushID(i); - if (i > 0) - SameLine(0, g.Style.ItemInnerSpacing.x); - value_changed |= InputScalar("", data_type, p_data, p_step, p_step_fast, format, flags); - PopID(); - PopItemWidth(); - p_data = (void*)((char*)p_data + type_size); - } - PopID(); - - const char* label_end = FindRenderedTextEnd(label); - if (label != label_end) - { - SameLine(0.0f, g.Style.ItemInnerSpacing.x); - TextEx(label, label_end); - } - - EndGroup(); - return value_changed; -} - -bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags flags) -{ - flags |= ImGuiInputTextFlags_CharsScientific; - return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step > 0.0f ? &step : NULL), (void*)(step_fast > 0.0f ? &step_fast : NULL), format, flags); -} - -bool ImGui::InputFloat2(const char* label, float v[2], const char* format, ImGuiInputTextFlags flags) -{ - return InputScalarN(label, ImGuiDataType_Float, v, 2, NULL, NULL, format, flags); -} - -bool ImGui::InputFloat3(const char* label, float v[3], const char* format, ImGuiInputTextFlags flags) -{ - return InputScalarN(label, ImGuiDataType_Float, v, 3, NULL, NULL, format, flags); -} - -bool ImGui::InputFloat4(const char* label, float v[4], const char* format, ImGuiInputTextFlags flags) -{ - return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, flags); -} - -bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiInputTextFlags flags) -{ - // Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes. - const char* format = (flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d"; - return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step > 0 ? &step : NULL), (void*)(step_fast > 0 ? &step_fast : NULL), format, flags); -} - -bool ImGui::InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags) -{ - return InputScalarN(label, ImGuiDataType_S32, v, 2, NULL, NULL, "%d", flags); -} - -bool ImGui::InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags) -{ - return InputScalarN(label, ImGuiDataType_S32, v, 3, NULL, NULL, "%d", flags); -} - -bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags) -{ - return InputScalarN(label, ImGuiDataType_S32, v, 4, NULL, NULL, "%d", flags); -} - -bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags flags) -{ - flags |= ImGuiInputTextFlags_CharsScientific; - return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step > 0.0 ? &step : NULL), (void*)(step_fast > 0.0 ? &step_fast : NULL), format, flags); -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: InputText, InputTextMultiline, InputTextWithHint -//------------------------------------------------------------------------- -// - InputText() -// - InputTextWithHint() -// - InputTextMultiline() -// - InputTextGetCharInfo() [Internal] -// - InputTextReindexLines() [Internal] -// - InputTextReindexLinesRange() [Internal] -// - InputTextEx() [Internal] -// - DebugNodeInputTextState() [Internal] -//------------------------------------------------------------------------- - -bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) -{ - IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline() - return InputTextEx(label, NULL, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data); -} - -bool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) -{ - return InputTextEx(label, NULL, buf, (int)buf_size, size, flags | ImGuiInputTextFlags_Multiline, callback, user_data); -} - -bool ImGui::InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) -{ - IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline() or InputTextEx() manually if you need multi-line + hint. - return InputTextEx(label, hint, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data); -} - -static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end) -{ - int line_count = 0; - const char* s = text_begin; - while (char c = *s++) // We are only matching for \n so we can ignore UTF-8 decoding - if (c == '\n') - line_count++; - s--; - if (s[0] != '\n' && s[0] != '\r') - line_count++; - *out_text_end = s; - return line_count; -} - -static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset, bool stop_on_new_line) -{ - ImGuiContext& g = *GImGui; - ImFont* font = g.Font; - const float line_height = g.FontSize; - const float scale = line_height / font->FontSize; - - ImVec2 text_size = ImVec2(0, 0); - float line_width = 0.0f; - - const ImWchar* s = text_begin; - while (s < text_end) - { - unsigned int c = (unsigned int)(*s++); - if (c == '\n') - { - text_size.x = ImMax(text_size.x, line_width); - text_size.y += line_height; - line_width = 0.0f; - if (stop_on_new_line) - break; - continue; - } - if (c == '\r') - continue; - - const float char_width = font->GetCharAdvance((ImWchar)c) * scale; - line_width += char_width; - } - - if (text_size.x < line_width) - text_size.x = line_width; - - if (out_offset) - *out_offset = ImVec2(line_width, text_size.y + line_height); // offset allow for the possibility of sitting after a trailing \n - - if (line_width > 0 || text_size.y == 0.0f) // whereas size.y will ignore the trailing \n - text_size.y += line_height; - - if (remaining) - *remaining = s; - - return text_size; -} - -// Wrapper for stb_textedit.h to edit text (our wrapper is for: statically sized buffer, single-line, wchar characters. InputText converts between UTF-8 and wchar) -namespace ImStb -{ - -static int STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj) { return obj->CurLenW; } -static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { return obj->TextW[idx]; } -static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *GImGui; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); } -static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x200000 ? 0 : key; } -static ImWchar STB_TEXTEDIT_NEWLINE = '\n'; -static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* obj, int line_start_idx) -{ - const ImWchar* text = obj->TextW.Data; - const ImWchar* text_remaining = NULL; - const ImVec2 size = InputTextCalcTextSizeW(text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true); - r->x0 = 0.0f; - r->x1 = size.x; - r->baseline_y_delta = size.y; - r->ymin = 0.0f; - r->ymax = size.y; - r->num_chars = (int)(text_remaining - (text + line_start_idx)); -} - -// When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators. -static bool is_separator(unsigned int c) { return ImCharIsBlankW(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|' || c=='\n' || c=='\r'; } -static int is_word_boundary_from_right(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (is_separator(obj->TextW[idx - 1]) && !is_separator(obj->TextW[idx]) ) : 1; } -static int is_word_boundary_from_left(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (!is_separator(obj->TextW[idx - 1]) && is_separator(obj->TextW[idx])) : 1; } -static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx) { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; } -static int STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; } -static int STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; } -static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(ImGuiInputTextState* obj, int idx) { if (ImGui::GetIO().ConfigMacOSXBehaviors) return STB_TEXTEDIT_MOVEWORDRIGHT_MAC(obj, idx); else return STB_TEXTEDIT_MOVEWORDRIGHT_WIN(obj, idx); } -#define STB_TEXTEDIT_MOVEWORDLEFT STB_TEXTEDIT_MOVEWORDLEFT_IMPL // They need to be #define for stb_textedit.h -#define STB_TEXTEDIT_MOVEWORDRIGHT STB_TEXTEDIT_MOVEWORDRIGHT_IMPL - -static void STB_TEXTEDIT_DELETECHARS(ImGuiInputTextState* obj, int pos, int n) -{ - ImWchar* dst = obj->TextW.Data + pos; - - // We maintain our buffer length in both UTF-8 and wchar formats - obj->Edited = true; - obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n); - obj->CurLenW -= n; - - // Offset remaining text (FIXME-OPT: Use memmove) - const ImWchar* src = obj->TextW.Data + pos + n; - while (ImWchar c = *src++) - *dst++ = c; - *dst = '\0'; -} - -static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const ImWchar* new_text, int new_text_len) -{ - const bool is_resizable = (obj->Flags & ImGuiInputTextFlags_CallbackResize) != 0; - const int text_len = obj->CurLenW; - IM_ASSERT(pos <= text_len); - - const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len); - if (!is_resizable && (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufCapacityA)) - return false; - - // Grow internal buffer if needed - if (new_text_len + text_len + 1 > obj->TextW.Size) - { - if (!is_resizable) - return false; - IM_ASSERT(text_len < obj->TextW.Size); - obj->TextW.resize(text_len + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1); - } - - ImWchar* text = obj->TextW.Data; - if (pos != text_len) - memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar)); - memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar)); - - obj->Edited = true; - obj->CurLenW += new_text_len; - obj->CurLenA += new_text_len_utf8; - obj->TextW[obj->CurLenW] = '\0'; - - return true; -} - -// We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols) -#define STB_TEXTEDIT_K_LEFT 0x200000 // keyboard input to move cursor left -#define STB_TEXTEDIT_K_RIGHT 0x200001 // keyboard input to move cursor right -#define STB_TEXTEDIT_K_UP 0x200002 // keyboard input to move cursor up -#define STB_TEXTEDIT_K_DOWN 0x200003 // keyboard input to move cursor down -#define STB_TEXTEDIT_K_LINESTART 0x200004 // keyboard input to move cursor to start of line -#define STB_TEXTEDIT_K_LINEEND 0x200005 // keyboard input to move cursor to end of line -#define STB_TEXTEDIT_K_TEXTSTART 0x200006 // keyboard input to move cursor to start of text -#define STB_TEXTEDIT_K_TEXTEND 0x200007 // keyboard input to move cursor to end of text -#define STB_TEXTEDIT_K_DELETE 0x200008 // keyboard input to delete selection or character under cursor -#define STB_TEXTEDIT_K_BACKSPACE 0x200009 // keyboard input to delete selection or character left of cursor -#define STB_TEXTEDIT_K_UNDO 0x20000A // keyboard input to perform undo -#define STB_TEXTEDIT_K_REDO 0x20000B // keyboard input to perform redo -#define STB_TEXTEDIT_K_WORDLEFT 0x20000C // keyboard input to move cursor left one word -#define STB_TEXTEDIT_K_WORDRIGHT 0x20000D // keyboard input to move cursor right one word -#define STB_TEXTEDIT_K_PGUP 0x20000E // keyboard input to move cursor up a page -#define STB_TEXTEDIT_K_PGDOWN 0x20000F // keyboard input to move cursor down a page -#define STB_TEXTEDIT_K_SHIFT 0x400000 - -#define STB_TEXTEDIT_IMPLEMENTATION -#include "imstb_textedit.h" - -// stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling -// the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?) -static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len) -{ - stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len); - ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW); - if (text_len <= 0) - return; - if (ImStb::STB_TEXTEDIT_INSERTCHARS(str, 0, text, text_len)) - { - state->cursor = text_len; - state->has_preferred_x = 0; - return; - } - IM_ASSERT(0); // Failed to insert character, normally shouldn't happen because of how we currently use stb_textedit_replace() -} - -} // namespace ImStb - -void ImGuiInputTextState::OnKeyPressed(int key) -{ - stb_textedit_key(this, &Stb, key); - CursorFollow = true; - CursorAnimReset(); -} - -ImGuiInputTextCallbackData::ImGuiInputTextCallbackData() -{ - memset(this, 0, sizeof(*this)); -} - -// Public API to manipulate UTF-8 text -// We expose UTF-8 to the user (unlike the STB_TEXTEDIT_* functions which are manipulating wchar) -// FIXME: The existence of this rarely exercised code path is a bit of a nuisance. -void ImGuiInputTextCallbackData::DeleteChars(int pos, int bytes_count) -{ - IM_ASSERT(pos + bytes_count <= BufTextLen); - char* dst = Buf + pos; - const char* src = Buf + pos + bytes_count; - while (char c = *src++) - *dst++ = c; - *dst = '\0'; - - if (CursorPos >= pos + bytes_count) - CursorPos -= bytes_count; - else if (CursorPos >= pos) - CursorPos = pos; - SelectionStart = SelectionEnd = CursorPos; - BufDirty = true; - BufTextLen -= bytes_count; -} - -void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end) -{ - const bool is_resizable = (Flags & ImGuiInputTextFlags_CallbackResize) != 0; - const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)strlen(new_text); - if (new_text_len + BufTextLen >= BufSize) - { - if (!is_resizable) - return; - - // Contrary to STB_TEXTEDIT_INSERTCHARS() this is working in the UTF8 buffer, hence the mildly similar code (until we remove the U16 buffer altogether!) - ImGuiContext& g = *GImGui; - ImGuiInputTextState* edit_state = &g.InputTextState; - IM_ASSERT(edit_state->ID != 0 && g.ActiveId == edit_state->ID); - IM_ASSERT(Buf == edit_state->TextA.Data); - int new_buf_size = BufTextLen + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1; - edit_state->TextA.reserve(new_buf_size + 1); - Buf = edit_state->TextA.Data; - BufSize = edit_state->BufCapacityA = new_buf_size; - } - - if (BufTextLen != pos) - memmove(Buf + pos + new_text_len, Buf + pos, (size_t)(BufTextLen - pos)); - memcpy(Buf + pos, new_text, (size_t)new_text_len * sizeof(char)); - Buf[BufTextLen + new_text_len] = '\0'; - - if (CursorPos >= pos) - CursorPos += new_text_len; - SelectionStart = SelectionEnd = CursorPos; - BufDirty = true; - BufTextLen += new_text_len; -} - -// Return false to discard a character. -static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source) -{ - IM_ASSERT(input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Clipboard); - unsigned int c = *p_char; - - // Filter non-printable (NB: isprint is unreliable! see #2467) - bool apply_named_filters = true; - if (c < 0x20) - { - bool pass = false; - pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code) - pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput)); - if (!pass) - return false; - apply_named_filters = false; // Override named filters below so newline and tabs can still be inserted. - } - - if (input_source != ImGuiInputSource_Clipboard) - { - // We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817) - if (c == 127) - return false; - - // Filter private Unicode range. GLFW on OSX seems to send private characters for special keys like arrow keys (FIXME) - if (c >= 0xE000 && c <= 0xF8FF) - return false; - } - - // Filter Unicode ranges we are not handling in this build - if (c > IM_UNICODE_CODEPOINT_MAX) - return false; - - // Generic named filters - if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific))) - { - // The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf to use e.g. ',' instead of '.'. - // The standard mandate that programs starts in the "C" locale where the decimal point is '.'. - // We don't really intend to provide widespread support for it, but out of empathy for people stuck with using odd API, we support the bare minimum aka overriding the decimal point. - // Change the default decimal_point with: - // ImGui::GetCurrentContext()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point; - // Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions. - ImGuiContext& g = *GImGui; - const unsigned c_decimal_point = (unsigned int)g.PlatformLocaleDecimalPoint; - - // Allow 0-9 . - + * / - if (flags & ImGuiInputTextFlags_CharsDecimal) - if (!(c >= '0' && c <= '9') && (c != c_decimal_point) && (c != '-') && (c != '+') && (c != '*') && (c != '/')) - return false; - - // Allow 0-9 . - + * / e E - if (flags & ImGuiInputTextFlags_CharsScientific) - if (!(c >= '0' && c <= '9') && (c != c_decimal_point) && (c != '-') && (c != '+') && (c != '*') && (c != '/') && (c != 'e') && (c != 'E')) - return false; - - // Allow 0-9 a-F A-F - if (flags & ImGuiInputTextFlags_CharsHexadecimal) - if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) - return false; - - // Turn a-z into A-Z - if (flags & ImGuiInputTextFlags_CharsUppercase) - if (c >= 'a' && c <= 'z') - *p_char = (c += (unsigned int)('A' - 'a')); - - if (flags & ImGuiInputTextFlags_CharsNoBlank) - if (ImCharIsBlankW(c)) - return false; - } - - // Custom callback filter - if (flags & ImGuiInputTextFlags_CallbackCharFilter) - { - ImGuiInputTextCallbackData callback_data; - memset(&callback_data, 0, sizeof(ImGuiInputTextCallbackData)); - callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter; - callback_data.EventChar = (ImWchar)c; - callback_data.Flags = flags; - callback_data.UserData = user_data; - if (callback(&callback_data) != 0) - return false; - *p_char = callback_data.EventChar; - if (!callback_data.EventChar) - return false; - } - - return true; -} - -// Find the shortest single replacement we can make to get the new text from the old text. -// Important: needs to be run before TextW is rewritten with the new characters because calling STB_TEXTEDIT_GETCHAR() at the end. -// FIXME: Ideally we should transition toward (1) making InsertChars()/DeleteChars() update undo-stack (2) discourage (and keep reconcile) or obsolete (and remove reconcile) accessing buffer directly. -static void InputTextReconcileUndoStateAfterUserCallback(ImGuiInputTextState* state, const char* new_buf_a, int new_length_a) -{ - ImGuiContext& g = *GImGui; - const ImWchar* old_buf = state->TextW.Data; - const int old_length = state->CurLenW; - const int new_length = ImTextCountCharsFromUtf8(new_buf_a, new_buf_a + new_length_a); - g.TempBuffer.reserve_discard((new_length + 1) * sizeof(ImWchar)); - ImWchar* new_buf = (ImWchar*)(void*)g.TempBuffer.Data; - ImTextStrFromUtf8(new_buf, new_length + 1, new_buf_a, new_buf_a + new_length_a); - - const int shorter_length = ImMin(old_length, new_length); - int first_diff; - for (first_diff = 0; first_diff < shorter_length; first_diff++) - if (old_buf[first_diff] != new_buf[first_diff]) - break; - if (first_diff == old_length && first_diff == new_length) - return; - - int old_last_diff = old_length - 1; - int new_last_diff = new_length - 1; - for (; old_last_diff >= first_diff && new_last_diff >= first_diff; old_last_diff--, new_last_diff--) - if (old_buf[old_last_diff] != new_buf[new_last_diff]) - break; - - const int insert_len = new_last_diff - first_diff + 1; - const int delete_len = old_last_diff - first_diff + 1; - if (insert_len > 0 || delete_len > 0) - if (STB_TEXTEDIT_CHARTYPE* p = stb_text_createundo(&state->Stb.undostate, first_diff, delete_len, insert_len)) - for (int i = 0; i < delete_len; i++) - p[i] = ImStb::STB_TEXTEDIT_GETCHAR(state, first_diff + i); -} - -// Edit a string of text -// - buf_size account for the zero-terminator, so a buf_size of 6 can hold "Hello" but not "Hello!". -// This is so we can easily call InputText() on static arrays using ARRAYSIZE() and to match -// Note that in std::string world, capacity() would omit 1 byte used by the zero-terminator. -// - When active, hold on a privately held copy of the text (and apply back to 'buf'). So changing 'buf' while the InputText is active has no effect. -// - If you want to use ImGui::InputText() with std::string, see misc/cpp/imgui_stdlib.h -// (FIXME: Rather confusing and messy function, among the worse part of our codebase, expecting to rewrite a V2 at some point.. Partly because we are -// doing UTF8 > U16 > UTF8 conversions on the go to easily interface with stb_textedit. Ideally should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188) -bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* callback_user_data) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - IM_ASSERT(buf != NULL && buf_size >= 0); - IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackHistory) && (flags & ImGuiInputTextFlags_Multiline))); // Can't use both together (they both use up/down keys) - IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackCompletion) && (flags & ImGuiInputTextFlags_AllowTabInput))); // Can't use both together (they both use tab key) - - ImGuiContext& g = *GImGui; - ImGuiIO& io = g.IO; - const ImGuiStyle& style = g.Style; - - const bool RENDER_SELECTION_WHEN_INACTIVE = false; - const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0; - const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0; - const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0; - const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0; - const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0; - if (is_resizable) - IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag! - - if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope (including the scrollbar) - BeginGroup(); - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - const ImVec2 frame_size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? g.FontSize * 8.0f : label_size.y) + style.FramePadding.y * 2.0f); // Arbitrary default of 8 lines high for multi-line - const ImVec2 total_size = ImVec2(frame_size.x + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), frame_size.y); - - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); - const ImRect total_bb(frame_bb.Min, frame_bb.Min + total_size); - - ImGuiWindow* draw_window = window; - ImVec2 inner_size = frame_size; - ImGuiItemStatusFlags item_status_flags = 0; - ImGuiLastItemData item_data_backup; - if (is_multiline) - { - ImVec2 backup_pos = window->DC.CursorPos; - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable)) - { - EndGroup(); - return false; - } - item_status_flags = g.LastItemData.StatusFlags; - item_data_backup = g.LastItemData; - window->DC.CursorPos = backup_pos; - - // We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug. - // FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre. - PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); - PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); - PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); - PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges - bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove); - PopStyleVar(3); - PopStyleColor(); - if (!child_visible) - { - EndChild(); - EndGroup(); - return false; - } - draw_window = g.CurrentWindow; // Child window - draw_window->DC.NavLayersActiveMaskNext |= (1 << draw_window->DC.NavLayerCurrent); // This is to ensure that EndChild() will display a navigation highlight so we can "enter" into it. - draw_window->DC.CursorPos += style.FramePadding; - inner_size.x -= draw_window->ScrollbarSizes.x; - } - else - { - // Support for internal ImGuiInputTextFlags_MergedItem flag, which could be redesigned as an ItemFlags if needed (with test performed in ItemAdd) - ItemSize(total_bb, style.FramePadding.y); - if (!(flags & ImGuiInputTextFlags_MergedItem)) - if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable)) - return false; - item_status_flags = g.LastItemData.StatusFlags; - } - const bool hovered = ItemHoverable(frame_bb, id); - if (hovered) - g.MouseCursor = ImGuiMouseCursor_TextInput; - - // We are only allowed to access the state if we are already the active widget. - ImGuiInputTextState* state = GetInputTextState(id); - - const bool input_requested_by_tabbing = (item_status_flags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; - const bool input_requested_by_nav = (g.ActiveId != id) && ((g.NavActivateInputId == id) || (g.NavActivateId == id && g.NavInputSource == ImGuiInputSource_Keyboard)); - - const bool user_clicked = hovered && io.MouseClicked[0]; - const bool user_scroll_finish = is_multiline && state != NULL && g.ActiveId == 0 && g.ActiveIdPreviousFrame == GetWindowScrollbarID(draw_window, ImGuiAxis_Y); - const bool user_scroll_active = is_multiline && state != NULL && g.ActiveId == GetWindowScrollbarID(draw_window, ImGuiAxis_Y); - bool clear_active_id = false; - bool select_all = false; - - float scroll_y = is_multiline ? draw_window->Scroll.y : FLT_MAX; - - const bool init_changed_specs = (state != NULL && state->Stb.single_line != !is_multiline); - const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav || input_requested_by_tabbing); - const bool init_state = (init_make_active || user_scroll_active); - if ((init_state && g.ActiveId != id) || init_changed_specs) - { - // Access state even if we don't own it yet. - state = &g.InputTextState; - state->CursorAnimReset(); - - // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar) - // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode) - const int buf_len = (int)strlen(buf); - state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string. - memcpy(state->InitialTextA.Data, buf, buf_len + 1); - - // Preserve cursor position and undo/redo stack if we come back to same widget - // FIXME: Since we reworked this on 2022/06, may want to differenciate recycle_cursor vs recycle_undostate? - bool recycle_state = (state->ID == id && !init_changed_specs); - if (recycle_state && (state->CurLenA != buf_len || (state->TextAIsValid && strncmp(state->TextA.Data, buf, buf_len) != 0))) - recycle_state = false; - - // Start edition - const char* buf_end = NULL; - state->ID = id; - state->TextW.resize(buf_size + 1); // wchar count <= UTF-8 count. we use +1 to make sure that .Data is always pointing to at least an empty string. - state->TextA.resize(0); - state->TextAIsValid = false; // TextA is not valid yet (we will display buf until then) - state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, buf_size, buf, NULL, &buf_end); - state->CurLenA = (int)(buf_end - buf); // We can't get the result from ImStrncpy() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8. - - if (recycle_state) - { - // Recycle existing cursor/selection/undo stack but clamp position - // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler. - state->CursorClamp(); - } - else - { - state->ScrollX = 0.0f; - stb_textedit_initialize_state(&state->Stb, !is_multiline); - } - - if (!is_multiline) - { - if (flags & ImGuiInputTextFlags_AutoSelectAll) - select_all = true; - if (input_requested_by_nav && (!recycle_state || !(g.NavActivateFlags & ImGuiActivateFlags_TryToPreserveState))) - select_all = true; - if (input_requested_by_tabbing || (user_clicked && io.KeyCtrl)) - select_all = true; - } - - if (flags & ImGuiInputTextFlags_AlwaysOverwrite) - state->Stb.insert_mode = 1; // stb field name is indeed incorrect (see #2863) - } - - if (g.ActiveId != id && init_make_active) - { - IM_ASSERT(state && state->ID == id); - SetActiveID(id, window); - SetFocusID(id, window); - FocusWindow(window); - - // Declare our inputs - g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); - if (is_multiline || (flags & ImGuiInputTextFlags_CallbackHistory)) - g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); - SetActiveIdUsingKey(ImGuiKey_Escape); - SetActiveIdUsingKey(ImGuiKey_NavGamepadCancel); - SetActiveIdUsingKey(ImGuiKey_Home); - SetActiveIdUsingKey(ImGuiKey_End); - if (is_multiline) - { - SetActiveIdUsingKey(ImGuiKey_PageUp); - SetActiveIdUsingKey(ImGuiKey_PageDown); - } - if (flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_AllowTabInput)) // Disable keyboard tabbing out as we will use the \t character. - { - SetActiveIdUsingKey(ImGuiKey_Tab); - } - } - - // We have an edge case if ActiveId was set through another widget (e.g. widget being swapped), clear id immediately (don't wait until the end of the function) - if (g.ActiveId == id && state == NULL) - ClearActiveID(); - - // Release focus when we click outside - if (g.ActiveId == id && io.MouseClicked[0] && !init_state && !init_make_active) //-V560 - clear_active_id = true; - - // Lock the decision of whether we are going to take the path displaying the cursor or selection - const bool render_cursor = (g.ActiveId == id) || (state && user_scroll_active); - bool render_selection = state && (state->HasSelection() || select_all) && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor); - bool value_changed = false; - bool validated = false; - - // When read-only we always use the live data passed to the function - // FIXME-OPT: Because our selection/cursor code currently needs the wide text we need to convert it when active, which is not ideal :( - if (is_readonly && state != NULL && (render_cursor || render_selection)) - { - const char* buf_end = NULL; - state->TextW.resize(buf_size + 1); - state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, buf, NULL, &buf_end); - state->CurLenA = (int)(buf_end - buf); - state->CursorClamp(); - render_selection &= state->HasSelection(); - } - - // Select the buffer to render. - const bool buf_display_from_state = (render_cursor || render_selection || g.ActiveId == id) && !is_readonly && state && state->TextAIsValid; - const bool is_displaying_hint = (hint != NULL && (buf_display_from_state ? state->TextA.Data : buf)[0] == 0); - - // Password pushes a temporary font with only a fallback glyph - if (is_password && !is_displaying_hint) - { - const ImFontGlyph* glyph = g.Font->FindGlyph('*'); - ImFont* password_font = &g.InputTextPasswordFont; - password_font->FontSize = g.Font->FontSize; - password_font->Scale = g.Font->Scale; - password_font->Ascent = g.Font->Ascent; - password_font->Descent = g.Font->Descent; - password_font->ContainerAtlas = g.Font->ContainerAtlas; - password_font->FallbackGlyph = glyph; - password_font->FallbackAdvanceX = glyph->AdvanceX; - IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexAdvanceX.empty() && password_font->IndexLookup.empty()); - PushFont(password_font); - } - - // Process mouse inputs and character inputs - int backup_current_text_length = 0; - if (g.ActiveId == id) - { - IM_ASSERT(state != NULL); - backup_current_text_length = state->CurLenA; - state->Edited = false; - state->BufCapacityA = buf_size; - state->Flags = flags; - - // Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget. - // Down the line we should have a cleaner library-wide concept of Selected vs Active. - g.ActiveIdAllowOverlap = !io.MouseDown[0]; - g.WantTextInputNextFrame = 1; - - // Edit in progress - const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + state->ScrollX; - const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y) : (g.FontSize * 0.5f)); - - const bool is_osx = io.ConfigMacOSXBehaviors; - if (select_all) - { - state->SelectAll(); - state->SelectedAllMouseLock = true; - } - else if (hovered && io.MouseClickedCount[0] >= 2 && !io.KeyShift) - { - stb_textedit_click(state, &state->Stb, mouse_x, mouse_y); - const int multiclick_count = (io.MouseClickedCount[0] - 2); - if ((multiclick_count % 2) == 0) - { - // Double-click: Select word - // We always use the "Mac" word advance for double-click select vs CTRL+Right which use the platform dependent variant: - // FIXME: There are likely many ways to improve this behavior, but there's no "right" behavior (depends on use-case, software, OS) - const bool is_bol = (state->Stb.cursor == 0) || ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb.cursor - 1) == '\n'; - if (STB_TEXT_HAS_SELECTION(&state->Stb) || !is_bol) - state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT); - //state->OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT); - if (!STB_TEXT_HAS_SELECTION(&state->Stb)) - ImStb::stb_textedit_prep_selection_at_cursor(&state->Stb); - state->Stb.cursor = ImStb::STB_TEXTEDIT_MOVEWORDRIGHT_MAC(state, state->Stb.cursor); - state->Stb.select_end = state->Stb.cursor; - ImStb::stb_textedit_clamp(state, &state->Stb); - } - else - { - // Triple-click: Select line - const bool is_eol = ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb.cursor) == '\n'; - state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART); - state->OnKeyPressed(STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT); - state->OnKeyPressed(STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT); - if (!is_eol && is_multiline) - { - ImSwap(state->Stb.select_start, state->Stb.select_end); - state->Stb.cursor = state->Stb.select_end; - } - state->CursorFollow = false; - } - state->CursorAnimReset(); - } - else if (io.MouseClicked[0] && !state->SelectedAllMouseLock) - { - // FIXME: unselect on late click could be done release? - if (hovered) - { - stb_textedit_click(state, &state->Stb, mouse_x, mouse_y); - state->CursorAnimReset(); - } - } - else if (io.MouseDown[0] && !state->SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f)) - { - stb_textedit_drag(state, &state->Stb, mouse_x, mouse_y); - state->CursorAnimReset(); - state->CursorFollow = true; - } - if (state->SelectedAllMouseLock && !io.MouseDown[0]) - state->SelectedAllMouseLock = false; - - // We expect backends to emit a Tab key but some also emit a Tab character which we ignore (#2467, #1336) - // (For Tab and Enter: Win32/SFML/Allegro are sending both keys and chars, GLFW and SDL are only sending keys. For Space they all send all threes) - const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper); - if ((flags & ImGuiInputTextFlags_AllowTabInput) && IsKeyPressed(ImGuiKey_Tab) && !ignore_char_inputs && !io.KeyShift && !is_readonly) - { - unsigned int c = '\t'; // Insert TAB - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) - state->OnKeyPressed((int)c); - } - - // Process regular text input (before we check for Return because using some IME will effectively send a Return?) - // We ignore CTRL inputs, but need to allow ALT+CTRL as some keyboards (e.g. German) use AltGR (which _is_ Alt+Ctrl) to input certain characters. - if (io.InputQueueCharacters.Size > 0) - { - if (!ignore_char_inputs && !is_readonly && !input_requested_by_nav) - for (int n = 0; n < io.InputQueueCharacters.Size; n++) - { - // Insert character if they pass filtering - unsigned int c = (unsigned int)io.InputQueueCharacters[n]; - if (c == '\t') // Skip Tab, see above. - continue; - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) - state->OnKeyPressed((int)c); - } - - // Consume characters - io.InputQueueCharacters.resize(0); - } - } - - // Process other shortcuts/key-presses - bool cancel_edit = false; - if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id) - { - IM_ASSERT(state != NULL); - - const int row_count_per_page = ImMax((int)((inner_size.y - style.FramePadding.y) / g.FontSize), 1); - state->Stb.row_count_per_page = row_count_per_page; - - const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0); - const bool is_osx = io.ConfigMacOSXBehaviors; - const bool is_osx_shift_shortcut = is_osx && (io.KeyMods == (ImGuiModFlags_Super | ImGuiModFlags_Shift)); - const bool is_wordmove_key_down = is_osx ? io.KeyAlt : io.KeyCtrl; // OS X style: Text editing cursor movement using Alt instead of Ctrl - const bool is_startend_key_down = is_osx && io.KeySuper && !io.KeyCtrl && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End - const bool is_ctrl_key_only = (io.KeyMods == ImGuiModFlags_Ctrl); - const bool is_shift_key_only = (io.KeyMods == ImGuiModFlags_Shift); - const bool is_shortcut_key = g.IO.ConfigMacOSXBehaviors ? (io.KeyMods == ImGuiModFlags_Super) : (io.KeyMods == ImGuiModFlags_Ctrl); - - const bool is_cut = ((is_shortcut_key && IsKeyPressed(ImGuiKey_X)) || (is_shift_key_only && IsKeyPressed(ImGuiKey_Delete))) && !is_readonly && !is_password && (!is_multiline || state->HasSelection()); - const bool is_copy = ((is_shortcut_key && IsKeyPressed(ImGuiKey_C)) || (is_ctrl_key_only && IsKeyPressed(ImGuiKey_Insert))) && !is_password && (!is_multiline || state->HasSelection()); - const bool is_paste = ((is_shortcut_key && IsKeyPressed(ImGuiKey_V)) || (is_shift_key_only && IsKeyPressed(ImGuiKey_Insert))) && !is_readonly; - const bool is_undo = ((is_shortcut_key && IsKeyPressed(ImGuiKey_Z)) && !is_readonly && is_undoable); - const bool is_redo = ((is_shortcut_key && IsKeyPressed(ImGuiKey_Y)) || (is_osx_shift_shortcut && IsKeyPressed(ImGuiKey_Z))) && !is_readonly && is_undoable; - const bool is_select_all = is_shortcut_key && IsKeyPressed(ImGuiKey_A); - - // We allow validate/cancel with Nav source (gamepad) to makes it easier to undo an accidental NavInput press with no keyboard wired, but otherwise it isn't very useful. - const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; - const bool is_enter_pressed = IsKeyPressed(ImGuiKey_Enter, true) || IsKeyPressed(ImGuiKey_KeypadEnter, true); - const bool is_gamepad_validate = nav_gamepad_active && (IsKeyPressed(ImGuiKey_NavGamepadActivate, false) || IsKeyPressed(ImGuiKey_NavGamepadInput, false)); - const bool is_cancel = IsKeyPressed(ImGuiKey_Escape, false) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, false)); - - if (IsKeyPressed(ImGuiKey_LeftArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); } - else if (IsKeyPressed(ImGuiKey_RightArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); } - else if (IsKeyPressed(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); } - else if (IsKeyPressed(ImGuiKey_DownArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); } - else if (IsKeyPressed(ImGuiKey_PageUp) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGUP | k_mask); scroll_y -= row_count_per_page * g.FontSize; } - else if (IsKeyPressed(ImGuiKey_PageDown) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGDOWN | k_mask); scroll_y += row_count_per_page * g.FontSize; } - else if (IsKeyPressed(ImGuiKey_Home)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); } - else if (IsKeyPressed(ImGuiKey_End)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); } - else if (IsKeyPressed(ImGuiKey_Delete) && !is_readonly && !is_cut) { state->OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); } - else if (IsKeyPressed(ImGuiKey_Backspace) && !is_readonly) - { - if (!state->HasSelection()) - { - if (is_wordmove_key_down) - state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT); - else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) - state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT); - } - state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask); - } - else if (is_enter_pressed || is_gamepad_validate) - { - // Determine if we turn Enter into a \n character - bool ctrl_enter_for_new_line = (flags & ImGuiInputTextFlags_CtrlEnterForNewLine) != 0; - if (!is_multiline || is_gamepad_validate || (ctrl_enter_for_new_line && !io.KeyCtrl) || (!ctrl_enter_for_new_line && io.KeyCtrl)) - { - validated = true; - if (io.ConfigInputTextEnterKeepActive && !is_multiline) - state->SelectAll(); // No need to scroll - else - clear_active_id = true; - } - else if (!is_readonly) - { - unsigned int c = '\n'; // Insert new line - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) - state->OnKeyPressed((int)c); - } - } - else if (is_cancel) - { - clear_active_id = cancel_edit = true; - } - else if (is_undo || is_redo) - { - state->OnKeyPressed(is_undo ? STB_TEXTEDIT_K_UNDO : STB_TEXTEDIT_K_REDO); - state->ClearSelection(); - } - else if (is_select_all) - { - state->SelectAll(); - state->CursorFollow = true; - } - else if (is_cut || is_copy) - { - // Cut, Copy - if (io.SetClipboardTextFn) - { - const int ib = state->HasSelection() ? ImMin(state->Stb.select_start, state->Stb.select_end) : 0; - const int ie = state->HasSelection() ? ImMax(state->Stb.select_start, state->Stb.select_end) : state->CurLenW; - const int clipboard_data_len = ImTextCountUtf8BytesFromStr(state->TextW.Data + ib, state->TextW.Data + ie) + 1; - char* clipboard_data = (char*)IM_ALLOC(clipboard_data_len * sizeof(char)); - ImTextStrToUtf8(clipboard_data, clipboard_data_len, state->TextW.Data + ib, state->TextW.Data + ie); - SetClipboardText(clipboard_data); - MemFree(clipboard_data); - } - if (is_cut) - { - if (!state->HasSelection()) - state->SelectAll(); - state->CursorFollow = true; - stb_textedit_cut(state, &state->Stb); - } - } - else if (is_paste) - { - if (const char* clipboard = GetClipboardText()) - { - // Filter pasted buffer - const int clipboard_len = (int)strlen(clipboard); - ImWchar* clipboard_filtered = (ImWchar*)IM_ALLOC((clipboard_len + 1) * sizeof(ImWchar)); - int clipboard_filtered_len = 0; - for (const char* s = clipboard; *s; ) - { - unsigned int c; - s += ImTextCharFromUtf8(&c, s, NULL); - if (c == 0) - break; - if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard)) - continue; - clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; - } - clipboard_filtered[clipboard_filtered_len] = 0; - if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation - { - stb_textedit_paste(state, &state->Stb, clipboard_filtered, clipboard_filtered_len); - state->CursorFollow = true; - } - MemFree(clipboard_filtered); - } - } - - // Update render selection flag after events have been handled, so selection highlight can be displayed during the same frame. - render_selection |= state->HasSelection() && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor); - } - - // Process callbacks and apply result back to user's buffer. - const char* apply_new_text = NULL; - int apply_new_text_length = 0; - if (g.ActiveId == id) - { - IM_ASSERT(state != NULL); - if (cancel_edit) - { - // Restore initial value. Only return true if restoring to the initial value changes the current buffer contents. - if (!is_readonly && strcmp(buf, state->InitialTextA.Data) != 0) - { - // Push records into the undo stack so we can CTRL+Z the revert operation itself - apply_new_text = state->InitialTextA.Data; - apply_new_text_length = state->InitialTextA.Size - 1; - ImVector w_text; - if (apply_new_text_length > 0) - { - w_text.resize(ImTextCountCharsFromUtf8(apply_new_text, apply_new_text + apply_new_text_length) + 1); - ImTextStrFromUtf8(w_text.Data, w_text.Size, apply_new_text, apply_new_text + apply_new_text_length); - } - stb_textedit_replace(state, &state->Stb, w_text.Data, (apply_new_text_length > 0) ? (w_text.Size - 1) : 0); - } - } - - // Apply ASCII value - if (!is_readonly) - { - state->TextAIsValid = true; - state->TextA.resize(state->TextW.Size * 4 + 1); - ImTextStrToUtf8(state->TextA.Data, state->TextA.Size, state->TextW.Data, NULL); - } - - // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. - // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. - // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize). - const bool apply_edit_back_to_user_buffer = !cancel_edit || (validated && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0); - if (apply_edit_back_to_user_buffer) - { - // Apply new value immediately - copy modified buffer back - // Note that as soon as the input box is active, the in-widget value gets priority over any underlying modification of the input buffer - // FIXME: We actually always render 'buf' when calling DrawList->AddText, making the comment above incorrect. - // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks. - - // User callback - if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackEdit | ImGuiInputTextFlags_CallbackAlways)) != 0) - { - IM_ASSERT(callback != NULL); - - // The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment. - ImGuiInputTextFlags event_flag = 0; - ImGuiKey event_key = ImGuiKey_None; - if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && IsKeyPressed(ImGuiKey_Tab)) - { - event_flag = ImGuiInputTextFlags_CallbackCompletion; - event_key = ImGuiKey_Tab; - } - else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressed(ImGuiKey_UpArrow)) - { - event_flag = ImGuiInputTextFlags_CallbackHistory; - event_key = ImGuiKey_UpArrow; - } - else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressed(ImGuiKey_DownArrow)) - { - event_flag = ImGuiInputTextFlags_CallbackHistory; - event_key = ImGuiKey_DownArrow; - } - else if ((flags & ImGuiInputTextFlags_CallbackEdit) && state->Edited) - { - event_flag = ImGuiInputTextFlags_CallbackEdit; - } - else if (flags & ImGuiInputTextFlags_CallbackAlways) - { - event_flag = ImGuiInputTextFlags_CallbackAlways; - } - - if (event_flag) - { - ImGuiInputTextCallbackData callback_data; - memset(&callback_data, 0, sizeof(ImGuiInputTextCallbackData)); - callback_data.EventFlag = event_flag; - callback_data.Flags = flags; - callback_data.UserData = callback_user_data; - - char* callback_buf = is_readonly ? buf : state->TextA.Data; - callback_data.EventKey = event_key; - callback_data.Buf = callback_buf; - callback_data.BufTextLen = state->CurLenA; - callback_data.BufSize = state->BufCapacityA; - callback_data.BufDirty = false; - - // We have to convert from wchar-positions to UTF-8-positions, which can be pretty slow (an incentive to ditch the ImWchar buffer, see https://github.com/nothings/stb/issues/188) - ImWchar* text = state->TextW.Data; - const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + state->Stb.cursor); - const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_start); - const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_end); - - // Call user code - callback(&callback_data); - - // Read back what user may have modified - callback_buf = is_readonly ? buf : state->TextA.Data; // Pointer may have been invalidated by a resize callback - IM_ASSERT(callback_data.Buf == callback_buf); // Invalid to modify those fields - IM_ASSERT(callback_data.BufSize == state->BufCapacityA); - IM_ASSERT(callback_data.Flags == flags); - const bool buf_dirty = callback_data.BufDirty; - if (callback_data.CursorPos != utf8_cursor_pos || buf_dirty) { state->Stb.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); state->CursorFollow = true; } - if (callback_data.SelectionStart != utf8_selection_start || buf_dirty) { state->Stb.select_start = (callback_data.SelectionStart == callback_data.CursorPos) ? state->Stb.cursor : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); } - if (callback_data.SelectionEnd != utf8_selection_end || buf_dirty) { state->Stb.select_end = (callback_data.SelectionEnd == callback_data.SelectionStart) ? state->Stb.select_start : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); } - if (buf_dirty) - { - IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text! - InputTextReconcileUndoStateAfterUserCallback(state, callback_data.Buf, callback_data.BufTextLen); // FIXME: Move the rest of this block inside function and rename to InputTextReconcileStateAfterUserCallback() ? - if (callback_data.BufTextLen > backup_current_text_length && is_resizable) - state->TextW.resize(state->TextW.Size + (callback_data.BufTextLen - backup_current_text_length)); // Worse case scenario resize - state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, callback_data.Buf, NULL); - state->CurLenA = callback_data.BufTextLen; // Assume correct length and valid UTF-8 from user, saves us an extra strlen() - state->CursorAnimReset(); - } - } - } - - // Will copy result string if modified - if (!is_readonly && strcmp(state->TextA.Data, buf) != 0) - { - apply_new_text = state->TextA.Data; - apply_new_text_length = state->CurLenA; - } - } - - // Clear temporary user storage - state->Flags = ImGuiInputTextFlags_None; - } - - // Copy result to user buffer. This can currently only happen when (g.ActiveId == id) - if (apply_new_text != NULL) - { - // We cannot test for 'backup_current_text_length != apply_new_text_length' here because we have no guarantee that the size - // of our owned buffer matches the size of the string object held by the user, and by design we allow InputText() to be used - // without any storage on user's side. - IM_ASSERT(apply_new_text_length >= 0); - if (is_resizable) - { - ImGuiInputTextCallbackData callback_data; - callback_data.EventFlag = ImGuiInputTextFlags_CallbackResize; - callback_data.Flags = flags; - callback_data.Buf = buf; - callback_data.BufTextLen = apply_new_text_length; - callback_data.BufSize = ImMax(buf_size, apply_new_text_length + 1); - callback_data.UserData = callback_user_data; - callback(&callback_data); - buf = callback_data.Buf; - buf_size = callback_data.BufSize; - apply_new_text_length = ImMin(callback_data.BufTextLen, buf_size - 1); - IM_ASSERT(apply_new_text_length <= buf_size); - } - //IMGUI_DEBUG_PRINT("InputText(\"%s\"): apply_new_text length %d\n", label, apply_new_text_length); - - // If the underlying buffer resize was denied or not carried to the next frame, apply_new_text_length+1 may be >= buf_size. - ImStrncpy(buf, apply_new_text, ImMin(apply_new_text_length + 1, buf_size)); - value_changed = true; - } - - // Release active ID at the end of the function (so e.g. pressing Return still does a final application of the value) - if (clear_active_id && g.ActiveId == id) - ClearActiveID(); - - // Render frame - if (!is_multiline) - { - RenderNavHighlight(frame_bb, id); - RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - } - - const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + inner_size.x, frame_bb.Min.y + inner_size.y); // Not using frame_bb.Max because we have adjusted size - ImVec2 draw_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding; - ImVec2 text_size(0.0f, 0.0f); - - // Set upper limit of single-line InputTextEx() at 2 million characters strings. The current pathological worst case is a long line - // without any carriage return, which would makes ImFont::RenderText() reserve too many vertices and probably crash. Avoid it altogether. - // Note that we only use this limit on single-line InputText(), so a pathologically large line on a InputTextMultiline() would still crash. - const int buf_display_max_length = 2 * 1024 * 1024; - const char* buf_display = buf_display_from_state ? state->TextA.Data : buf; //-V595 - const char* buf_display_end = NULL; // We have specialized paths below for setting the length - if (is_displaying_hint) - { - buf_display = hint; - buf_display_end = hint + strlen(hint); - } - - // Render text. We currently only render selection when the widget is active or while scrolling. - // FIXME: We could remove the '&& render_cursor' to keep rendering selection when inactive. - if (render_cursor || render_selection) - { - IM_ASSERT(state != NULL); - if (!is_displaying_hint) - buf_display_end = buf_display + state->CurLenA; - - // Render text (with cursor and selection) - // This is going to be messy. We need to: - // - Display the text (this alone can be more easily clipped) - // - Handle scrolling, highlight selection, display cursor (those all requires some form of 1d->2d cursor position calculation) - // - Measure text height (for scrollbar) - // We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort) - // FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8. - const ImWchar* text_begin = state->TextW.Data; - ImVec2 cursor_offset, select_start_offset; - - { - // Find lines numbers straddling 'cursor' (slot 0) and 'select_start' (slot 1) positions. - const ImWchar* searches_input_ptr[2] = { NULL, NULL }; - int searches_result_line_no[2] = { -1000, -1000 }; - int searches_remaining = 0; - if (render_cursor) - { - searches_input_ptr[0] = text_begin + state->Stb.cursor; - searches_result_line_no[0] = -1; - searches_remaining++; - } - if (render_selection) - { - searches_input_ptr[1] = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end); - searches_result_line_no[1] = -1; - searches_remaining++; - } - - // Iterate all lines to find our line numbers - // In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter. - searches_remaining += is_multiline ? 1 : 0; - int line_count = 0; - //for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bit - for (const ImWchar* s = text_begin; *s != 0; s++) - if (*s == '\n') - { - line_count++; - if (searches_result_line_no[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_no[0] = line_count; if (--searches_remaining <= 0) break; } - if (searches_result_line_no[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_no[1] = line_count; if (--searches_remaining <= 0) break; } - } - line_count++; - if (searches_result_line_no[0] == -1) - searches_result_line_no[0] = line_count; - if (searches_result_line_no[1] == -1) - searches_result_line_no[1] = line_count; - - // Calculate 2d position by finding the beginning of the line and measuring distance - cursor_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[0], text_begin), searches_input_ptr[0]).x; - cursor_offset.y = searches_result_line_no[0] * g.FontSize; - if (searches_result_line_no[1] >= 0) - { - select_start_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[1], text_begin), searches_input_ptr[1]).x; - select_start_offset.y = searches_result_line_no[1] * g.FontSize; - } - - // Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224) - if (is_multiline) - text_size = ImVec2(inner_size.x, line_count * g.FontSize); - } - - // Scroll - if (render_cursor && state->CursorFollow) - { - // Horizontal scroll in chunks of quarter width - if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll)) - { - const float scroll_increment_x = inner_size.x * 0.25f; - const float visible_width = inner_size.x - style.FramePadding.x; - if (cursor_offset.x < state->ScrollX) - state->ScrollX = IM_FLOOR(ImMax(0.0f, cursor_offset.x - scroll_increment_x)); - else if (cursor_offset.x - visible_width >= state->ScrollX) - state->ScrollX = IM_FLOOR(cursor_offset.x - visible_width + scroll_increment_x); - } - else - { - state->ScrollX = 0.0f; - } - - // Vertical scroll - if (is_multiline) - { - // Test if cursor is vertically visible - if (cursor_offset.y - g.FontSize < scroll_y) - scroll_y = ImMax(0.0f, cursor_offset.y - g.FontSize); - else if (cursor_offset.y - (inner_size.y - style.FramePadding.y * 2.0f) >= scroll_y) - scroll_y = cursor_offset.y - inner_size.y + style.FramePadding.y * 2.0f; - const float scroll_max_y = ImMax((text_size.y + style.FramePadding.y * 2.0f) - inner_size.y, 0.0f); - scroll_y = ImClamp(scroll_y, 0.0f, scroll_max_y); - draw_pos.y += (draw_window->Scroll.y - scroll_y); // Manipulate cursor pos immediately avoid a frame of lag - draw_window->Scroll.y = scroll_y; - } - - state->CursorFollow = false; - } - - // Draw selection - const ImVec2 draw_scroll = ImVec2(state->ScrollX, 0.0f); - if (render_selection) - { - const ImWchar* text_selected_begin = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end); - const ImWchar* text_selected_end = text_begin + ImMax(state->Stb.select_start, state->Stb.select_end); - - ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg, render_cursor ? 1.0f : 0.6f); // FIXME: current code flow mandate that render_cursor is always true here, we are leaving the transparent one for tests. - float bg_offy_up = is_multiline ? 0.0f : -1.0f; // FIXME: those offsets should be part of the style? they don't play so well with multi-line selection. - float bg_offy_dn = is_multiline ? 0.0f : 2.0f; - ImVec2 rect_pos = draw_pos + select_start_offset - draw_scroll; - for (const ImWchar* p = text_selected_begin; p < text_selected_end; ) - { - if (rect_pos.y > clip_rect.w + g.FontSize) - break; - if (rect_pos.y < clip_rect.y) - { - //p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bit - //p = p ? p + 1 : text_selected_end; - while (p < text_selected_end) - if (*p++ == '\n') - break; - } - else - { - ImVec2 rect_size = InputTextCalcTextSizeW(p, text_selected_end, &p, NULL, true); - if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines - ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn)); - rect.ClipWith(clip_rect); - if (rect.Overlaps(clip_rect)) - draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color); - } - rect_pos.x = draw_pos.x - draw_scroll.x; - rect_pos.y += g.FontSize; - } - } - - // We test for 'buf_display_max_length' as a way to avoid some pathological cases (e.g. single-line 1 MB string) which would make ImDrawList crash. - if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length) - { - ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text); - draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect); - } - - // Draw blinking cursor - if (render_cursor) - { - state->CursorAnim += io.DeltaTime; - bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f; - ImVec2 cursor_screen_pos = ImFloor(draw_pos + cursor_offset - draw_scroll); - ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f); - if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect)) - draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text)); - - // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.) - if (!is_readonly) - { - g.PlatformImeData.WantVisible = true; - g.PlatformImeData.InputPos = ImVec2(cursor_screen_pos.x - 1.0f, cursor_screen_pos.y - g.FontSize); - g.PlatformImeData.InputLineHeight = g.FontSize; - } - } - } - else - { - // Render text only (no selection, no cursor) - if (is_multiline) - text_size = ImVec2(inner_size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_display_end) * g.FontSize); // We don't need width - else if (!is_displaying_hint && g.ActiveId == id) - buf_display_end = buf_display + state->CurLenA; - else if (!is_displaying_hint) - buf_display_end = buf_display + strlen(buf_display); - - if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length) - { - ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text); - draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect); - } - } - - if (is_password && !is_displaying_hint) - PopFont(); - - if (is_multiline) - { - // For focus requests to work on our multiline we need to ensure our child ItemAdd() call specifies the ImGuiItemFlags_Inputable (ref issue #4761)... - Dummy(ImVec2(text_size.x, text_size.y + style.FramePadding.y)); - ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; - g.CurrentItemFlags |= ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop; - EndChild(); - item_data_backup.StatusFlags |= (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredWindow); - g.CurrentItemFlags = backup_item_flags; - - // ...and then we need to undo the group overriding last item data, which gets a bit messy as EndGroup() tries to forward scrollbar being active... - // FIXME: This quite messy/tricky, should attempt to get rid of the child window. - EndGroup(); - if (g.LastItemData.ID == 0) - { - g.LastItemData.ID = id; - g.LastItemData.InFlags = item_data_backup.InFlags; - g.LastItemData.StatusFlags = item_data_backup.StatusFlags; - } - } - - // Log as text - if (g.LogEnabled && (!is_password || is_displaying_hint)) - { - LogSetNextTextDecoration("{", "}"); - LogRenderedText(&draw_pos, buf_display, buf_display_end); - } - - if (label_size.x > 0) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); - - if (value_changed && !(flags & ImGuiInputTextFlags_NoMarkEdited)) - MarkItemEdited(id); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); - if ((flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0) - return validated; - else - return value_changed; -} - -void ImGui::DebugNodeInputTextState(ImGuiInputTextState* state) -{ -#ifndef IMGUI_DISABLE_DEBUG_TOOLS - ImGuiContext& g = *GImGui; - ImStb::STB_TexteditState* stb_state = &state->Stb; - ImStb::StbUndoState* undo_state = &stb_state->undostate; - Text("ID: 0x%08X, ActiveID: 0x%08X", state->ID, g.ActiveId); - Text("CurLenW: %d, CurLenA: %d, Cursor: %d, Selection: %d..%d", state->CurLenA, state->CurLenW, stb_state->cursor, stb_state->select_start, stb_state->select_end); - Text("undo_point: %d, redo_point: %d, undo_char_point: %d, redo_char_point: %d", undo_state->undo_point, undo_state->redo_point, undo_state->undo_char_point, undo_state->redo_char_point); - if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 15), true)) // Visualize undo state - { - PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - for (int n = 0; n < STB_TEXTEDIT_UNDOSTATECOUNT; n++) - { - ImStb::StbUndoRecord* undo_rec = &undo_state->undo_rec[n]; - const char undo_rec_type = (n < undo_state->undo_point) ? 'u' : (n >= undo_state->redo_point) ? 'r' : ' '; - if (undo_rec_type == ' ') - BeginDisabled(); - char buf[64] = ""; - if (undo_rec_type != ' ' && undo_rec->char_storage != -1) - ImTextStrToUtf8(buf, IM_ARRAYSIZE(buf), undo_state->undo_char + undo_rec->char_storage, undo_state->undo_char + undo_rec->char_storage + undo_rec->insert_length); - Text("%c [%02d] where %03d, insert %03d, delete %03d, char_storage %03d \"%s\"", - undo_rec_type, n, undo_rec->where, undo_rec->insert_length, undo_rec->delete_length, undo_rec->char_storage, buf); - if (undo_rec_type == ' ') - EndDisabled(); - } - PopStyleVar(); - } - EndChild(); -#else - IM_UNUSED(state); -#endif -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc. -//------------------------------------------------------------------------- -// - ColorEdit3() -// - ColorEdit4() -// - ColorPicker3() -// - RenderColorRectWithAlphaCheckerboard() [Internal] -// - ColorPicker4() -// - ColorButton() -// - SetColorEditOptions() -// - ColorTooltip() [Internal] -// - ColorEditOptionsPopup() [Internal] -// - ColorPickerOptionsPopup() [Internal] -//------------------------------------------------------------------------- - -bool ImGui::ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags) -{ - return ColorEdit4(label, col, flags | ImGuiColorEditFlags_NoAlpha); -} - -// ColorEdit supports RGB and HSV inputs. In case of RGB input resulting color may have undefined hue and/or saturation. -// Since widget displays both RGB and HSV values we must preserve hue and saturation to prevent these values resetting. -static void ColorEditRestoreHS(const float* col, float* H, float* S, float* V) -{ - // This check is optional. Suppose we have two color widgets side by side, both widgets display different colors, but both colors have hue and/or saturation undefined. - // With color check: hue/saturation is preserved in one widget. Editing color in one widget would reset hue/saturation in another one. - // Without color check: common hue/saturation would be displayed in all widgets that have hue/saturation undefined. - // g.ColorEditLastColor is stored as ImU32 RGB value: this essentially gives us color equality check with reduced precision. - // Tiny external color changes would not be detected and this check would still pass. This is OK, since we only restore hue/saturation _only_ if they are undefined, - // therefore this change flipping hue/saturation from undefined to a very tiny value would still be represented in color picker. - ImGuiContext& g = *GImGui; - if (g.ColorEditLastColor != ImGui::ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0))) - return; - - // When S == 0, H is undefined. - // When H == 1 it wraps around to 0. - if (*S == 0.0f || (*H == 0.0f && g.ColorEditLastHue == 1)) - *H = g.ColorEditLastHue; - - // When V == 0, S is undefined. - if (*V == 0.0f) - *S = g.ColorEditLastSat; -} - -// Edit colors components (each component in 0.0f..1.0f range). -// See enum ImGuiColorEditFlags_ for available options. e.g. Only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. -// With typical options: Left-click on color square to open color picker. Right-click to open option menu. CTRL-Click over input fields to edit them and TAB to go to next item. -bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const float square_sz = GetFrameHeight(); - const float w_full = CalcItemWidth(); - const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); - const float w_inputs = w_full - w_button; - const char* label_display_end = FindRenderedTextEnd(label); - g.NextItemData.ClearFlags(); - - BeginGroup(); - PushID(label); - - // If we're not showing any slider there's no point in doing any HSV conversions - const ImGuiColorEditFlags flags_untouched = flags; - if (flags & ImGuiColorEditFlags_NoInputs) - flags = (flags & (~ImGuiColorEditFlags_DisplayMask_)) | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_NoOptions; - - // Context menu: display and modify options (before defaults are applied) - if (!(flags & ImGuiColorEditFlags_NoOptions)) - ColorEditOptionsPopup(col, flags); - - // Read stored options - if (!(flags & ImGuiColorEditFlags_DisplayMask_)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags_DisplayMask_); - if (!(flags & ImGuiColorEditFlags_DataTypeMask_)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags_DataTypeMask_); - if (!(flags & ImGuiColorEditFlags_PickerMask_)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags_PickerMask_); - if (!(flags & ImGuiColorEditFlags_InputMask_)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags_InputMask_); - flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags_DisplayMask_ | ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_PickerMask_ | ImGuiColorEditFlags_InputMask_)); - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DisplayMask_)); // Check that only 1 is selected - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check that only 1 is selected - - const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0; - const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0; - const int components = alpha ? 4 : 3; - - // Convert to the formats we need - float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f }; - if ((flags & ImGuiColorEditFlags_InputHSV) && (flags & ImGuiColorEditFlags_DisplayRGB)) - ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); - else if ((flags & ImGuiColorEditFlags_InputRGB) && (flags & ImGuiColorEditFlags_DisplayHSV)) - { - // Hue is lost when converting from greyscale rgb (saturation=0). Restore it. - ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); - ColorEditRestoreHS(col, &f[0], &f[1], &f[2]); - } - int i[4] = { IM_F32_TO_INT8_UNBOUND(f[0]), IM_F32_TO_INT8_UNBOUND(f[1]), IM_F32_TO_INT8_UNBOUND(f[2]), IM_F32_TO_INT8_UNBOUND(f[3]) }; - - bool value_changed = false; - bool value_changed_as_float = false; - - const ImVec2 pos = window->DC.CursorPos; - const float inputs_offset_x = (style.ColorButtonPosition == ImGuiDir_Left) ? w_button : 0.0f; - window->DC.CursorPos.x = pos.x + inputs_offset_x; - - if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) - { - // RGB/HSV 0..255 Sliders - const float w_item_one = ImMax(1.0f, IM_FLOOR((w_inputs - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); - const float w_item_last = ImMax(1.0f, IM_FLOOR(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); - - const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); - static const char* ids[4] = { "##X", "##Y", "##Z", "##W" }; - static const char* fmt_table_int[3][4] = - { - { "%3d", "%3d", "%3d", "%3d" }, // Short display - { "R:%3d", "G:%3d", "B:%3d", "A:%3d" }, // Long display for RGBA - { "H:%3d", "S:%3d", "V:%3d", "A:%3d" } // Long display for HSVA - }; - static const char* fmt_table_float[3][4] = - { - { "%0.3f", "%0.3f", "%0.3f", "%0.3f" }, // Short display - { "R:%0.3f", "G:%0.3f", "B:%0.3f", "A:%0.3f" }, // Long display for RGBA - { "H:%0.3f", "S:%0.3f", "V:%0.3f", "A:%0.3f" } // Long display for HSVA - }; - const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_DisplayHSV) ? 2 : 1; - - for (int n = 0; n < components; n++) - { - if (n > 0) - SameLine(0, style.ItemInnerSpacing.x); - SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last); - - // FIXME: When ImGuiColorEditFlags_HDR flag is passed HS values snap in weird ways when SV values go below 0. - if (flags & ImGuiColorEditFlags_Float) - { - value_changed |= DragFloat(ids[n], &f[n], 1.0f / 255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]); - value_changed_as_float |= value_changed; - } - else - { - value_changed |= DragInt(ids[n], &i[n], 1.0f, 0, hdr ? 0 : 255, fmt_table_int[fmt_idx][n]); - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); - } - } - else if ((flags & ImGuiColorEditFlags_DisplayHex) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) - { - // RGB Hexadecimal Input - char buf[64]; - if (alpha) - ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255), ImClamp(i[3], 0, 255)); - else - ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255)); - SetNextItemWidth(w_inputs); - if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase)) - { - value_changed = true; - char* p = buf; - while (*p == '#' || ImCharIsBlankA(*p)) - p++; - i[0] = i[1] = i[2] = 0; - i[3] = 0xFF; // alpha default to 255 is not parsed by scanf (e.g. inputting #FFFFFF omitting alpha) - int r; - if (alpha) - r = sscanf(p, "%02X%02X%02X%02X", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2], (unsigned int*)&i[3]); // Treat at unsigned (%X is unsigned) - else - r = sscanf(p, "%02X%02X%02X", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2]); - IM_UNUSED(r); // Fixes C6031: Return value ignored: 'sscanf'. - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); - } - - ImGuiWindow* picker_active_window = NULL; - if (!(flags & ImGuiColorEditFlags_NoSmallPreview)) - { - const float button_offset_x = ((flags & ImGuiColorEditFlags_NoInputs) || (style.ColorButtonPosition == ImGuiDir_Left)) ? 0.0f : w_inputs + style.ItemInnerSpacing.x; - window->DC.CursorPos = ImVec2(pos.x + button_offset_x, pos.y); - - const ImVec4 col_v4(col[0], col[1], col[2], alpha ? col[3] : 1.0f); - if (ColorButton("##ColorButton", col_v4, flags)) - { - if (!(flags & ImGuiColorEditFlags_NoPicker)) - { - // Store current color and open a picker - g.ColorPickerRef = col_v4; - OpenPopup("picker"); - SetNextWindowPos(g.LastItemData.Rect.GetBL() + ImVec2(0.0f, style.ItemSpacing.y)); - } - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); - - if (BeginPopup("picker")) - { - picker_active_window = g.CurrentWindow; - if (label != label_display_end) - { - TextEx(label, label_display_end); - Spacing(); - } - ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_PickerMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar; - ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags_DisplayMask_ | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf; - SetNextItemWidth(square_sz * 12.0f); // Use 256 + bar sizes? - value_changed |= ColorPicker4("##picker", col, picker_flags, &g.ColorPickerRef.x); - EndPopup(); - } - } - - if (label != label_display_end && !(flags & ImGuiColorEditFlags_NoLabel)) - { - SameLine(0.0f, style.ItemInnerSpacing.x); - TextEx(label, label_display_end); - } - - // Convert back - if (value_changed && picker_active_window == NULL) - { - if (!value_changed_as_float) - for (int n = 0; n < 4; n++) - f[n] = i[n] / 255.0f; - if ((flags & ImGuiColorEditFlags_DisplayHSV) && (flags & ImGuiColorEditFlags_InputRGB)) - { - g.ColorEditLastHue = f[0]; - g.ColorEditLastSat = f[1]; - ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); - g.ColorEditLastColor = ColorConvertFloat4ToU32(ImVec4(f[0], f[1], f[2], 0)); - } - if ((flags & ImGuiColorEditFlags_DisplayRGB) && (flags & ImGuiColorEditFlags_InputHSV)) - ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); - - col[0] = f[0]; - col[1] = f[1]; - col[2] = f[2]; - if (alpha) - col[3] = f[3]; - } - - PopID(); - EndGroup(); - - // Drag and Drop Target - // NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test. - if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget()) - { - bool accepted_drag_drop = false; - if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) - { - memcpy((float*)col, payload->Data, sizeof(float) * 3); // Preserve alpha if any //-V512 - value_changed = accepted_drag_drop = true; - } - if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) - { - memcpy((float*)col, payload->Data, sizeof(float) * components); - value_changed = accepted_drag_drop = true; - } - - // Drag-drop payloads are always RGB - if (accepted_drag_drop && (flags & ImGuiColorEditFlags_InputHSV)) - ColorConvertRGBtoHSV(col[0], col[1], col[2], col[0], col[1], col[2]); - EndDragDropTarget(); - } - - // When picker is being actively used, use its active id so IsItemActive() will function on ColorEdit4(). - if (picker_active_window && g.ActiveId != 0 && g.ActiveIdWindow == picker_active_window) - g.LastItemData.ID = g.ActiveId; - - if (value_changed) - MarkItemEdited(g.LastItemData.ID); - - return value_changed; -} - -bool ImGui::ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags) -{ - float col4[4] = { col[0], col[1], col[2], 1.0f }; - if (!ColorPicker4(label, col4, flags | ImGuiColorEditFlags_NoAlpha)) - return false; - col[0] = col4[0]; col[1] = col4[1]; col[2] = col4[2]; - return true; -} - -// Helper for ColorPicker4() -static void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w, float alpha) -{ - ImU32 alpha8 = IM_F32_TO_INT8_SAT(alpha); - ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x + 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32(0,0,0,alpha8)); - ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x, pos.y), half_sz, ImGuiDir_Right, IM_COL32(255,255,255,alpha8)); - ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left, IM_COL32(0,0,0,alpha8)); - ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x, pos.y), half_sz, ImGuiDir_Left, IM_COL32(255,255,255,alpha8)); -} - -// Note: ColorPicker4() only accesses 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. -// (In C++ the 'float col[4]' notation for a function argument is equivalent to 'float* col', we only specify a size to facilitate understanding of the code.) -// FIXME: we adjust the big color square height based on item width, which may cause a flickering feedback loop (if automatic height makes a vertical scrollbar appears, affecting automatic width..) -// FIXME: this is trying to be aware of style.Alpha but not fully correct. Also, the color wheel will have overlapping glitches with (style.Alpha < 1.0) -bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags, const float* ref_col) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImDrawList* draw_list = window->DrawList; - ImGuiStyle& style = g.Style; - ImGuiIO& io = g.IO; - - const float width = CalcItemWidth(); - g.NextItemData.ClearFlags(); - - PushID(label); - BeginGroup(); - - if (!(flags & ImGuiColorEditFlags_NoSidePreview)) - flags |= ImGuiColorEditFlags_NoSmallPreview; - - // Context menu: display and store options. - if (!(flags & ImGuiColorEditFlags_NoOptions)) - ColorPickerOptionsPopup(col, flags); - - // Read stored options - if (!(flags & ImGuiColorEditFlags_PickerMask_)) - flags |= ((g.ColorEditOptions & ImGuiColorEditFlags_PickerMask_) ? g.ColorEditOptions : ImGuiColorEditFlags_DefaultOptions_) & ImGuiColorEditFlags_PickerMask_; - if (!(flags & ImGuiColorEditFlags_InputMask_)) - flags |= ((g.ColorEditOptions & ImGuiColorEditFlags_InputMask_) ? g.ColorEditOptions : ImGuiColorEditFlags_DefaultOptions_) & ImGuiColorEditFlags_InputMask_; - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_PickerMask_)); // Check that only 1 is selected - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check that only 1 is selected - if (!(flags & ImGuiColorEditFlags_NoOptions)) - flags |= (g.ColorEditOptions & ImGuiColorEditFlags_AlphaBar); - - // Setup - int components = (flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4; - bool alpha_bar = (flags & ImGuiColorEditFlags_AlphaBar) && !(flags & ImGuiColorEditFlags_NoAlpha); - ImVec2 picker_pos = window->DC.CursorPos; - float square_sz = GetFrameHeight(); - float bars_width = square_sz; // Arbitrary smallish width of Hue/Alpha picking bars - float sv_picker_size = ImMax(bars_width * 1, width - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box - float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x; - float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x; - float bars_triangles_half_sz = IM_FLOOR(bars_width * 0.20f); - - float backup_initial_col[4]; - memcpy(backup_initial_col, col, components * sizeof(float)); - - float wheel_thickness = sv_picker_size * 0.08f; - float wheel_r_outer = sv_picker_size * 0.50f; - float wheel_r_inner = wheel_r_outer - wheel_thickness; - ImVec2 wheel_center(picker_pos.x + (sv_picker_size + bars_width)*0.5f, picker_pos.y + sv_picker_size * 0.5f); - - // Note: the triangle is displayed rotated with triangle_pa pointing to Hue, but most coordinates stays unrotated for logic. - float triangle_r = wheel_r_inner - (int)(sv_picker_size * 0.027f); - ImVec2 triangle_pa = ImVec2(triangle_r, 0.0f); // Hue point. - ImVec2 triangle_pb = ImVec2(triangle_r * -0.5f, triangle_r * -0.866025f); // Black point. - ImVec2 triangle_pc = ImVec2(triangle_r * -0.5f, triangle_r * +0.866025f); // White point. - - float H = col[0], S = col[1], V = col[2]; - float R = col[0], G = col[1], B = col[2]; - if (flags & ImGuiColorEditFlags_InputRGB) - { - // Hue is lost when converting from greyscale rgb (saturation=0). Restore it. - ColorConvertRGBtoHSV(R, G, B, H, S, V); - ColorEditRestoreHS(col, &H, &S, &V); - } - else if (flags & ImGuiColorEditFlags_InputHSV) - { - ColorConvertHSVtoRGB(H, S, V, R, G, B); - } - - bool value_changed = false, value_changed_h = false, value_changed_sv = false; - - PushItemFlag(ImGuiItemFlags_NoNav, true); - if (flags & ImGuiColorEditFlags_PickerHueWheel) - { - // Hue wheel + SV triangle logic - InvisibleButton("hsv", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size)); - if (IsItemActive()) - { - ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center; - ImVec2 current_off = g.IO.MousePos - wheel_center; - float initial_dist2 = ImLengthSqr(initial_off); - if (initial_dist2 >= (wheel_r_inner - 1) * (wheel_r_inner - 1) && initial_dist2 <= (wheel_r_outer + 1) * (wheel_r_outer + 1)) - { - // Interactive with Hue wheel - H = ImAtan2(current_off.y, current_off.x) / IM_PI * 0.5f; - if (H < 0.0f) - H += 1.0f; - value_changed = value_changed_h = true; - } - float cos_hue_angle = ImCos(-H * 2.0f * IM_PI); - float sin_hue_angle = ImSin(-H * 2.0f * IM_PI); - if (ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, ImRotate(initial_off, cos_hue_angle, sin_hue_angle))) - { - // Interacting with SV triangle - ImVec2 current_off_unrotated = ImRotate(current_off, cos_hue_angle, sin_hue_angle); - if (!ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated)) - current_off_unrotated = ImTriangleClosestPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated); - float uu, vv, ww; - ImTriangleBarycentricCoords(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated, uu, vv, ww); - V = ImClamp(1.0f - vv, 0.0001f, 1.0f); - S = ImClamp(uu / V, 0.0001f, 1.0f); - value_changed = value_changed_sv = true; - } - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); - } - else if (flags & ImGuiColorEditFlags_PickerHueBar) - { - // SV rectangle logic - InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size)); - if (IsItemActive()) - { - S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size - 1)); - V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); - - // Greatly reduces hue jitter and reset to 0 when hue == 255 and color is rapidly modified using SV square. - if (g.ColorEditLastColor == ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0))) - H = g.ColorEditLastHue; - value_changed = value_changed_sv = true; - } - if (!(flags & ImGuiColorEditFlags_NoOptions)) - OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); - - // Hue bar logic - SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y)); - InvisibleButton("hue", ImVec2(bars_width, sv_picker_size)); - if (IsItemActive()) - { - H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); - value_changed = value_changed_h = true; - } - } - - // Alpha bar logic - if (alpha_bar) - { - SetCursorScreenPos(ImVec2(bar1_pos_x, picker_pos.y)); - InvisibleButton("alpha", ImVec2(bars_width, sv_picker_size)); - if (IsItemActive()) - { - col[3] = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); - value_changed = true; - } - } - PopItemFlag(); // ImGuiItemFlags_NoNav - - if (!(flags & ImGuiColorEditFlags_NoSidePreview)) - { - SameLine(0, style.ItemInnerSpacing.x); - BeginGroup(); - } - - if (!(flags & ImGuiColorEditFlags_NoLabel)) - { - const char* label_display_end = FindRenderedTextEnd(label); - if (label != label_display_end) - { - if ((flags & ImGuiColorEditFlags_NoSidePreview)) - SameLine(0, style.ItemInnerSpacing.x); - TextEx(label, label_display_end); - } - } - - if (!(flags & ImGuiColorEditFlags_NoSidePreview)) - { - PushItemFlag(ImGuiItemFlags_NoNavDefaultFocus, true); - ImVec4 col_v4(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); - if ((flags & ImGuiColorEditFlags_NoLabel)) - Text("Current"); - - ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf | ImGuiColorEditFlags_NoTooltip; - ColorButton("##current", col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2)); - if (ref_col != NULL) - { - Text("Original"); - ImVec4 ref_col_v4(ref_col[0], ref_col[1], ref_col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : ref_col[3]); - if (ColorButton("##original", ref_col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2))) - { - memcpy(col, ref_col, components * sizeof(float)); - value_changed = true; - } - } - PopItemFlag(); - EndGroup(); - } - - // Convert back color to RGB - if (value_changed_h || value_changed_sv) - { - if (flags & ImGuiColorEditFlags_InputRGB) - { - ColorConvertHSVtoRGB(H, S, V, col[0], col[1], col[2]); - g.ColorEditLastHue = H; - g.ColorEditLastSat = S; - g.ColorEditLastColor = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0)); - } - else if (flags & ImGuiColorEditFlags_InputHSV) - { - col[0] = H; - col[1] = S; - col[2] = V; - } - } - - // R,G,B and H,S,V slider color editor - bool value_changed_fix_hue_wrap = false; - if ((flags & ImGuiColorEditFlags_NoInputs) == 0) - { - PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x); - ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; - ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker; - if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) - if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB)) - { - // FIXME: Hackily differentiating using the DragInt (ActiveId != 0 && !ActiveIdAllowOverlap) vs. using the InputText or DropTarget. - // For the later we don't want to run the hue-wrap canceling code. If you are well versed in HSV picker please provide your input! (See #2050) - value_changed_fix_hue_wrap = (g.ActiveId != 0 && !g.ActiveIdAllowOverlap); - value_changed = true; - } - if (flags & ImGuiColorEditFlags_DisplayHSV || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) - value_changed |= ColorEdit4("##hsv", col, sub_flags | ImGuiColorEditFlags_DisplayHSV); - if (flags & ImGuiColorEditFlags_DisplayHex || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) - value_changed |= ColorEdit4("##hex", col, sub_flags | ImGuiColorEditFlags_DisplayHex); - PopItemWidth(); - } - - // Try to cancel hue wrap (after ColorEdit4 call), if any - if (value_changed_fix_hue_wrap && (flags & ImGuiColorEditFlags_InputRGB)) - { - float new_H, new_S, new_V; - ColorConvertRGBtoHSV(col[0], col[1], col[2], new_H, new_S, new_V); - if (new_H <= 0 && H > 0) - { - if (new_V <= 0 && V != new_V) - ColorConvertHSVtoRGB(H, S, new_V <= 0 ? V * 0.5f : new_V, col[0], col[1], col[2]); - else if (new_S <= 0) - ColorConvertHSVtoRGB(H, new_S <= 0 ? S * 0.5f : new_S, new_V, col[0], col[1], col[2]); - } - } - - if (value_changed) - { - if (flags & ImGuiColorEditFlags_InputRGB) - { - R = col[0]; - G = col[1]; - B = col[2]; - ColorConvertRGBtoHSV(R, G, B, H, S, V); - ColorEditRestoreHS(col, &H, &S, &V); // Fix local Hue as display below will use it immediately. - } - else if (flags & ImGuiColorEditFlags_InputHSV) - { - H = col[0]; - S = col[1]; - V = col[2]; - ColorConvertHSVtoRGB(H, S, V, R, G, B); - } - } - - const int style_alpha8 = IM_F32_TO_INT8_SAT(style.Alpha); - const ImU32 col_black = IM_COL32(0,0,0,style_alpha8); - const ImU32 col_white = IM_COL32(255,255,255,style_alpha8); - const ImU32 col_midgrey = IM_COL32(128,128,128,style_alpha8); - const ImU32 col_hues[6 + 1] = { IM_COL32(255,0,0,style_alpha8), IM_COL32(255,255,0,style_alpha8), IM_COL32(0,255,0,style_alpha8), IM_COL32(0,255,255,style_alpha8), IM_COL32(0,0,255,style_alpha8), IM_COL32(255,0,255,style_alpha8), IM_COL32(255,0,0,style_alpha8) }; - - ImVec4 hue_color_f(1, 1, 1, style.Alpha); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z); - ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f); - ImU32 user_col32_striped_of_alpha = ColorConvertFloat4ToU32(ImVec4(R, G, B, style.Alpha)); // Important: this is still including the main rendering/style alpha!! - - ImVec2 sv_cursor_pos; - - if (flags & ImGuiColorEditFlags_PickerHueWheel) - { - // Render Hue Wheel - const float aeps = 0.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out). - const int segment_per_arc = ImMax(4, (int)wheel_r_outer / 12); - for (int n = 0; n < 6; n++) - { - const float a0 = (n) /6.0f * 2.0f * IM_PI - aeps; - const float a1 = (n+1.0f)/6.0f * 2.0f * IM_PI + aeps; - const int vert_start_idx = draw_list->VtxBuffer.Size; - draw_list->PathArcTo(wheel_center, (wheel_r_inner + wheel_r_outer)*0.5f, a0, a1, segment_per_arc); - draw_list->PathStroke(col_white, 0, wheel_thickness); - const int vert_end_idx = draw_list->VtxBuffer.Size; - - // Paint colors over existing vertices - ImVec2 gradient_p0(wheel_center.x + ImCos(a0) * wheel_r_inner, wheel_center.y + ImSin(a0) * wheel_r_inner); - ImVec2 gradient_p1(wheel_center.x + ImCos(a1) * wheel_r_inner, wheel_center.y + ImSin(a1) * wheel_r_inner); - ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, col_hues[n], col_hues[n + 1]); - } - - // Render Cursor + preview on Hue Wheel - float cos_hue_angle = ImCos(H * 2.0f * IM_PI); - float sin_hue_angle = ImSin(H * 2.0f * IM_PI); - ImVec2 hue_cursor_pos(wheel_center.x + cos_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f, wheel_center.y + sin_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f); - float hue_cursor_rad = value_changed_h ? wheel_thickness * 0.65f : wheel_thickness * 0.55f; - int hue_cursor_segments = ImClamp((int)(hue_cursor_rad / 1.4f), 9, 32); - draw_list->AddCircleFilled(hue_cursor_pos, hue_cursor_rad, hue_color32, hue_cursor_segments); - draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad + 1, col_midgrey, hue_cursor_segments); - draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, col_white, hue_cursor_segments); - - // Render SV triangle (rotated according to hue) - ImVec2 tra = wheel_center + ImRotate(triangle_pa, cos_hue_angle, sin_hue_angle); - ImVec2 trb = wheel_center + ImRotate(triangle_pb, cos_hue_angle, sin_hue_angle); - ImVec2 trc = wheel_center + ImRotate(triangle_pc, cos_hue_angle, sin_hue_angle); - ImVec2 uv_white = GetFontTexUvWhitePixel(); - draw_list->PrimReserve(6, 6); - draw_list->PrimVtx(tra, uv_white, hue_color32); - draw_list->PrimVtx(trb, uv_white, hue_color32); - draw_list->PrimVtx(trc, uv_white, col_white); - draw_list->PrimVtx(tra, uv_white, 0); - draw_list->PrimVtx(trb, uv_white, col_black); - draw_list->PrimVtx(trc, uv_white, 0); - draw_list->AddTriangle(tra, trb, trc, col_midgrey, 1.5f); - sv_cursor_pos = ImLerp(ImLerp(trc, tra, ImSaturate(S)), trb, ImSaturate(1 - V)); - } - else if (flags & ImGuiColorEditFlags_PickerHueBar) - { - // Render SV Square - draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), col_white, hue_color32, hue_color32, col_white); - draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0, 0, col_black, col_black); - RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0.0f); - sv_cursor_pos.x = ImClamp(IM_ROUND(picker_pos.x + ImSaturate(S) * sv_picker_size), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much - sv_cursor_pos.y = ImClamp(IM_ROUND(picker_pos.y + ImSaturate(1 - V) * sv_picker_size), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2); - - // Render Hue Bar - for (int i = 0; i < 6; ++i) - draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), col_hues[i], col_hues[i], col_hues[i + 1], col_hues[i + 1]); - float bar0_line_y = IM_ROUND(picker_pos.y + H * sv_picker_size); - RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f); - RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); - } - - // Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range) - float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f; - draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, 12); - draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad + 1, col_midgrey, 12); - draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, col_white, 12); - - // Render alpha bar - if (alpha_bar) - { - float alpha = ImSaturate(col[3]); - ImRect bar1_bb(bar1_pos_x, picker_pos.y, bar1_pos_x + bars_width, picker_pos.y + sv_picker_size); - RenderColorRectWithAlphaCheckerboard(draw_list, bar1_bb.Min, bar1_bb.Max, 0, bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f)); - draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, user_col32_striped_of_alpha, user_col32_striped_of_alpha, user_col32_striped_of_alpha & ~IM_COL32_A_MASK, user_col32_striped_of_alpha & ~IM_COL32_A_MASK); - float bar1_line_y = IM_ROUND(picker_pos.y + (1.0f - alpha) * sv_picker_size); - RenderFrameBorder(bar1_bb.Min, bar1_bb.Max, 0.0f); - RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); - } - - EndGroup(); - - if (value_changed && memcmp(backup_initial_col, col, components * sizeof(float)) == 0) - value_changed = false; - if (value_changed) - MarkItemEdited(g.LastItemData.ID); - - PopID(); - - return value_changed; -} - -// A little color square. Return true when clicked. -// FIXME: May want to display/ignore the alpha component in the color display? Yet show it in the tooltip. -// 'desc_id' is not called 'label' because we don't display it next to the button, but only in the tooltip. -// Note that 'col' may be encoded in HSV if ImGuiColorEditFlags_InputHSV is set. -bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags, const ImVec2& size_arg) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiID id = window->GetID(desc_id); - const float default_size = GetFrameHeight(); - const ImVec2 size(size_arg.x == 0.0f ? default_size : size_arg.x, size_arg.y == 0.0f ? default_size : size_arg.y); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - ItemSize(bb, (size.y >= default_size) ? g.Style.FramePadding.y : 0.0f); - if (!ItemAdd(bb, id)) - return false; - - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held); - - if (flags & ImGuiColorEditFlags_NoAlpha) - flags &= ~(ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf); - - ImVec4 col_rgb = col; - if (flags & ImGuiColorEditFlags_InputHSV) - ColorConvertHSVtoRGB(col_rgb.x, col_rgb.y, col_rgb.z, col_rgb.x, col_rgb.y, col_rgb.z); - - ImVec4 col_rgb_without_alpha(col_rgb.x, col_rgb.y, col_rgb.z, 1.0f); - float grid_step = ImMin(size.x, size.y) / 2.99f; - float rounding = ImMin(g.Style.FrameRounding, grid_step * 0.5f); - ImRect bb_inner = bb; - float off = 0.0f; - if ((flags & ImGuiColorEditFlags_NoBorder) == 0) - { - off = -0.75f; // The border (using Col_FrameBg) tends to look off when color is near-opaque and rounding is enabled. This offset seemed like a good middle ground to reduce those artifacts. - bb_inner.Expand(off); - } - if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col_rgb.w < 1.0f) - { - float mid_x = IM_ROUND((bb_inner.Min.x + bb_inner.Max.x) * 0.5f); - RenderColorRectWithAlphaCheckerboard(window->DrawList, ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawFlags_RoundCornersRight); - window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_rgb_without_alpha), rounding, ImDrawFlags_RoundCornersLeft); - } - else - { - // Because GetColorU32() multiplies by the global style Alpha and we don't want to display a checkerboard if the source code had no alpha - ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col_rgb : col_rgb_without_alpha; - if (col_source.w < 1.0f) - RenderColorRectWithAlphaCheckerboard(window->DrawList, bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding); - else - window->DrawList->AddRectFilled(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), rounding); - } - RenderNavHighlight(bb, id); - if ((flags & ImGuiColorEditFlags_NoBorder) == 0) - { - if (g.Style.FrameBorderSize > 0.0f) - RenderFrameBorder(bb.Min, bb.Max, rounding); - else - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border - } - - // Drag and Drop Source - // NB: The ActiveId test is merely an optional micro-optimization, BeginDragDropSource() does the same test. - if (g.ActiveId == id && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropSource()) - { - if (flags & ImGuiColorEditFlags_NoAlpha) - SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F, &col_rgb, sizeof(float) * 3, ImGuiCond_Once); - else - SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, &col_rgb, sizeof(float) * 4, ImGuiCond_Once); - ColorButton(desc_id, col, flags); - SameLine(); - TextEx("Color"); - EndDragDropSource(); - } - - // Tooltip - if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered) - ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); - - return pressed; -} - -// Initialize/override default color options -void ImGui::SetColorEditOptions(ImGuiColorEditFlags flags) -{ - ImGuiContext& g = *GImGui; - if ((flags & ImGuiColorEditFlags_DisplayMask_) == 0) - flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_DisplayMask_; - if ((flags & ImGuiColorEditFlags_DataTypeMask_) == 0) - flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_DataTypeMask_; - if ((flags & ImGuiColorEditFlags_PickerMask_) == 0) - flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_PickerMask_; - if ((flags & ImGuiColorEditFlags_InputMask_) == 0) - flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_InputMask_; - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DisplayMask_)); // Check only 1 option is selected - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DataTypeMask_)); // Check only 1 option is selected - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_PickerMask_)); // Check only 1 option is selected - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check only 1 option is selected - g.ColorEditOptions = flags; -} - -// Note: only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. -void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags) -{ - ImGuiContext& g = *GImGui; - - BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None); - const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text; - if (text_end > text) - { - TextEx(text, text_end); - Separator(); - } - - ImVec2 sz(g.FontSize * 3 + g.Style.FramePadding.y * 2, g.FontSize * 3 + g.Style.FramePadding.y * 2); - ImVec4 cf(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); - int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); - ColorButton("##preview", cf, (flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz); - SameLine(); - if ((flags & ImGuiColorEditFlags_InputRGB) || !(flags & ImGuiColorEditFlags_InputMask_)) - { - if (flags & ImGuiColorEditFlags_NoAlpha) - Text("#%02X%02X%02X\nR: %d, G: %d, B: %d\n(%.3f, %.3f, %.3f)", cr, cg, cb, cr, cg, cb, col[0], col[1], col[2]); - else - Text("#%02X%02X%02X%02X\nR:%d, G:%d, B:%d, A:%d\n(%.3f, %.3f, %.3f, %.3f)", cr, cg, cb, ca, cr, cg, cb, ca, col[0], col[1], col[2], col[3]); - } - else if (flags & ImGuiColorEditFlags_InputHSV) - { - if (flags & ImGuiColorEditFlags_NoAlpha) - Text("H: %.3f, S: %.3f, V: %.3f", col[0], col[1], col[2]); - else - Text("H: %.3f, S: %.3f, V: %.3f, A: %.3f", col[0], col[1], col[2], col[3]); - } - EndTooltip(); -} - -void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) -{ - bool allow_opt_inputs = !(flags & ImGuiColorEditFlags_DisplayMask_); - bool allow_opt_datatype = !(flags & ImGuiColorEditFlags_DataTypeMask_); - if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context")) - return; - ImGuiContext& g = *GImGui; - ImGuiColorEditFlags opts = g.ColorEditOptions; - if (allow_opt_inputs) - { - if (RadioButton("RGB", (opts & ImGuiColorEditFlags_DisplayRGB) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayRGB; - if (RadioButton("HSV", (opts & ImGuiColorEditFlags_DisplayHSV) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayHSV; - if (RadioButton("Hex", (opts & ImGuiColorEditFlags_DisplayHex) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayHex; - } - if (allow_opt_datatype) - { - if (allow_opt_inputs) Separator(); - if (RadioButton("0..255", (opts & ImGuiColorEditFlags_Uint8) != 0)) opts = (opts & ~ImGuiColorEditFlags_DataTypeMask_) | ImGuiColorEditFlags_Uint8; - if (RadioButton("0.00..1.00", (opts & ImGuiColorEditFlags_Float) != 0)) opts = (opts & ~ImGuiColorEditFlags_DataTypeMask_) | ImGuiColorEditFlags_Float; - } - - if (allow_opt_inputs || allow_opt_datatype) - Separator(); - if (Button("Copy as..", ImVec2(-1, 0))) - OpenPopup("Copy"); - if (BeginPopup("Copy")) - { - int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); - char buf[64]; - ImFormatString(buf, IM_ARRAYSIZE(buf), "(%.3ff, %.3ff, %.3ff, %.3ff)", col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); - if (Selectable(buf)) - SetClipboardText(buf); - ImFormatString(buf, IM_ARRAYSIZE(buf), "(%d,%d,%d,%d)", cr, cg, cb, ca); - if (Selectable(buf)) - SetClipboardText(buf); - ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", cr, cg, cb); - if (Selectable(buf)) - SetClipboardText(buf); - if (!(flags & ImGuiColorEditFlags_NoAlpha)) - { - ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", cr, cg, cb, ca); - if (Selectable(buf)) - SetClipboardText(buf); - } - EndPopup(); - } - - g.ColorEditOptions = opts; - EndPopup(); -} - -void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags) -{ - bool allow_opt_picker = !(flags & ImGuiColorEditFlags_PickerMask_); - bool allow_opt_alpha_bar = !(flags & ImGuiColorEditFlags_NoAlpha) && !(flags & ImGuiColorEditFlags_AlphaBar); - if ((!allow_opt_picker && !allow_opt_alpha_bar) || !BeginPopup("context")) - return; - ImGuiContext& g = *GImGui; - if (allow_opt_picker) - { - ImVec2 picker_size(g.FontSize * 8, ImMax(g.FontSize * 8 - (GetFrameHeight() + g.Style.ItemInnerSpacing.x), 1.0f)); // FIXME: Picker size copied from main picker function - PushItemWidth(picker_size.x); - for (int picker_type = 0; picker_type < 2; picker_type++) - { - // Draw small/thumbnail version of each picker type (over an invisible button for selection) - if (picker_type > 0) Separator(); - PushID(picker_type); - ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoSidePreview | (flags & ImGuiColorEditFlags_NoAlpha); - if (picker_type == 0) picker_flags |= ImGuiColorEditFlags_PickerHueBar; - if (picker_type == 1) picker_flags |= ImGuiColorEditFlags_PickerHueWheel; - ImVec2 backup_pos = GetCursorScreenPos(); - if (Selectable("##selectable", false, 0, picker_size)) // By default, Selectable() is closing popup - g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags_PickerMask_) | (picker_flags & ImGuiColorEditFlags_PickerMask_); - SetCursorScreenPos(backup_pos); - ImVec4 previewing_ref_col; - memcpy(&previewing_ref_col, ref_col, sizeof(float) * ((picker_flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4)); - ColorPicker4("##previewing_picker", &previewing_ref_col.x, picker_flags); - PopID(); - } - PopItemWidth(); - } - if (allow_opt_alpha_bar) - { - if (allow_opt_picker) Separator(); - CheckboxFlags("Alpha Bar", &g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar); - } - EndPopup(); -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: TreeNode, CollapsingHeader, etc. -//------------------------------------------------------------------------- -// - TreeNode() -// - TreeNodeV() -// - TreeNodeEx() -// - TreeNodeExV() -// - TreeNodeBehavior() [Internal] -// - TreePush() -// - TreePop() -// - GetTreeNodeToLabelSpacing() -// - SetNextItemOpen() -// - CollapsingHeader() -//------------------------------------------------------------------------- - -bool ImGui::TreeNode(const char* str_id, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - bool is_open = TreeNodeExV(str_id, 0, fmt, args); - va_end(args); - return is_open; -} - -bool ImGui::TreeNode(const void* ptr_id, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - bool is_open = TreeNodeExV(ptr_id, 0, fmt, args); - va_end(args); - return is_open; -} - -bool ImGui::TreeNode(const char* label) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - return TreeNodeBehavior(window->GetID(label), 0, label, NULL); -} - -bool ImGui::TreeNodeV(const char* str_id, const char* fmt, va_list args) -{ - return TreeNodeExV(str_id, 0, fmt, args); -} - -bool ImGui::TreeNodeV(const void* ptr_id, const char* fmt, va_list args) -{ - return TreeNodeExV(ptr_id, 0, fmt, args); -} - -bool ImGui::TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - return TreeNodeBehavior(window->GetID(label), flags, label, NULL); -} - -bool ImGui::TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - bool is_open = TreeNodeExV(str_id, flags, fmt, args); - va_end(args); - return is_open; -} - -bool ImGui::TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - bool is_open = TreeNodeExV(ptr_id, flags, fmt, args); - va_end(args); - return is_open; -} - -bool ImGui::TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - const char* label, *label_end; - ImFormatStringToTempBufferV(&label, &label_end, fmt, args); - return TreeNodeBehavior(window->GetID(str_id), flags, label, label_end); -} - -bool ImGui::TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - const char* label, *label_end; - ImFormatStringToTempBufferV(&label, &label_end, fmt, args); - return TreeNodeBehavior(window->GetID(ptr_id), flags, label, label_end); -} - -void ImGui::TreeNodeSetOpen(ImGuiID id, bool open) -{ - ImGuiContext& g = *GImGui; - ImGuiStorage* storage = g.CurrentWindow->DC.StateStorage; - storage->SetInt(id, open ? 1 : 0); -} - -bool ImGui::TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags) -{ - if (flags & ImGuiTreeNodeFlags_Leaf) - return true; - - // We only write to the tree storage if the user clicks (or explicitly use the SetNextItemOpen function) - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiStorage* storage = window->DC.StateStorage; - - bool is_open; - if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasOpen) - { - if (g.NextItemData.OpenCond & ImGuiCond_Always) - { - is_open = g.NextItemData.OpenVal; - TreeNodeSetOpen(id, is_open); - } - else - { - // We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently. - const int stored_value = storage->GetInt(id, -1); - if (stored_value == -1) - { - is_open = g.NextItemData.OpenVal; - TreeNodeSetOpen(id, is_open); - } - else - { - is_open = stored_value != 0; - } - } - } - else - { - is_open = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0; - } - - // When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior). - // NB- If we are above max depth we still allow manually opened nodes to be logged. - if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && (window->DC.TreeDepth - g.LogDepthRef) < g.LogDepthToExpand) - is_open = true; - - return is_open; -} - -bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const bool display_frame = (flags & ImGuiTreeNodeFlags_Framed) != 0; - const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, ImMin(window->DC.CurrLineTextBaseOffset, style.FramePadding.y)); - - if (!label_end) - label_end = FindRenderedTextEnd(label); - const ImVec2 label_size = CalcTextSize(label, label_end, false); - - // We vertically grow up to current line height up the typical widget height. - const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), label_size.y + padding.y * 2); - ImRect frame_bb; - frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x; - frame_bb.Min.y = window->DC.CursorPos.y; - frame_bb.Max.x = window->WorkRect.Max.x; - frame_bb.Max.y = window->DC.CursorPos.y + frame_height; - if (display_frame) - { - // Framed header expand a little outside the default padding, to the edge of InnerClipRect - // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f) - frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f); - frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f); - } - - const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapser arrow width + Spacing - const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it - const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x * 2 : 0.0f); // Include collapser - ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y); - ItemSize(ImVec2(text_width, frame_height), padding.y); - - // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing - ImRect interact_bb = frame_bb; - if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0) - interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f; - - // Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child. - // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop(). - // This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero. - const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; - bool is_open = TreeNodeUpdateNextOpen(id, flags); - if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) - window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth); - - bool item_add = ItemAdd(interact_bb, id); - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDisplayRect; - g.LastItemData.DisplayRect = frame_bb; - - if (!item_add) - { - if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) - TreePushOverrideID(id); - IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0)); - return is_open; - } - - ImGuiButtonFlags button_flags = ImGuiTreeNodeFlags_None; - if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) - button_flags |= ImGuiButtonFlags_AllowItemOverlap; - if (!is_leaf) - button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; - - // We allow clicking on the arrow section with keyboard modifiers held, in order to easily - // allow browsing a tree while preserving selection with code implementing multi-selection patterns. - // When clicking on the rest of the tree node we always disallow keyboard modifiers. - const float arrow_hit_x1 = (text_pos.x - text_offset_x) - style.TouchExtraPadding.x; - const float arrow_hit_x2 = (text_pos.x - text_offset_x) + (g.FontSize + padding.x * 2.0f) + style.TouchExtraPadding.x; - const bool is_mouse_x_over_arrow = (g.IO.MousePos.x >= arrow_hit_x1 && g.IO.MousePos.x < arrow_hit_x2); - if (window != g.HoveredWindow || !is_mouse_x_over_arrow) - button_flags |= ImGuiButtonFlags_NoKeyModifiers; - - // Open behaviors can be altered with the _OpenOnArrow and _OnOnDoubleClick flags. - // Some alteration have subtle effects (e.g. toggle on MouseUp vs MouseDown events) due to requirements for multi-selection and drag and drop support. - // - Single-click on label = Toggle on MouseUp (default, when _OpenOnArrow=0) - // - Single-click on arrow = Toggle on MouseDown (when _OpenOnArrow=0) - // - Single-click on arrow = Toggle on MouseDown (when _OpenOnArrow=1) - // - Double-click on label = Toggle on MouseDoubleClick (when _OpenOnDoubleClick=1) - // - Double-click on arrow = Toggle on MouseDoubleClick (when _OpenOnDoubleClick=1 and _OpenOnArrow=0) - // It is rather standard that arrow click react on Down rather than Up. - // We set ImGuiButtonFlags_PressedOnClickRelease on OpenOnDoubleClick because we want the item to be active on the initial MouseDown in order for drag and drop to work. - if (is_mouse_x_over_arrow) - button_flags |= ImGuiButtonFlags_PressedOnClick; - else if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) - button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; - else - button_flags |= ImGuiButtonFlags_PressedOnClickRelease; - - bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0; - const bool was_selected = selected; - - bool hovered, held; - bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); - bool toggled = false; - if (!is_leaf) - { - if (pressed && g.DragDropHoldJustPressedId != id) - { - if ((flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) == 0 || (g.NavActivateId == id)) - toggled = true; - if (flags & ImGuiTreeNodeFlags_OpenOnArrow) - toggled |= is_mouse_x_over_arrow && !g.NavDisableMouseHover; // Lightweight equivalent of IsMouseHoveringRect() since ButtonBehavior() already did the job - if ((flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) && g.IO.MouseClickedCount[0] == 2) - toggled = true; - } - else if (pressed && g.DragDropHoldJustPressedId == id) - { - IM_ASSERT(button_flags & ImGuiButtonFlags_PressedOnDragDropHold); - if (!is_open) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again. - toggled = true; - } - - if (g.NavId == id && g.NavMoveDir == ImGuiDir_Left && is_open) - { - toggled = true; - NavMoveRequestCancel(); - } - if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right && !is_open) // If there's something upcoming on the line we may want to give it the priority? - { - toggled = true; - NavMoveRequestCancel(); - } - - if (toggled) - { - is_open = !is_open; - window->DC.StateStorage->SetInt(id, is_open); - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledOpen; - } - } - if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) - SetItemAllowOverlap(); - - // In this branch, TreeNodeBehavior() cannot toggle the selection so this will never trigger. - if (selected != was_selected) //-V547 - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection; - - // Render - const ImU32 text_col = GetColorU32(ImGuiCol_Text); - ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin; - if (display_frame) - { - // Framed type - const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); - RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding); - RenderNavHighlight(frame_bb, id, nav_highlight_flags); - if (flags & ImGuiTreeNodeFlags_Bullet) - RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col); - else if (!is_leaf) - RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); - else // Leaf without bullet, left-adjusted text - text_pos.x -= text_offset_x; - if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton) - frame_bb.Max.x -= g.FontSize + style.FramePadding.x; - - if (g.LogEnabled) - LogSetNextTextDecoration("###", "###"); - RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); - } - else - { - // Unframed typed for tree nodes - if (hovered || selected) - { - const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); - RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false); - } - RenderNavHighlight(frame_bb, id, nav_highlight_flags); - if (flags & ImGuiTreeNodeFlags_Bullet) - RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col); - else if (!is_leaf) - RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f); - if (g.LogEnabled) - LogSetNextTextDecoration(">", NULL); - RenderText(text_pos, label, label_end, false); - } - - if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) - TreePushOverrideID(id); - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0)); - return is_open; -} - -void ImGui::TreePush(const char* str_id) -{ - ImGuiWindow* window = GetCurrentWindow(); - Indent(); - window->DC.TreeDepth++; - PushID(str_id); -} - -void ImGui::TreePush(const void* ptr_id) -{ - ImGuiWindow* window = GetCurrentWindow(); - Indent(); - window->DC.TreeDepth++; - PushID(ptr_id); -} - -void ImGui::TreePushOverrideID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - Indent(); - window->DC.TreeDepth++; - PushOverrideID(id); -} - -void ImGui::TreePop() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - Unindent(); - - window->DC.TreeDepth--; - ImU32 tree_depth_mask = (1 << window->DC.TreeDepth); - - // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled) - if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) - if (g.NavIdIsAlive && (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask)) - { - SetNavID(window->IDStack.back(), g.NavLayer, 0, ImRect()); - NavMoveRequestCancel(); - } - window->DC.TreeJumpToParentOnPopMask &= tree_depth_mask - 1; - - IM_ASSERT(window->IDStack.Size > 1); // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much. - PopID(); -} - -// Horizontal distance preceding label when using TreeNode() or Bullet() -float ImGui::GetTreeNodeToLabelSpacing() -{ - ImGuiContext& g = *GImGui; - return g.FontSize + (g.Style.FramePadding.x * 2.0f); -} - -// Set next TreeNode/CollapsingHeader open state. -void ImGui::SetNextItemOpen(bool is_open, ImGuiCond cond) -{ - ImGuiContext& g = *GImGui; - if (g.CurrentWindow->SkipItems) - return; - g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasOpen; - g.NextItemData.OpenVal = is_open; - g.NextItemData.OpenCond = cond ? cond : ImGuiCond_Always; -} - -// CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag). -// This is basically the same as calling TreeNodeEx(label, ImGuiTreeNodeFlags_CollapsingHeader). You can remove the _NoTreePushOnOpen flag if you want behavior closer to normal TreeNode(). -bool ImGui::CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - return TreeNodeBehavior(window->GetID(label), flags | ImGuiTreeNodeFlags_CollapsingHeader, label); -} - -// p_visible == NULL : regular collapsing header -// p_visible != NULL && *p_visible == true : show a small close button on the corner of the header, clicking the button will set *p_visible = false -// p_visible != NULL && *p_visible == false : do not show the header at all -// Do not mistake this with the Open state of the header itself, which you can adjust with SetNextItemOpen() or ImGuiTreeNodeFlags_DefaultOpen. -bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - if (p_visible && !*p_visible) - return false; - - ImGuiID id = window->GetID(label); - flags |= ImGuiTreeNodeFlags_CollapsingHeader; - if (p_visible) - flags |= ImGuiTreeNodeFlags_AllowItemOverlap | ImGuiTreeNodeFlags_ClipLabelForTrailingButton; - bool is_open = TreeNodeBehavior(id, flags, label); - if (p_visible != NULL) - { - // Create a small overlapping close button - // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc. - // FIXME: CloseButton can overlap into text, need find a way to clip the text somehow. - ImGuiContext& g = *GImGui; - ImGuiLastItemData last_item_backup = g.LastItemData; - float button_size = g.FontSize; - float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x * 2.0f - button_size); - float button_y = g.LastItemData.Rect.Min.y; - ImGuiID close_button_id = GetIDWithSeed("#CLOSE", NULL, id); - if (CloseButton(close_button_id, ImVec2(button_x, button_y))) - *p_visible = false; - g.LastItemData = last_item_backup; - } - - return is_open; -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: Selectable -//------------------------------------------------------------------------- -// - Selectable() -//------------------------------------------------------------------------- - -// Tip: pass a non-visible label (e.g. "##hello") then you can use the space to draw other text or image. -// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. -// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags. -// FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. -bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - - // Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle. - ImGuiID id = window->GetID(label); - ImVec2 label_size = CalcTextSize(label, NULL, true); - ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y); - ImVec2 pos = window->DC.CursorPos; - pos.y += window->DC.CurrLineTextBaseOffset; - ItemSize(size, 0.0f); - - // Fill horizontal space - // We don't support (size < 0.0f) in Selectable() because the ItemSpacing extension would make explicitly right-aligned sizes not visibly match other widgets. - const bool span_all_columns = (flags & ImGuiSelectableFlags_SpanAllColumns) != 0; - const float min_x = span_all_columns ? window->ParentWorkRect.Min.x : pos.x; - const float max_x = span_all_columns ? window->ParentWorkRect.Max.x : window->WorkRect.Max.x; - if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth)) - size.x = ImMax(label_size.x, max_x - min_x); - - // Text stays at the submission position, but bounding box may be extended on both sides - const ImVec2 text_min = pos; - const ImVec2 text_max(min_x + size.x, pos.y + size.y); - - // Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable. - ImRect bb(min_x, pos.y, text_max.x, text_max.y); - if ((flags & ImGuiSelectableFlags_NoPadWithHalfSpacing) == 0) - { - const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x; - const float spacing_y = style.ItemSpacing.y; - const float spacing_L = IM_FLOOR(spacing_x * 0.50f); - const float spacing_U = IM_FLOOR(spacing_y * 0.50f); - bb.Min.x -= spacing_L; - bb.Min.y -= spacing_U; - bb.Max.x += (spacing_x - spacing_L); - bb.Max.y += (spacing_y - spacing_U); - } - //if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); } - - // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable.. - const float backup_clip_rect_min_x = window->ClipRect.Min.x; - const float backup_clip_rect_max_x = window->ClipRect.Max.x; - if (span_all_columns) - { - window->ClipRect.Min.x = window->ParentWorkRect.Min.x; - window->ClipRect.Max.x = window->ParentWorkRect.Max.x; - } - - const bool disabled_item = (flags & ImGuiSelectableFlags_Disabled) != 0; - const bool item_add = ItemAdd(bb, id, NULL, disabled_item ? ImGuiItemFlags_Disabled : ImGuiItemFlags_None); - if (span_all_columns) - { - window->ClipRect.Min.x = backup_clip_rect_min_x; - window->ClipRect.Max.x = backup_clip_rect_max_x; - } - - if (!item_add) - return false; - - const bool disabled_global = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; - if (disabled_item && !disabled_global) // Only testing this as an optimization - BeginDisabled(); - - // FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only, - // which would be advantageous since most selectable are not selected. - if (span_all_columns && window->DC.CurrentColumns) - PushColumnsBackground(); - else if (span_all_columns && g.CurrentTable) - TablePushBackgroundChannel(); - - // We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries - ImGuiButtonFlags button_flags = 0; - if (flags & ImGuiSelectableFlags_NoHoldingActiveID) { button_flags |= ImGuiButtonFlags_NoHoldingActiveId; } - if (flags & ImGuiSelectableFlags_SelectOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; } - if (flags & ImGuiSelectableFlags_SelectOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; } - if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; } - if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; } - - const bool was_selected = selected; - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); - - // Auto-select when moved into - // - This will be more fully fleshed in the range-select branch - // - This is not exposed as it won't nicely work with some user side handling of shift/control - // - We cannot do 'if (g.NavJustMovedToId != id) { selected = false; pressed = was_selected; }' for two reasons - // - (1) it would require focus scope to be set, need exposing PushFocusScope() or equivalent (e.g. BeginSelection() calling PushFocusScope()) - // - (2) usage will fail with clipped items - // The multi-select API aim to fix those issues, e.g. may be replaced with a BeginSelection() API. - if ((flags & ImGuiSelectableFlags_SelectOnNav) && g.NavJustMovedToId != 0 && g.NavJustMovedToFocusScopeId == window->DC.NavFocusScopeIdCurrent) - if (g.NavJustMovedToId == id) - selected = pressed = true; - - // Update NavId when clicking or when Hovering (this doesn't happen on most widgets), so navigation can be resumed with gamepad/keyboard - if (pressed || (hovered && (flags & ImGuiSelectableFlags_SetNavIdOnHover))) - { - if (!g.NavDisableMouseHover && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent) - { - SetNavID(id, window->DC.NavLayerCurrent, window->DC.NavFocusScopeIdCurrent, WindowRectAbsToRel(window, bb)); // (bb == NavRect) - g.NavDisableHighlight = true; - } - } - if (pressed) - MarkItemEdited(id); - - if (flags & ImGuiSelectableFlags_AllowItemOverlap) - SetItemAllowOverlap(); - - // In this branch, Selectable() cannot toggle the selection so this will never trigger. - if (selected != was_selected) //-V547 - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection; - - // Render - if (held && (flags & ImGuiSelectableFlags_DrawHoveredWhenHeld)) - hovered = true; - if (hovered || selected) - { - const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); - RenderFrame(bb.Min, bb.Max, col, false, 0.0f); - } - RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); - - if (span_all_columns && window->DC.CurrentColumns) - PopColumnsBackground(); - else if (span_all_columns && g.CurrentTable) - TablePopBackgroundChannel(); - - RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb); - - // Automatically close popups - if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(g.LastItemData.InFlags & ImGuiItemFlags_SelectableDontClosePopup)) - CloseCurrentPopup(); - - if (disabled_item && !disabled_global) - EndDisabled(); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); - return pressed; //-V1020 -} - -bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) -{ - if (Selectable(label, *p_selected, flags, size_arg)) - { - *p_selected = !*p_selected; - return true; - } - return false; -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: ListBox -//------------------------------------------------------------------------- -// - BeginListBox() -// - EndListBox() -// - ListBox() -//------------------------------------------------------------------------- - -// Tip: To have a list filling the entire window width, use size.x = -FLT_MIN and pass an non-visible label e.g. "##empty" -// Tip: If your vertical size is calculated from an item count (e.g. 10 * item_height) consider adding a fractional part to facilitate seeing scrolling boundaries (e.g. 10.25 * item_height). -bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - const ImGuiStyle& style = g.Style; - const ImGuiID id = GetID(label); - const ImVec2 label_size = CalcTextSize(label, NULL, true); - - // Size default to hold ~7.25 items. - // Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. - ImVec2 size = ImFloor(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); - ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); - ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); - ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); - g.NextItemData.ClearFlags(); - - if (!IsRectVisible(bb.Min, bb.Max)) - { - ItemSize(bb.GetSize(), style.FramePadding.y); - ItemAdd(bb, 0, &frame_bb); - return false; - } - - // FIXME-OPT: We could omit the BeginGroup() if label_size.x but would need to omit the EndGroup() as well. - BeginGroup(); - if (label_size.x > 0.0f) - { - ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y); - RenderText(label_pos, label); - window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size); - } - - BeginChildFrame(id, frame_bb.GetSize()); - return true; -} - -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -// OBSOLETED in 1.81 (from February 2021) -bool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_items) -{ - // If height_in_items == -1, default height is maximum 7. - ImGuiContext& g = *GImGui; - float height_in_items_f = (height_in_items < 0 ? ImMin(items_count, 7) : height_in_items) + 0.25f; - ImVec2 size; - size.x = 0.0f; - size.y = GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f; - return BeginListBox(label, size); -} -#endif - -void ImGui::EndListBox() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT((window->Flags & ImGuiWindowFlags_ChildWindow) && "Mismatched BeginListBox/EndListBox calls. Did you test the return value of BeginListBox?"); - IM_UNUSED(window); - - EndChildFrame(); - EndGroup(); // This is only required to be able to do IsItemXXX query on the whole ListBox including label -} - -bool ImGui::ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_items) -{ - const bool value_changed = ListBox(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_items); - return value_changed; -} - -// This is merely a helper around BeginListBox(), EndListBox(). -// Considering using those directly to submit custom data or store selection differently. -bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items) -{ - ImGuiContext& g = *GImGui; - - // Calculate size from "height_in_items" - if (height_in_items < 0) - height_in_items = ImMin(items_count, 7); - float height_in_items_f = height_in_items + 0.25f; - ImVec2 size(0.0f, ImFloor(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f)); - - if (!BeginListBox(label, size)) - return false; - - // Assume all items have even height (= 1 line of text). If you need items of different height, - // you can create a custom version of ListBox() in your code without using the clipper. - bool value_changed = false; - ImGuiListClipper clipper; - clipper.Begin(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to. - while (clipper.Step()) - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) - { - const char* item_text; - if (!items_getter(data, i, &item_text)) - item_text = "*Unknown item*"; - - PushID(i); - const bool item_selected = (i == *current_item); - if (Selectable(item_text, item_selected)) - { - *current_item = i; - value_changed = true; - } - if (item_selected) - SetItemDefaultFocus(); - PopID(); - } - EndListBox(); - - if (value_changed) - MarkItemEdited(g.LastItemData.ID); - - return value_changed; -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: PlotLines, PlotHistogram -//------------------------------------------------------------------------- -// - PlotEx() [Internal] -// - PlotLines() -// - PlotHistogram() -//------------------------------------------------------------------------- -// Plot/Graph widgets are not very good. -// Consider writing your own, or using a third-party one, see: -// - ImPlot https://github.com/epezent/implot -// - others https://github.com/ocornut/imgui/wiki/Useful-Extensions -//------------------------------------------------------------------------- - -int ImGui::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 frame_size) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return -1; - - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - - const ImVec2 label_size = CalcTextSize(label, NULL, true); - if (frame_size.x == 0.0f) - frame_size.x = CalcItemWidth(); - if (frame_size.y == 0.0f) - frame_size.y = label_size.y + (style.FramePadding.y * 2); - - const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); - const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); - const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0)); - ItemSize(total_bb, style.FramePadding.y); - if (!ItemAdd(total_bb, 0, &frame_bb)) - return -1; - const bool hovered = ItemHoverable(frame_bb, id); - - // Determine scale from values if not specified - if (scale_min == FLT_MAX || scale_max == FLT_MAX) - { - float v_min = FLT_MAX; - float v_max = -FLT_MAX; - for (int i = 0; i < values_count; i++) - { - const float v = values_getter(data, i); - if (v != v) // Ignore NaN values - continue; - v_min = ImMin(v_min, v); - v_max = ImMax(v_max, v); - } - if (scale_min == FLT_MAX) - scale_min = v_min; - if (scale_max == FLT_MAX) - scale_max = v_max; - } - - RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - - const int values_count_min = (plot_type == ImGuiPlotType_Lines) ? 2 : 1; - int idx_hovered = -1; - if (values_count >= values_count_min) - { - int res_w = ImMin((int)frame_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); - int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); - - // Tooltip on hover - if (hovered && inner_bb.Contains(g.IO.MousePos)) - { - const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f); - const int v_idx = (int)(t * item_count); - IM_ASSERT(v_idx >= 0 && v_idx < values_count); - - const float v0 = values_getter(data, (v_idx + values_offset) % values_count); - const float v1 = values_getter(data, (v_idx + 1 + values_offset) % values_count); - if (plot_type == ImGuiPlotType_Lines) - SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx + 1, v1); - else if (plot_type == ImGuiPlotType_Histogram) - SetTooltip("%d: %8.4g", v_idx, v0); - idx_hovered = v_idx; - } - - const float t_step = 1.0f / (float)res_w; - const float inv_scale = (scale_min == scale_max) ? 0.0f : (1.0f / (scale_max - scale_min)); - - float v0 = values_getter(data, (0 + values_offset) % values_count); - float t0 = 0.0f; - ImVec2 tp0 = ImVec2( t0, 1.0f - ImSaturate((v0 - scale_min) * inv_scale) ); // Point in the normalized space of our target rectangle - float histogram_zero_line_t = (scale_min * scale_max < 0.0f) ? (1 + scale_min * inv_scale) : (scale_min < 0.0f ? 0.0f : 1.0f); // Where does the zero line stands - - const ImU32 col_base = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram); - const ImU32 col_hovered = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered); - - for (int n = 0; n < res_w; n++) - { - const float t1 = t0 + t_step; - const int v1_idx = (int)(t0 * item_count + 0.5f); - IM_ASSERT(v1_idx >= 0 && v1_idx < values_count); - const float v1 = values_getter(data, (v1_idx + values_offset + 1) % values_count); - const ImVec2 tp1 = ImVec2( t1, 1.0f - ImSaturate((v1 - scale_min) * inv_scale) ); - - // NB: Draw calls are merged together by the DrawList system. Still, we should render our batch are lower level to save a bit of CPU. - ImVec2 pos0 = ImLerp(inner_bb.Min, inner_bb.Max, tp0); - ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t)); - if (plot_type == ImGuiPlotType_Lines) - { - window->DrawList->AddLine(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); - } - else if (plot_type == ImGuiPlotType_Histogram) - { - if (pos1.x >= pos0.x + 2.0f) - pos1.x -= 1.0f; - window->DrawList->AddRectFilled(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); - } - - t0 = t1; - tp0 = tp1; - } - } - - // Text overlay - if (overlay_text) - RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, overlay_text, NULL, NULL, ImVec2(0.5f, 0.0f)); - - if (label_size.x > 0.0f) - RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label); - - // Return hovered index or -1 if none are hovered. - // This is currently not exposed in the public API because we need a larger redesign of the whole thing, but in the short-term we are making it available in PlotEx(). - return idx_hovered; -} - -struct ImGuiPlotArrayGetterData -{ - const float* Values; - int Stride; - - ImGuiPlotArrayGetterData(const float* values, int stride) { Values = values; Stride = stride; } -}; - -static float Plot_ArrayGetter(void* data, int idx) -{ - ImGuiPlotArrayGetterData* plot_data = (ImGuiPlotArrayGetterData*)data; - const float v = *(const float*)(const void*)((const unsigned char*)plot_data->Values + (size_t)idx * plot_data->Stride); - return v; -} - -void ImGui::PlotLines(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride) -{ - ImGuiPlotArrayGetterData data(values, stride); - PlotEx(ImGuiPlotType_Lines, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); -} - -void ImGui::PlotLines(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) -{ - PlotEx(ImGuiPlotType_Lines, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); -} - -void ImGui::PlotHistogram(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride) -{ - ImGuiPlotArrayGetterData data(values, stride); - PlotEx(ImGuiPlotType_Histogram, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); -} - -void ImGui::PlotHistogram(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) -{ - PlotEx(ImGuiPlotType_Histogram, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: Value helpers -// Those is not very useful, legacy API. -//------------------------------------------------------------------------- -// - Value() -//------------------------------------------------------------------------- - -void ImGui::Value(const char* prefix, bool b) -{ - Text("%s: %s", prefix, (b ? "true" : "false")); -} - -void ImGui::Value(const char* prefix, int v) -{ - Text("%s: %d", prefix, v); -} - -void ImGui::Value(const char* prefix, unsigned int v) -{ - Text("%s: %d", prefix, v); -} - -void ImGui::Value(const char* prefix, float v, const char* float_format) -{ - if (float_format) - { - char fmt[64]; - ImFormatString(fmt, IM_ARRAYSIZE(fmt), "%%s: %s", float_format); - Text(fmt, prefix, v); - } - else - { - Text("%s: %.3f", prefix, v); - } -} - -//------------------------------------------------------------------------- -// [SECTION] MenuItem, BeginMenu, EndMenu, etc. -//------------------------------------------------------------------------- -// - ImGuiMenuColumns [Internal] -// - BeginMenuBar() -// - EndMenuBar() -// - BeginMainMenuBar() -// - EndMainMenuBar() -// - BeginMenu() -// - EndMenu() -// - MenuItemEx() [Internal] -// - MenuItem() -//------------------------------------------------------------------------- - -// Helpers for internal use -void ImGuiMenuColumns::Update(float spacing, bool window_reappearing) -{ - if (window_reappearing) - memset(Widths, 0, sizeof(Widths)); - Spacing = (ImU16)spacing; - CalcNextTotalWidth(true); - memset(Widths, 0, sizeof(Widths)); - TotalWidth = NextTotalWidth; - NextTotalWidth = 0; -} - -void ImGuiMenuColumns::CalcNextTotalWidth(bool update_offsets) -{ - ImU16 offset = 0; - bool want_spacing = false; - for (int i = 0; i < IM_ARRAYSIZE(Widths); i++) - { - ImU16 width = Widths[i]; - if (want_spacing && width > 0) - offset += Spacing; - want_spacing |= (width > 0); - if (update_offsets) - { - if (i == 1) { OffsetLabel = offset; } - if (i == 2) { OffsetShortcut = offset; } - if (i == 3) { OffsetMark = offset; } - } - offset += width; - } - NextTotalWidth = offset; -} - -float ImGuiMenuColumns::DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark) -{ - Widths[0] = ImMax(Widths[0], (ImU16)w_icon); - Widths[1] = ImMax(Widths[1], (ImU16)w_label); - Widths[2] = ImMax(Widths[2], (ImU16)w_shortcut); - Widths[3] = ImMax(Widths[3], (ImU16)w_mark); - CalcNextTotalWidth(false); - return (float)ImMax(TotalWidth, NextTotalWidth); -} - -// FIXME: Provided a rectangle perhaps e.g. a BeginMenuBarEx() could be used anywhere.. -// Currently the main responsibility of this function being to setup clip-rect + horizontal layout + menu navigation layer. -// Ideally we also want this to be responsible for claiming space out of the main window scrolling rectangle, in which case ImGuiWindowFlags_MenuBar will become unnecessary. -// Then later the same system could be used for multiple menu-bars, scrollbars, side-bars. -bool ImGui::BeginMenuBar() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - if (!(window->Flags & ImGuiWindowFlags_MenuBar)) - return false; - - IM_ASSERT(!window->DC.MenuBarAppending); - BeginGroup(); // Backup position on layer 0 // FIXME: Misleading to use a group for that backup/restore - PushID("##menubar"); - - // We don't clip with current window clipping rectangle as it is already set to the area below. However we clip with window full rect. - // We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy. - ImRect bar_rect = window->MenuBarRect(); - ImRect clip_rect(IM_ROUND(bar_rect.Min.x + window->WindowBorderSize), IM_ROUND(bar_rect.Min.y + window->WindowBorderSize), IM_ROUND(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize))), IM_ROUND(bar_rect.Max.y)); - clip_rect.ClipWith(window->OuterRectClipped); - PushClipRect(clip_rect.Min, clip_rect.Max, false); - - // We overwrite CursorMaxPos because BeginGroup sets it to CursorPos (essentially the .EmitItem hack in EndMenuBar() would need something analogous here, maybe a BeginGroupEx() with flags). - window->DC.CursorPos = window->DC.CursorMaxPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffset.x, bar_rect.Min.y + window->DC.MenuBarOffset.y); - window->DC.LayoutType = ImGuiLayoutType_Horizontal; - window->DC.IsSameLine = false; - window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; - window->DC.MenuBarAppending = true; - AlignTextToFramePadding(); - return true; -} - -void ImGui::EndMenuBar() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - ImGuiContext& g = *GImGui; - - // Nav: When a move request within one of our child menu failed, capture the request to navigate among our siblings. - if (NavMoveRequestButNoResultYet() && (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right) && (g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) - { - // Try to find out if the request is for one of our child menu - ImGuiWindow* nav_earliest_child = g.NavWindow; - while (nav_earliest_child->ParentWindow && (nav_earliest_child->ParentWindow->Flags & ImGuiWindowFlags_ChildMenu)) - nav_earliest_child = nav_earliest_child->ParentWindow; - if (nav_earliest_child->ParentWindow == window && nav_earliest_child->DC.ParentLayoutType == ImGuiLayoutType_Horizontal && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded) == 0) - { - // To do so we claim focus back, restore NavId and then process the movement request for yet another frame. - // This involve a one-frame delay which isn't very problematic in this situation. We could remove it by scoring in advance for multiple window (probably not worth bothering) - const ImGuiNavLayer layer = ImGuiNavLayer_Menu; - IM_ASSERT(window->DC.NavLayersActiveMaskNext & (1 << layer)); // Sanity check - FocusWindow(window); - SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); - g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection. - g.NavDisableMouseHover = g.NavMousePosDirty = true; - NavMoveRequestForward(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); // Repeat - } - } - - IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" - IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar); - IM_ASSERT(window->DC.MenuBarAppending); - PopClipRect(); - PopID(); - window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->Pos.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos. - g.GroupStack.back().EmitItem = false; - EndGroup(); // Restore position on layer 0 - window->DC.LayoutType = ImGuiLayoutType_Vertical; - window->DC.IsSameLine = false; - window->DC.NavLayerCurrent = ImGuiNavLayer_Main; - window->DC.MenuBarAppending = false; -} - -// Important: calling order matters! -// FIXME: Somehow overlapping with docking tech. -// FIXME: The "rect-cut" aspect of this could be formalized into a lower-level helper (rect-cut: https://halt.software/dead-simple-layouts) -bool ImGui::BeginViewportSideBar(const char* name, ImGuiViewport* viewport_p, ImGuiDir dir, float axis_size, ImGuiWindowFlags window_flags) -{ - IM_ASSERT(dir != ImGuiDir_None); - - ImGuiWindow* bar_window = FindWindowByName(name); - if (bar_window == NULL || bar_window->BeginCount == 0) - { - // Calculate and set window size/position - ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)(viewport_p ? viewport_p : GetMainViewport()); - ImRect avail_rect = viewport->GetBuildWorkRect(); - ImGuiAxis axis = (dir == ImGuiDir_Up || dir == ImGuiDir_Down) ? ImGuiAxis_Y : ImGuiAxis_X; - ImVec2 pos = avail_rect.Min; - if (dir == ImGuiDir_Right || dir == ImGuiDir_Down) - pos[axis] = avail_rect.Max[axis] - axis_size; - ImVec2 size = avail_rect.GetSize(); - size[axis] = axis_size; - SetNextWindowPos(pos); - SetNextWindowSize(size); - - // Report our size into work area (for next frame) using actual window size - if (dir == ImGuiDir_Up || dir == ImGuiDir_Left) - viewport->BuildWorkOffsetMin[axis] += axis_size; - else if (dir == ImGuiDir_Down || dir == ImGuiDir_Right) - viewport->BuildWorkOffsetMax[axis] -= axis_size; - } - - window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove; - PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); - PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); // Lift normal size constraint - bool is_open = Begin(name, NULL, window_flags); - PopStyleVar(2); - - return is_open; -} - -bool ImGui::BeginMainMenuBar() -{ - ImGuiContext& g = *GImGui; - ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); - - // For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set. - // FIXME: This could be generalized as an opt-in way to clamp window->DC.CursorStartPos to avoid SafeArea? - // FIXME: Consider removing support for safe area down the line... it's messy. Nowadays consoles have support for TV calibration in OS settings. - g.NextWindowData.MenuBarOffsetMinVal = ImVec2(g.Style.DisplaySafeAreaPadding.x, ImMax(g.Style.DisplaySafeAreaPadding.y - g.Style.FramePadding.y, 0.0f)); - ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_MenuBar; - float height = GetFrameHeight(); - bool is_open = BeginViewportSideBar("##MainMenuBar", viewport, ImGuiDir_Up, height, window_flags); - g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f); - - if (is_open) - BeginMenuBar(); - else - End(); - return is_open; -} - -void ImGui::EndMainMenuBar() -{ - EndMenuBar(); - - // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window - // FIXME: With this strategy we won't be able to restore a NULL focus. - ImGuiContext& g = *GImGui; - if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest) - FocusTopMostWindowUnderOne(g.NavWindow, NULL); - - End(); -} - -static bool IsRootOfOpenMenuSet() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if ((g.OpenPopupStack.Size <= g.BeginPopupStack.Size) || (window->Flags & ImGuiWindowFlags_ChildMenu)) - return false; - - // Initially we used 'upper_popup->OpenParentId == window->IDStack.back()' to differentiate multiple menu sets from each others - // (e.g. inside menu bar vs loose menu items) based on parent ID. - // This would however prevent the use of e.g. PuhsID() user code submitting menus. - // Previously this worked between popup and a first child menu because the first child menu always had the _ChildWindow flag, - // making hovering on parent popup possible while first child menu was focused - but this was generally a bug with other side effects. - // Instead we don't treat Popup specifically (in order to consistently support menu features in them), maybe the first child menu of a Popup - // doesn't have the _ChildWindow flag, and we rely on this IsRootOfOpenMenuSet() check to allow hovering between root window/popup and first child menu. - // In the end, lack of ID check made it so we could no longer differentiate between separate menu sets. To compensate for that, we at least check parent window nav layer. - // This fixes the most common case of menu opening on hover when moving between window content and menu bar. Multiple different menu sets in same nav layer would still - // open on hover, but that should be a lesser problem, because if such menus are close in proximity in window content then it won't feel weird and if they are far apart - // it likely won't be a problem anyone runs into. - const ImGuiPopupData* upper_popup = &g.OpenPopupStack[g.BeginPopupStack.Size]; - return (window->DC.NavLayerCurrent == upper_popup->ParentNavLayer && upper_popup->Window && (upper_popup->Window->Flags & ImGuiWindowFlags_ChildMenu)); -} - -bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - bool menu_is_open = IsPopupOpen(id, ImGuiPopupFlags_None); - - // Sub-menus are ChildWindow so that mouse can be hovering across them (otherwise top-most popup menu would steal focus and not allow hovering on parent menu) - // The first menu in a hierarchy isn't so hovering doesn't get across (otherwise e.g. resizing borders with ImGuiButtonFlags_FlattenChildren would react), but top-most BeginMenu() will bypass that limitation. - ImGuiWindowFlags flags = ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoNavFocus; - if (window->Flags & ImGuiWindowFlags_ChildMenu) - flags |= ImGuiWindowFlags_ChildWindow; - - // If a menu with same the ID was already submitted, we will append to it, matching the behavior of Begin(). - // We are relying on a O(N) search - so O(N log N) over the frame - which seems like the most efficient for the expected small amount of BeginMenu() calls per frame. - // If somehow this is ever becoming a problem we can switch to use e.g. ImGuiStorage mapping key to last frame used. - if (g.MenusIdSubmittedThisFrame.contains(id)) - { - if (menu_is_open) - menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) - else - g.NextWindowData.ClearFlags(); // we behave like Begin() and need to consume those values - return menu_is_open; - } - - // Tag menu as used. Next time BeginMenu() with same ID is called it will append to existing menu - g.MenusIdSubmittedThisFrame.push_back(id); - - ImVec2 label_size = CalcTextSize(label, NULL, true); - - // Odd hack to allow hovering across menus of a same menu-set (otherwise we wouldn't be able to hover parent without always being a Child window) - const bool menuset_is_open = IsRootOfOpenMenuSet(); - ImGuiWindow* backed_nav_window = g.NavWindow; - if (menuset_is_open) - g.NavWindow = window; - - // The reference position stored in popup_pos will be used by Begin() to find a suitable position for the child menu, - // However the final position is going to be different! It is chosen by FindBestWindowPosForPopup(). - // e.g. Menus tend to overlap each other horizontally to amplify relative Z-ordering. - ImVec2 popup_pos, pos = window->DC.CursorPos; - PushID(label); - if (!enabled) - BeginDisabled(); - const ImGuiMenuColumns* offsets = &window->DC.MenuColumns; - bool pressed; - const ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_SelectOnClick | ImGuiSelectableFlags_DontClosePopups; - if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) - { - // Menu inside an horizontal menu bar - // Selectable extend their highlight by half ItemSpacing in each direction. - // For ChildMenu, the popup position will be overwritten by the call to FindBestWindowPosForPopup() in Begin() - popup_pos = ImVec2(pos.x - 1.0f - IM_FLOOR(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight()); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); - PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); - float w = label_size.x; - ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); - pressed = Selectable("", menu_is_open, selectable_flags, ImVec2(w, 0.0f)); - RenderText(text_pos, label); - PopStyleVar(); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). - } - else - { - // Menu inside a regular/vertical menu - // (In a typical menu window where all items are BeginMenu() or MenuItem() calls, extra_w will always be 0.0f. - // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. - popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y); - float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; - float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); - float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, 0.0f, checkmark_w); // Feedback to next frame - float extra_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); - ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); - pressed = Selectable("", menu_is_open, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f)); - RenderText(text_pos, label); - if (icon_w > 0.0f) - RenderText(pos + ImVec2(offsets->OffsetIcon, 0.0f), icon); - RenderArrow(window->DrawList, pos + ImVec2(offsets->OffsetMark + extra_w + g.FontSize * 0.30f, 0.0f), GetColorU32(ImGuiCol_Text), ImGuiDir_Right); - } - if (!enabled) - EndDisabled(); - - const bool hovered = (g.HoveredId == id) && enabled && !g.NavDisableMouseHover; - if (menuset_is_open) - g.NavWindow = backed_nav_window; - - bool want_open = false; - bool want_close = false; - if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) - { - // Close menu when not hovering it anymore unless we are moving roughly in the direction of the menu - // Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive. - bool moving_toward_child_menu = false; - ImGuiWindow* child_menu_window = (g.BeginPopupStack.Size < g.OpenPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].SourceWindow == window) ? g.OpenPopupStack[g.BeginPopupStack.Size].Window : NULL; - if (g.HoveredWindow == window && child_menu_window != NULL && !(window->Flags & ImGuiWindowFlags_MenuBar)) - { - float ref_unit = g.FontSize; // FIXME-DPI - ImRect next_window_rect = child_menu_window->Rect(); - ImVec2 ta = (g.IO.MousePos - g.IO.MouseDelta); - ImVec2 tb = (window->Pos.x < child_menu_window->Pos.x) ? next_window_rect.GetTL() : next_window_rect.GetTR(); - ImVec2 tc = (window->Pos.x < child_menu_window->Pos.x) ? next_window_rect.GetBL() : next_window_rect.GetBR(); - float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // add a bit of extra slack. - ta.x += (window->Pos.x < child_menu_window->Pos.x) ? -0.5f : +0.5f; // to avoid numerical issues (FIXME: ??) - tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -ref_unit * 8.0f); // triangle has maximum height to limit the slope and the bias toward large sub-menus - tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +ref_unit * 8.0f); - moving_toward_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos); - //GetForegroundDrawList()->AddTriangleFilled(ta, tb, tc, moving_toward_other_child_menu ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); // [DEBUG] - } - - // The 'HovereWindow == window' check creates an inconsistency (e.g. moving away from menu slowly tends to hit same window, whereas moving away fast does not) - // But we also need to not close the top-menu menu when moving over void. Perhaps we should extend the triangle check to a larger polygon. - // (Remember to test this on BeginPopup("A")->BeginMenu("B") sequence which behaves slightly differently as B isn't a Child of A and hovering isn't shared.) - if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu) - want_close = true; - - // Open - if (!menu_is_open && pressed) // Click/activate to open - want_open = true; - else if (!menu_is_open && hovered && !moving_toward_child_menu) // Hover to open - want_open = true; - if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open - { - want_open = true; - NavMoveRequestCancel(); - } - } - else - { - // Menu bar - if (menu_is_open && pressed && menuset_is_open) // Click an open menu again to close it - { - want_close = true; - want_open = menu_is_open = false; - } - else if (pressed || (hovered && menuset_is_open && !menu_is_open)) // First click to open, then hover to open others - { - want_open = true; - } - else if (g.NavId == id && g.NavMoveDir == ImGuiDir_Down) // Nav-Down to open - { - want_open = true; - NavMoveRequestCancel(); - } - } - - if (!enabled) // explicitly close if an open menu becomes disabled, facilitate users code a lot in pattern such as 'if (BeginMenu("options", has_object)) { ..use object.. }' - want_close = true; - if (want_close && IsPopupOpen(id, ImGuiPopupFlags_None)) - ClosePopupToLevel(g.BeginPopupStack.Size, true); - - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Openable | (menu_is_open ? ImGuiItemStatusFlags_Opened : 0)); - PopID(); - - if (!menu_is_open && want_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size) - { - // Don't recycle same menu level in the same frame, first close the other menu and yield for a frame. - OpenPopup(label); - return false; - } - - menu_is_open |= want_open; - if (want_open) - OpenPopup(label); - - if (menu_is_open) - { - SetNextWindowPos(popup_pos, ImGuiCond_Always); // Note: this is super misleading! The value will serve as reference for FindBestWindowPosForPopup(), not actual pos. - PushStyleVar(ImGuiStyleVar_ChildRounding, style.PopupRounding); // First level will use _PopupRounding, subsequent will use _ChildRounding - menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) - PopStyleVar(); - } - else - { - g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values - } - - return menu_is_open; -} - -bool ImGui::BeginMenu(const char* label, bool enabled) -{ - return BeginMenuEx(label, NULL, enabled); -} - -void ImGui::EndMenu() -{ - // Nav: When a left move request _within our child menu_ failed, close ourselves (the _parent_ menu). - // A menu doesn't close itself because EndMenuBar() wants the catch the last Left<>Right inputs. - // However, it means that with the current code, a BeginMenu() from outside another menu or a menu-bar won't be closable with the Left direction. - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.NavMoveDir == ImGuiDir_Left && NavMoveRequestButNoResultYet() && window->DC.LayoutType == ImGuiLayoutType_Vertical) - if (g.NavWindow && (g.NavWindow->RootWindowForNav->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->RootWindowForNav->ParentWindow == window) - { - ClosePopupToLevel(g.BeginPopupStack.Size, true); - NavMoveRequestCancel(); - } - - EndPopup(); -} - -bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut, bool selected, bool enabled) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return false; - - ImGuiContext& g = *GImGui; - ImGuiStyle& style = g.Style; - ImVec2 pos = window->DC.CursorPos; - ImVec2 label_size = CalcTextSize(label, NULL, true); - - const bool menuset_is_open = IsRootOfOpenMenuSet(); - ImGuiWindow* backed_nav_window = g.NavWindow; - if (menuset_is_open) - g.NavWindow = window; - - // We've been using the equivalent of ImGuiSelectableFlags_SetNavIdOnHover on all Selectable() since early Nav system days (commit 43ee5d73), - // but I am unsure whether this should be kept at all. For now moved it to be an opt-in feature used by menus only. - bool pressed; - PushID(label); - if (!enabled) - BeginDisabled(); - - const ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_SelectOnRelease | ImGuiSelectableFlags_SetNavIdOnHover; - const ImGuiMenuColumns* offsets = &window->DC.MenuColumns; - if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) - { - // Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful - // Note that in this situation: we don't render the shortcut, we render a highlight instead of the selected tick mark. - float w = label_size.x; - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); - ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); - PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); - pressed = Selectable("", selected, selectable_flags, ImVec2(w, 0.0f)); - PopStyleVar(); - RenderText(text_pos, label); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). - } - else - { - // Menu item inside a vertical menu - // (In a typical menu window where all items are BeginMenu() or MenuItem() calls, extra_w will always be 0.0f. - // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. - float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; - float shortcut_w = (shortcut && shortcut[0]) ? CalcTextSize(shortcut, NULL).x : 0.0f; - float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); - float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, shortcut_w, checkmark_w); // Feedback for next frame - float stretch_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); - pressed = Selectable("", false, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f)); - RenderText(pos + ImVec2(offsets->OffsetLabel, 0.0f), label); - if (icon_w > 0.0f) - RenderText(pos + ImVec2(offsets->OffsetIcon, 0.0f), icon); - if (shortcut_w > 0.0f) - { - PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); - RenderText(pos + ImVec2(offsets->OffsetShortcut + stretch_w, 0.0f), shortcut, NULL, false); - PopStyleColor(); - } - if (selected) - RenderCheckMark(window->DrawList, pos + ImVec2(offsets->OffsetMark + stretch_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(ImGuiCol_Text), g.FontSize * 0.866f); - } - IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (selected ? ImGuiItemStatusFlags_Checked : 0)); - if (!enabled) - EndDisabled(); - PopID(); - if (menuset_is_open) - g.NavWindow = backed_nav_window; - - return pressed; -} - -bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, bool enabled) -{ - return MenuItemEx(label, NULL, shortcut, selected, enabled); -} - -bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled) -{ - if (MenuItemEx(label, NULL, shortcut, p_selected ? *p_selected : false, enabled)) - { - if (p_selected) - *p_selected = !*p_selected; - return true; - } - return false; -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: BeginTabBar, EndTabBar, etc. -//------------------------------------------------------------------------- -// - BeginTabBar() -// - BeginTabBarEx() [Internal] -// - EndTabBar() -// - TabBarLayout() [Internal] -// - TabBarCalcTabID() [Internal] -// - TabBarCalcMaxTabWidth() [Internal] -// - TabBarFindTabById() [Internal] -// - TabBarRemoveTab() [Internal] -// - TabBarCloseTab() [Internal] -// - TabBarScrollClamp() [Internal] -// - TabBarScrollToTab() [Internal] -// - TabBarQueueChangeTabOrder() [Internal] -// - TabBarScrollingButtons() [Internal] -// - TabBarTabListPopupButton() [Internal] -//------------------------------------------------------------------------- - -struct ImGuiTabBarSection -{ - int TabCount; // Number of tabs in this section. - float Width; // Sum of width of tabs in this section (after shrinking down) - float Spacing; // Horizontal spacing at the end of the section. - - ImGuiTabBarSection() { memset(this, 0, sizeof(*this)); } -}; - -namespace ImGui -{ - static void TabBarLayout(ImGuiTabBar* tab_bar); - static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label); - static float TabBarCalcMaxTabWidth(); - static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling); - static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections); - static ImGuiTabItem* TabBarScrollingButtons(ImGuiTabBar* tab_bar); - static ImGuiTabItem* TabBarTabListPopupButton(ImGuiTabBar* tab_bar); -} - -ImGuiTabBar::ImGuiTabBar() -{ - memset(this, 0, sizeof(*this)); - CurrFrameVisible = PrevFrameVisible = -1; - LastTabItemIdx = -1; -} - -static inline int TabItemGetSectionIdx(const ImGuiTabItem* tab) -{ - return (tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; -} - -static int IMGUI_CDECL TabItemComparerBySection(const void* lhs, const void* rhs) -{ - const ImGuiTabItem* a = (const ImGuiTabItem*)lhs; - const ImGuiTabItem* b = (const ImGuiTabItem*)rhs; - const int a_section = TabItemGetSectionIdx(a); - const int b_section = TabItemGetSectionIdx(b); - if (a_section != b_section) - return a_section - b_section; - return (int)(a->IndexDuringLayout - b->IndexDuringLayout); -} - -static int IMGUI_CDECL TabItemComparerByBeginOrder(const void* lhs, const void* rhs) -{ - const ImGuiTabItem* a = (const ImGuiTabItem*)lhs; - const ImGuiTabItem* b = (const ImGuiTabItem*)rhs; - return (int)(a->BeginOrder - b->BeginOrder); -} - -static ImGuiTabBar* GetTabBarFromTabBarRef(const ImGuiPtrOrIndex& ref) -{ - ImGuiContext& g = *GImGui; - return ref.Ptr ? (ImGuiTabBar*)ref.Ptr : g.TabBars.GetByIndex(ref.Index); -} - -static ImGuiPtrOrIndex GetTabBarRefFromTabBar(ImGuiTabBar* tab_bar) -{ - ImGuiContext& g = *GImGui; - if (g.TabBars.Contains(tab_bar)) - return ImGuiPtrOrIndex(g.TabBars.GetIndex(tab_bar)); - return ImGuiPtrOrIndex(tab_bar); -} - -bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - - ImGuiID id = window->GetID(str_id); - ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id); - ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->WorkRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2); - tab_bar->ID = id; - return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused); -} - -bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImGuiTabBarFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - - if ((flags & ImGuiTabBarFlags_DockNode) == 0) - PushOverrideID(tab_bar->ID); - - // Add to stack - g.CurrentTabBarStack.push_back(GetTabBarRefFromTabBar(tab_bar)); - g.CurrentTabBar = tab_bar; - - // Append with multiple BeginTabBar()/EndTabBar() pairs. - tab_bar->BackupCursorPos = window->DC.CursorPos; - if (tab_bar->CurrFrameVisible == g.FrameCount) - { - window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); - tab_bar->BeginCount++; - return true; - } - - // Ensure correct ordering when toggling ImGuiTabBarFlags_Reorderable flag, or when a new tab was added while being not reorderable - if ((flags & ImGuiTabBarFlags_Reorderable) != (tab_bar->Flags & ImGuiTabBarFlags_Reorderable) || (tab_bar->TabsAddedNew && !(flags & ImGuiTabBarFlags_Reorderable))) - ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerByBeginOrder); - tab_bar->TabsAddedNew = false; - - // Flags - if ((flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) - flags |= ImGuiTabBarFlags_FittingPolicyDefault_; - - tab_bar->Flags = flags; - tab_bar->BarRect = tab_bar_bb; - tab_bar->WantLayout = true; // Layout will be done on the first call to ItemTab() - tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible; - tab_bar->CurrFrameVisible = g.FrameCount; - tab_bar->PrevTabsContentsHeight = tab_bar->CurrTabsContentsHeight; - tab_bar->CurrTabsContentsHeight = 0.0f; - tab_bar->ItemSpacingY = g.Style.ItemSpacing.y; - tab_bar->FramePadding = g.Style.FramePadding; - tab_bar->TabsActiveCount = 0; - tab_bar->BeginCount = 1; - - // Set cursor pos in a way which only be used in the off-chance the user erroneously submits item before BeginTabItem(): items will overlap - window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); - - // Draw separator - const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive); - const float y = tab_bar->BarRect.Max.y - 1.0f; - { - const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f); - const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f); - window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f); - } - return true; -} - -void ImGui::EndTabBar() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - ImGuiTabBar* tab_bar = g.CurrentTabBar; - if (tab_bar == NULL) - { - IM_ASSERT_USER_ERROR(tab_bar != NULL, "Mismatched BeginTabBar()/EndTabBar()!"); - return; - } - - // Fallback in case no TabItem have been submitted - if (tab_bar->WantLayout) - TabBarLayout(tab_bar); - - // Restore the last visible height if no tab is visible, this reduce vertical flicker/movement when a tabs gets removed without calling SetTabItemClosed(). - const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); - if (tab_bar->VisibleTabWasSubmitted || tab_bar->VisibleTabId == 0 || tab_bar_appearing) - { - tab_bar->CurrTabsContentsHeight = ImMax(window->DC.CursorPos.y - tab_bar->BarRect.Max.y, tab_bar->CurrTabsContentsHeight); - window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->CurrTabsContentsHeight; - } - else - { - window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->PrevTabsContentsHeight; - } - if (tab_bar->BeginCount > 1) - window->DC.CursorPos = tab_bar->BackupCursorPos; - - if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0) - PopID(); - - g.CurrentTabBarStack.pop_back(); - g.CurrentTabBar = g.CurrentTabBarStack.empty() ? NULL : GetTabBarFromTabBarRef(g.CurrentTabBarStack.back()); -} - -// This is called only once a frame before by the first call to ItemTab() -// The reason we're not calling it in BeginTabBar() is to leave a chance to the user to call the SetTabItemClosed() functions. -static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) -{ - ImGuiContext& g = *GImGui; - tab_bar->WantLayout = false; - - // Garbage collect by compacting list - // Detect if we need to sort out tab list (e.g. in rare case where a tab changed section) - int tab_dst_n = 0; - bool need_sort_by_section = false; - ImGuiTabBarSection sections[3]; // Layout sections: Leading, Central, Trailing - for (int tab_src_n = 0; tab_src_n < tab_bar->Tabs.Size; tab_src_n++) - { - ImGuiTabItem* tab = &tab_bar->Tabs[tab_src_n]; - if (tab->LastFrameVisible < tab_bar->PrevFrameVisible || tab->WantClose) - { - // Remove tab - if (tab_bar->VisibleTabId == tab->ID) { tab_bar->VisibleTabId = 0; } - if (tab_bar->SelectedTabId == tab->ID) { tab_bar->SelectedTabId = 0; } - if (tab_bar->NextSelectedTabId == tab->ID) { tab_bar->NextSelectedTabId = 0; } - continue; - } - if (tab_dst_n != tab_src_n) - tab_bar->Tabs[tab_dst_n] = tab_bar->Tabs[tab_src_n]; - - tab = &tab_bar->Tabs[tab_dst_n]; - tab->IndexDuringLayout = (ImS16)tab_dst_n; - - // We will need sorting if tabs have changed section (e.g. moved from one of Leading/Central/Trailing to another) - int curr_tab_section_n = TabItemGetSectionIdx(tab); - if (tab_dst_n > 0) - { - ImGuiTabItem* prev_tab = &tab_bar->Tabs[tab_dst_n - 1]; - int prev_tab_section_n = TabItemGetSectionIdx(prev_tab); - if (curr_tab_section_n == 0 && prev_tab_section_n != 0) - need_sort_by_section = true; - if (prev_tab_section_n == 2 && curr_tab_section_n != 2) - need_sort_by_section = true; - } - - sections[curr_tab_section_n].TabCount++; - tab_dst_n++; - } - if (tab_bar->Tabs.Size != tab_dst_n) - tab_bar->Tabs.resize(tab_dst_n); - - if (need_sort_by_section) - ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerBySection); - - // Calculate spacing between sections - sections[0].Spacing = sections[0].TabCount > 0 && (sections[1].TabCount + sections[2].TabCount) > 0 ? g.Style.ItemInnerSpacing.x : 0.0f; - sections[1].Spacing = sections[1].TabCount > 0 && sections[2].TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f; - - // Setup next selected tab - ImGuiID scroll_to_tab_id = 0; - if (tab_bar->NextSelectedTabId) - { - tab_bar->SelectedTabId = tab_bar->NextSelectedTabId; - tab_bar->NextSelectedTabId = 0; - scroll_to_tab_id = tab_bar->SelectedTabId; - } - - // Process order change request (we could probably process it when requested but it's just saner to do it in a single spot). - if (tab_bar->ReorderRequestTabId != 0) - { - if (TabBarProcessReorder(tab_bar)) - if (tab_bar->ReorderRequestTabId == tab_bar->SelectedTabId) - scroll_to_tab_id = tab_bar->ReorderRequestTabId; - tab_bar->ReorderRequestTabId = 0; - } - - // Tab List Popup (will alter tab_bar->BarRect and therefore the available width!) - const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0; - if (tab_list_popup_button) - if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Min.x! - scroll_to_tab_id = tab_bar->SelectedTabId = tab_to_select->ID; - - // Leading/Trailing tabs will be shrink only if central one aren't visible anymore, so layout the shrink data as: leading, trailing, central - // (whereas our tabs are stored as: leading, central, trailing) - int shrink_buffer_indexes[3] = { 0, sections[0].TabCount + sections[2].TabCount, sections[0].TabCount }; - g.ShrinkWidthBuffer.resize(tab_bar->Tabs.Size); - - // Compute ideal tabs widths + store them into shrink buffer - ImGuiTabItem* most_recently_selected_tab = NULL; - int curr_section_n = -1; - bool found_selected_tab_id = false; - for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) - { - ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; - IM_ASSERT(tab->LastFrameVisible >= tab_bar->PrevFrameVisible); - - if ((most_recently_selected_tab == NULL || most_recently_selected_tab->LastFrameSelected < tab->LastFrameSelected) && !(tab->Flags & ImGuiTabItemFlags_Button)) - most_recently_selected_tab = tab; - if (tab->ID == tab_bar->SelectedTabId) - found_selected_tab_id = true; - if (scroll_to_tab_id == 0 && g.NavJustMovedToId == tab->ID) - scroll_to_tab_id = tab->ID; - - // Refresh tab width immediately, otherwise changes of style e.g. style.FramePadding.x would noticeably lag in the tab bar. - // Additionally, when using TabBarAddTab() to manipulate tab bar order we occasionally insert new tabs that don't have a width yet, - // and we cannot wait for the next BeginTabItem() call. We cannot compute this width within TabBarAddTab() because font size depends on the active window. - const char* tab_name = tab_bar->GetTabName(tab); - const bool has_close_button = (tab->Flags & ImGuiTabItemFlags_NoCloseButton) ? false : true; - tab->ContentWidth = (tab->RequestedWidth > 0.0f) ? tab->RequestedWidth : TabItemCalcSize(tab_name, has_close_button).x; - - int section_n = TabItemGetSectionIdx(tab); - ImGuiTabBarSection* section = §ions[section_n]; - section->Width += tab->ContentWidth + (section_n == curr_section_n ? g.Style.ItemInnerSpacing.x : 0.0f); - curr_section_n = section_n; - - // Store data so we can build an array sorted by width if we need to shrink tabs down - IM_MSVC_WARNING_SUPPRESS(6385); - ImGuiShrinkWidthItem* shrink_width_item = &g.ShrinkWidthBuffer[shrink_buffer_indexes[section_n]++]; - shrink_width_item->Index = tab_n; - shrink_width_item->Width = shrink_width_item->InitialWidth = tab->ContentWidth; - - IM_ASSERT(tab->ContentWidth > 0.0f); - tab->Width = tab->ContentWidth; - } - - // Compute total ideal width (used for e.g. auto-resizing a window) - tab_bar->WidthAllTabsIdeal = 0.0f; - for (int section_n = 0; section_n < 3; section_n++) - tab_bar->WidthAllTabsIdeal += sections[section_n].Width + sections[section_n].Spacing; - - // Horizontal scrolling buttons - // (note that TabBarScrollButtons() will alter BarRect.Max.x) - if ((tab_bar->WidthAllTabsIdeal > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll)) - if (ImGuiTabItem* scroll_and_select_tab = TabBarScrollingButtons(tab_bar)) - { - scroll_to_tab_id = scroll_and_select_tab->ID; - if ((scroll_and_select_tab->Flags & ImGuiTabItemFlags_Button) == 0) - tab_bar->SelectedTabId = scroll_to_tab_id; - } - - // Shrink widths if full tabs don't fit in their allocated space - float section_0_w = sections[0].Width + sections[0].Spacing; - float section_1_w = sections[1].Width + sections[1].Spacing; - float section_2_w = sections[2].Width + sections[2].Spacing; - bool central_section_is_visible = (section_0_w + section_2_w) < tab_bar->BarRect.GetWidth(); - float width_excess; - if (central_section_is_visible) - width_excess = ImMax(section_1_w - (tab_bar->BarRect.GetWidth() - section_0_w - section_2_w), 0.0f); // Excess used to shrink central section - else - width_excess = (section_0_w + section_2_w) - tab_bar->BarRect.GetWidth(); // Excess used to shrink leading/trailing section - - // With ImGuiTabBarFlags_FittingPolicyScroll policy, we will only shrink leading/trailing if the central section is not visible anymore - if (width_excess > 0.0f && ((tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown) || !central_section_is_visible)) - { - int shrink_data_count = (central_section_is_visible ? sections[1].TabCount : sections[0].TabCount + sections[2].TabCount); - int shrink_data_offset = (central_section_is_visible ? sections[0].TabCount + sections[2].TabCount : 0); - ShrinkWidths(g.ShrinkWidthBuffer.Data + shrink_data_offset, shrink_data_count, width_excess); - - // Apply shrunk values into tabs and sections - for (int tab_n = shrink_data_offset; tab_n < shrink_data_offset + shrink_data_count; tab_n++) - { - ImGuiTabItem* tab = &tab_bar->Tabs[g.ShrinkWidthBuffer[tab_n].Index]; - float shrinked_width = IM_FLOOR(g.ShrinkWidthBuffer[tab_n].Width); - if (shrinked_width < 0.0f) - continue; - - int section_n = TabItemGetSectionIdx(tab); - sections[section_n].Width -= (tab->Width - shrinked_width); - tab->Width = shrinked_width; - } - } - - // Layout all active tabs - int section_tab_index = 0; - float tab_offset = 0.0f; - tab_bar->WidthAllTabs = 0.0f; - for (int section_n = 0; section_n < 3; section_n++) - { - ImGuiTabBarSection* section = §ions[section_n]; - if (section_n == 2) - tab_offset = ImMin(ImMax(0.0f, tab_bar->BarRect.GetWidth() - section->Width), tab_offset); - - for (int tab_n = 0; tab_n < section->TabCount; tab_n++) - { - ImGuiTabItem* tab = &tab_bar->Tabs[section_tab_index + tab_n]; - tab->Offset = tab_offset; - tab_offset += tab->Width + (tab_n < section->TabCount - 1 ? g.Style.ItemInnerSpacing.x : 0.0f); - } - tab_bar->WidthAllTabs += ImMax(section->Width + section->Spacing, 0.0f); - tab_offset += section->Spacing; - section_tab_index += section->TabCount; - } - - // If we have lost the selected tab, select the next most recently active one - if (found_selected_tab_id == false) - tab_bar->SelectedTabId = 0; - if (tab_bar->SelectedTabId == 0 && tab_bar->NextSelectedTabId == 0 && most_recently_selected_tab != NULL) - scroll_to_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID; - - // Lock in visible tab - tab_bar->VisibleTabId = tab_bar->SelectedTabId; - tab_bar->VisibleTabWasSubmitted = false; - - // Update scrolling - if (scroll_to_tab_id != 0) - TabBarScrollToTab(tab_bar, scroll_to_tab_id, sections); - tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim); - tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget); - if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget) - { - // Scrolling speed adjust itself so we can always reach our target in 1/3 seconds. - // Teleport if we are aiming far off the visible line - tab_bar->ScrollingSpeed = ImMax(tab_bar->ScrollingSpeed, 70.0f * g.FontSize); - tab_bar->ScrollingSpeed = ImMax(tab_bar->ScrollingSpeed, ImFabs(tab_bar->ScrollingTarget - tab_bar->ScrollingAnim) / 0.3f); - const bool teleport = (tab_bar->PrevFrameVisible + 1 < g.FrameCount) || (tab_bar->ScrollingTargetDistToVisibility > 10.0f * g.FontSize); - tab_bar->ScrollingAnim = teleport ? tab_bar->ScrollingTarget : ImLinearSweep(tab_bar->ScrollingAnim, tab_bar->ScrollingTarget, g.IO.DeltaTime * tab_bar->ScrollingSpeed); - } - else - { - tab_bar->ScrollingSpeed = 0.0f; - } - tab_bar->ScrollingRectMinX = tab_bar->BarRect.Min.x + sections[0].Width + sections[0].Spacing; - tab_bar->ScrollingRectMaxX = tab_bar->BarRect.Max.x - sections[2].Width - sections[1].Spacing; - - // Clear name buffers - if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0) - tab_bar->TabsNames.Buf.resize(0); - - // Actual layout in host window (we don't do it in BeginTabBar() so as not to waste an extra frame) - ImGuiWindow* window = g.CurrentWindow; - window->DC.CursorPos = tab_bar->BarRect.Min; - ItemSize(ImVec2(tab_bar->WidthAllTabs, tab_bar->BarRect.GetHeight()), tab_bar->FramePadding.y); - window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, tab_bar->BarRect.Min.x + tab_bar->WidthAllTabsIdeal); -} - -// Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack. -static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label) -{ - if (tab_bar->Flags & ImGuiTabBarFlags_DockNode) - { - ImGuiID id = ImHashStr(label); - KeepAliveID(id); - return id; - } - else - { - ImGuiWindow* window = GImGui->CurrentWindow; - return window->GetID(label); - } -} - -static float ImGui::TabBarCalcMaxTabWidth() -{ - ImGuiContext& g = *GImGui; - return g.FontSize * 20.0f; -} - -ImGuiTabItem* ImGui::TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id) -{ - if (tab_id != 0) - for (int n = 0; n < tab_bar->Tabs.Size; n++) - if (tab_bar->Tabs[n].ID == tab_id) - return &tab_bar->Tabs[n]; - return NULL; -} - -// The *TabId fields be already set by the docking system _before_ the actual TabItem was created, so we clear them regardless. -void ImGui::TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id) -{ - if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id)) - tab_bar->Tabs.erase(tab); - if (tab_bar->VisibleTabId == tab_id) { tab_bar->VisibleTabId = 0; } - if (tab_bar->SelectedTabId == tab_id) { tab_bar->SelectedTabId = 0; } - if (tab_bar->NextSelectedTabId == tab_id) { tab_bar->NextSelectedTabId = 0; } -} - -// Called on manual closure attempt -void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) -{ - IM_ASSERT(!(tab->Flags & ImGuiTabItemFlags_Button)); - if (!(tab->Flags & ImGuiTabItemFlags_UnsavedDocument)) - { - // This will remove a frame of lag for selecting another tab on closure. - // However we don't run it in the case where the 'Unsaved' flag is set, so user gets a chance to fully undo the closure - tab->WantClose = true; - if (tab_bar->VisibleTabId == tab->ID) - { - tab->LastFrameVisible = -1; - tab_bar->SelectedTabId = tab_bar->NextSelectedTabId = 0; - } - } - else - { - // Actually select before expecting closure attempt (on an UnsavedDocument tab user is expect to e.g. show a popup) - if (tab_bar->VisibleTabId != tab->ID) - tab_bar->NextSelectedTabId = tab->ID; - } -} - -static float ImGui::TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling) -{ - scrolling = ImMin(scrolling, tab_bar->WidthAllTabs - tab_bar->BarRect.GetWidth()); - return ImMax(scrolling, 0.0f); -} - -// Note: we may scroll to tab that are not selected! e.g. using keyboard arrow keys -static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections) -{ - ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id); - if (tab == NULL) - return; - if (tab->Flags & ImGuiTabItemFlags_SectionMask_) - return; - - ImGuiContext& g = *GImGui; - float margin = g.FontSize * 1.0f; // When to scroll to make Tab N+1 visible always make a bit of N visible to suggest more scrolling area (since we don't have a scrollbar) - int order = tab_bar->GetTabOrder(tab); - - // Scrolling happens only in the central section (leading/trailing sections are not scrolling) - // FIXME: This is all confusing. - float scrollable_width = tab_bar->BarRect.GetWidth() - sections[0].Width - sections[2].Width - sections[1].Spacing; - - // We make all tabs positions all relative Sections[0].Width to make code simpler - float tab_x1 = tab->Offset - sections[0].Width + (order > sections[0].TabCount - 1 ? -margin : 0.0f); - float tab_x2 = tab->Offset - sections[0].Width + tab->Width + (order + 1 < tab_bar->Tabs.Size - sections[2].TabCount ? margin : 1.0f); - tab_bar->ScrollingTargetDistToVisibility = 0.0f; - if (tab_bar->ScrollingTarget > tab_x1 || (tab_x2 - tab_x1 >= scrollable_width)) - { - // Scroll to the left - tab_bar->ScrollingTargetDistToVisibility = ImMax(tab_bar->ScrollingAnim - tab_x2, 0.0f); - tab_bar->ScrollingTarget = tab_x1; - } - else if (tab_bar->ScrollingTarget < tab_x2 - scrollable_width) - { - // Scroll to the right - tab_bar->ScrollingTargetDistToVisibility = ImMax((tab_x1 - scrollable_width) - tab_bar->ScrollingAnim, 0.0f); - tab_bar->ScrollingTarget = tab_x2 - scrollable_width; - } -} - -void ImGui::TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset) -{ - IM_ASSERT(offset != 0); - IM_ASSERT(tab_bar->ReorderRequestTabId == 0); - tab_bar->ReorderRequestTabId = tab->ID; - tab_bar->ReorderRequestOffset = (ImS16)offset; -} - -void ImGui::TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* src_tab, ImVec2 mouse_pos) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(tab_bar->ReorderRequestTabId == 0); - if ((tab_bar->Flags & ImGuiTabBarFlags_Reorderable) == 0) - return; - - const bool is_central_section = (src_tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0; - const float bar_offset = tab_bar->BarRect.Min.x - (is_central_section ? tab_bar->ScrollingTarget : 0); - - // Count number of contiguous tabs we are crossing over - const int dir = (bar_offset + src_tab->Offset) > mouse_pos.x ? -1 : +1; - const int src_idx = tab_bar->Tabs.index_from_ptr(src_tab); - int dst_idx = src_idx; - for (int i = src_idx; i >= 0 && i < tab_bar->Tabs.Size; i += dir) - { - // Reordered tabs must share the same section - const ImGuiTabItem* dst_tab = &tab_bar->Tabs[i]; - if (dst_tab->Flags & ImGuiTabItemFlags_NoReorder) - break; - if ((dst_tab->Flags & ImGuiTabItemFlags_SectionMask_) != (src_tab->Flags & ImGuiTabItemFlags_SectionMask_)) - break; - dst_idx = i; - - // Include spacing after tab, so when mouse cursor is between tabs we would not continue checking further tabs that are not hovered. - const float x1 = bar_offset + dst_tab->Offset - g.Style.ItemInnerSpacing.x; - const float x2 = bar_offset + dst_tab->Offset + dst_tab->Width + g.Style.ItemInnerSpacing.x; - //GetForegroundDrawList()->AddRect(ImVec2(x1, tab_bar->BarRect.Min.y), ImVec2(x2, tab_bar->BarRect.Max.y), IM_COL32(255, 0, 0, 255)); - if ((dir < 0 && mouse_pos.x > x1) || (dir > 0 && mouse_pos.x < x2)) - break; - } - - if (dst_idx != src_idx) - TabBarQueueReorder(tab_bar, src_tab, dst_idx - src_idx); -} - -bool ImGui::TabBarProcessReorder(ImGuiTabBar* tab_bar) -{ - ImGuiTabItem* tab1 = TabBarFindTabByID(tab_bar, tab_bar->ReorderRequestTabId); - if (tab1 == NULL || (tab1->Flags & ImGuiTabItemFlags_NoReorder)) - return false; - - //IM_ASSERT(tab_bar->Flags & ImGuiTabBarFlags_Reorderable); // <- this may happen when using debug tools - int tab2_order = tab_bar->GetTabOrder(tab1) + tab_bar->ReorderRequestOffset; - if (tab2_order < 0 || tab2_order >= tab_bar->Tabs.Size) - return false; - - // Reordered tabs must share the same section - // (Note: TabBarQueueReorderFromMousePos() also has a similar test but since we allow direct calls to TabBarQueueReorder() we do it here too) - ImGuiTabItem* tab2 = &tab_bar->Tabs[tab2_order]; - if (tab2->Flags & ImGuiTabItemFlags_NoReorder) - return false; - if ((tab1->Flags & ImGuiTabItemFlags_SectionMask_) != (tab2->Flags & ImGuiTabItemFlags_SectionMask_)) - return false; - - ImGuiTabItem item_tmp = *tab1; - ImGuiTabItem* src_tab = (tab_bar->ReorderRequestOffset > 0) ? tab1 + 1 : tab2; - ImGuiTabItem* dst_tab = (tab_bar->ReorderRequestOffset > 0) ? tab1 : tab2 + 1; - const int move_count = (tab_bar->ReorderRequestOffset > 0) ? tab_bar->ReorderRequestOffset : -tab_bar->ReorderRequestOffset; - memmove(dst_tab, src_tab, move_count * sizeof(ImGuiTabItem)); - *tab2 = item_tmp; - - if (tab_bar->Flags & ImGuiTabBarFlags_SaveSettings) - MarkIniSettingsDirty(); - return true; -} - -static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - const ImVec2 arrow_button_size(g.FontSize - 2.0f, g.FontSize + g.Style.FramePadding.y * 2.0f); - const float scrolling_buttons_width = arrow_button_size.x * 2.0f; - - const ImVec2 backup_cursor_pos = window->DC.CursorPos; - //window->DrawList->AddRect(ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Max.x, tab_bar->BarRect.Max.y), IM_COL32(255,0,0,255)); - - int select_dir = 0; - ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text]; - arrow_col.w *= 0.5f; - - PushStyleColor(ImGuiCol_Text, arrow_col); - PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - const float backup_repeat_delay = g.IO.KeyRepeatDelay; - const float backup_repeat_rate = g.IO.KeyRepeatRate; - g.IO.KeyRepeatDelay = 0.250f; - g.IO.KeyRepeatRate = 0.200f; - float x = ImMax(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.x - scrolling_buttons_width); - window->DC.CursorPos = ImVec2(x, tab_bar->BarRect.Min.y); - if (ArrowButtonEx("##<", ImGuiDir_Left, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat)) - select_dir = -1; - window->DC.CursorPos = ImVec2(x + arrow_button_size.x, tab_bar->BarRect.Min.y); - if (ArrowButtonEx("##>", ImGuiDir_Right, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat)) - select_dir = +1; - PopStyleColor(2); - g.IO.KeyRepeatRate = backup_repeat_rate; - g.IO.KeyRepeatDelay = backup_repeat_delay; - - ImGuiTabItem* tab_to_scroll_to = NULL; - if (select_dir != 0) - if (ImGuiTabItem* tab_item = TabBarFindTabByID(tab_bar, tab_bar->SelectedTabId)) - { - int selected_order = tab_bar->GetTabOrder(tab_item); - int target_order = selected_order + select_dir; - - // Skip tab item buttons until another tab item is found or end is reached - while (tab_to_scroll_to == NULL) - { - // If we are at the end of the list, still scroll to make our tab visible - tab_to_scroll_to = &tab_bar->Tabs[(target_order >= 0 && target_order < tab_bar->Tabs.Size) ? target_order : selected_order]; - - // Cross through buttons - // (even if first/last item is a button, return it so we can update the scroll) - if (tab_to_scroll_to->Flags & ImGuiTabItemFlags_Button) - { - target_order += select_dir; - selected_order += select_dir; - tab_to_scroll_to = (target_order < 0 || target_order >= tab_bar->Tabs.Size) ? tab_to_scroll_to : NULL; - } - } - } - window->DC.CursorPos = backup_cursor_pos; - tab_bar->BarRect.Max.x -= scrolling_buttons_width + 1.0f; - - return tab_to_scroll_to; -} - -static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // We use g.Style.FramePadding.y to match the square ArrowButton size - const float tab_list_popup_button_width = g.FontSize + g.Style.FramePadding.y; - const ImVec2 backup_cursor_pos = window->DC.CursorPos; - window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x - g.Style.FramePadding.y, tab_bar->BarRect.Min.y); - tab_bar->BarRect.Min.x += tab_list_popup_button_width; - - ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text]; - arrow_col.w *= 0.5f; - PushStyleColor(ImGuiCol_Text, arrow_col); - PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview | ImGuiComboFlags_HeightLargest); - PopStyleColor(2); - - ImGuiTabItem* tab_to_select = NULL; - if (open) - { - for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) - { - ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; - if (tab->Flags & ImGuiTabItemFlags_Button) - continue; - - const char* tab_name = tab_bar->GetTabName(tab); - if (Selectable(tab_name, tab_bar->SelectedTabId == tab->ID)) - tab_to_select = tab; - } - EndCombo(); - } - - window->DC.CursorPos = backup_cursor_pos; - return tab_to_select; -} - -//------------------------------------------------------------------------- -// [SECTION] Widgets: BeginTabItem, EndTabItem, etc. -//------------------------------------------------------------------------- -// - BeginTabItem() -// - EndTabItem() -// - TabItemButton() -// - TabItemEx() [Internal] -// - SetTabItemClosed() -// - TabItemCalcSize() [Internal] -// - TabItemBackground() [Internal] -// - TabItemLabelAndCloseButton() [Internal] -//------------------------------------------------------------------------- - -bool ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - - ImGuiTabBar* tab_bar = g.CurrentTabBar; - if (tab_bar == NULL) - { - IM_ASSERT_USER_ERROR(tab_bar, "Needs to be called between BeginTabBar() and EndTabBar()!"); - return false; - } - IM_ASSERT(!(flags & ImGuiTabItemFlags_Button)); // BeginTabItem() Can't be used with button flags, use TabItemButton() instead! - - bool ret = TabItemEx(tab_bar, label, p_open, flags); - if (ret && !(flags & ImGuiTabItemFlags_NoPushId)) - { - ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx]; - PushOverrideID(tab->ID); // We already hashed 'label' so push into the ID stack directly instead of doing another hash through PushID(label) - } - return ret; -} - -void ImGui::EndTabItem() -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - ImGuiTabBar* tab_bar = g.CurrentTabBar; - if (tab_bar == NULL) - { - IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!"); - return; - } - IM_ASSERT(tab_bar->LastTabItemIdx >= 0); - ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx]; - if (!(tab->Flags & ImGuiTabItemFlags_NoPushId)) - PopID(); -} - -bool ImGui::TabItemButton(const char* label, ImGuiTabItemFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - - ImGuiTabBar* tab_bar = g.CurrentTabBar; - if (tab_bar == NULL) - { - IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!"); - return false; - } - return TabItemEx(tab_bar, label, NULL, flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder); -} - -bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags) -{ - // Layout whole tab bar if not already done - ImGuiContext& g = *GImGui; - if (tab_bar->WantLayout) - { - ImGuiNextItemData backup_next_item_data = g.NextItemData; - TabBarLayout(tab_bar); - g.NextItemData = backup_next_item_data; - } - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return false; - - const ImGuiStyle& style = g.Style; - const ImGuiID id = TabBarCalcTabID(tab_bar, label); - - // If the user called us with *p_open == false, we early out and don't render. - // We make a call to ItemAdd() so that attempts to use a contextual popup menu with an implicit ID won't use an older ID. - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); - if (p_open && !*p_open) - { - ItemAdd(ImRect(), id, NULL, ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus); - return false; - } - - IM_ASSERT(!p_open || !(flags & ImGuiTabItemFlags_Button)); - IM_ASSERT((flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)) != (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)); // Can't use both Leading and Trailing - - // Store into ImGuiTabItemFlags_NoCloseButton, also honor ImGuiTabItemFlags_NoCloseButton passed by user (although not documented) - if (flags & ImGuiTabItemFlags_NoCloseButton) - p_open = NULL; - else if (p_open == NULL) - flags |= ImGuiTabItemFlags_NoCloseButton; - - // Acquire tab data - ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, id); - bool tab_is_new = false; - if (tab == NULL) - { - tab_bar->Tabs.push_back(ImGuiTabItem()); - tab = &tab_bar->Tabs.back(); - tab->ID = id; - tab_bar->TabsAddedNew = tab_is_new = true; - } - tab_bar->LastTabItemIdx = (ImS16)tab_bar->Tabs.index_from_ptr(tab); - - // Calculate tab contents size - ImVec2 size = TabItemCalcSize(label, p_open != NULL); - tab->RequestedWidth = -1.0f; - if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth) - size.x = tab->RequestedWidth = g.NextItemData.Width; - if (tab_is_new) - tab->Width = size.x; - tab->ContentWidth = size.x; - tab->BeginOrder = tab_bar->TabsActiveCount++; - - const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); - const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0; - const bool tab_appearing = (tab->LastFrameVisible + 1 < g.FrameCount); - const bool is_tab_button = (flags & ImGuiTabItemFlags_Button) != 0; - tab->LastFrameVisible = g.FrameCount; - tab->Flags = flags; - - // Append name with zero-terminator - tab->NameOffset = (ImS32)tab_bar->TabsNames.size(); - tab_bar->TabsNames.append(label, label + strlen(label) + 1); - - // Update selected tab - if (!is_tab_button) - { - if (tab_appearing && (tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs) && tab_bar->NextSelectedTabId == 0) - if (!tab_bar_appearing || tab_bar->SelectedTabId == 0) - tab_bar->NextSelectedTabId = id; // New tabs gets activated - if ((flags & ImGuiTabItemFlags_SetSelected) && (tab_bar->SelectedTabId != id)) // _SetSelected can only be passed on explicit tab bar - tab_bar->NextSelectedTabId = id; - } - - // Lock visibility - // (Note: tab_contents_visible != tab_selected... because CTRL+TAB operations may preview some tabs without selecting them!) - bool tab_contents_visible = (tab_bar->VisibleTabId == id); - if (tab_contents_visible) - tab_bar->VisibleTabWasSubmitted = true; - - // On the very first frame of a tab bar we let first tab contents be visible to minimize appearing glitches - if (!tab_contents_visible && tab_bar->SelectedTabId == 0 && tab_bar_appearing) - if (tab_bar->Tabs.Size == 1 && !(tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs)) - tab_contents_visible = true; - - // Note that tab_is_new is not necessarily the same as tab_appearing! When a tab bar stops being submitted - // and then gets submitted again, the tabs will have 'tab_appearing=true' but 'tab_is_new=false'. - if (tab_appearing && (!tab_bar_appearing || tab_is_new)) - { - ItemAdd(ImRect(), id, NULL, ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus); - if (is_tab_button) - return false; - return tab_contents_visible; - } - - if (tab_bar->SelectedTabId == id) - tab->LastFrameSelected = g.FrameCount; - - // Backup current layout position - const ImVec2 backup_main_cursor_pos = window->DC.CursorPos; - - // Layout - const bool is_central_section = (tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0; - size.x = tab->Width; - if (is_central_section) - window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_FLOOR(tab->Offset - tab_bar->ScrollingAnim), 0.0f); - else - window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(tab->Offset, 0.0f); - ImVec2 pos = window->DC.CursorPos; - ImRect bb(pos, pos + size); - - // We don't have CPU clipping primitives to clip the CloseButton (until it becomes a texture), so need to add an extra draw call (temporary in the case of vertical animation) - const bool want_clip_rect = is_central_section && (bb.Min.x < tab_bar->ScrollingRectMinX || bb.Max.x > tab_bar->ScrollingRectMaxX); - if (want_clip_rect) - PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->ScrollingRectMinX), bb.Min.y - 1), ImVec2(tab_bar->ScrollingRectMaxX, bb.Max.y), true); - - ImVec2 backup_cursor_max_pos = window->DC.CursorMaxPos; - ItemSize(bb.GetSize(), style.FramePadding.y); - window->DC.CursorMaxPos = backup_cursor_max_pos; - - if (!ItemAdd(bb, id)) - { - if (want_clip_rect) - PopClipRect(); - window->DC.CursorPos = backup_main_cursor_pos; - return tab_contents_visible; - } - - // Click to Select a tab - ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowItemOverlap); - if (g.DragDropActive) - button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; - bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); - if (pressed && !is_tab_button) - tab_bar->NextSelectedTabId = id; - - // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered) - if (g.ActiveId != id) - SetItemAllowOverlap(); - - // Drag and drop: re-order tabs - if (held && !tab_appearing && IsMouseDragging(0)) - { - if (!g.DragDropActive && (tab_bar->Flags & ImGuiTabBarFlags_Reorderable)) - { - // While moving a tab it will jump on the other side of the mouse, so we also test for MouseDelta.x - if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < bb.Min.x) - { - TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); - } - else if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > bb.Max.x) - { - TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); - } - } - } - -#if 0 - if (hovered && g.HoveredIdNotActiveTimer > TOOLTIP_DELAY && bb.GetWidth() < tab->ContentWidth) - { - // Enlarge tab display when hovering - bb.Max.x = bb.Min.x + IM_FLOOR(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f))); - display_draw_list = GetForegroundDrawList(window); - TabItemBackground(display_draw_list, bb, flags, GetColorU32(ImGuiCol_TitleBgActive)); - } -#endif - - // Render tab shape - ImDrawList* display_draw_list = window->DrawList; - const ImU32 tab_col = GetColorU32((held || hovered) ? ImGuiCol_TabHovered : tab_contents_visible ? (tab_bar_focused ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive) : (tab_bar_focused ? ImGuiCol_Tab : ImGuiCol_TabUnfocused)); - TabItemBackground(display_draw_list, bb, flags, tab_col); - RenderNavHighlight(bb, id); - - // Select with right mouse button. This is so the common idiom for context menu automatically highlight the current widget. - const bool hovered_unblocked = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup); - if (hovered_unblocked && (IsMouseClicked(1) || IsMouseReleased(1))) - if (!is_tab_button) - tab_bar->NextSelectedTabId = id; - - if (tab_bar->Flags & ImGuiTabBarFlags_NoCloseWithMiddleMouseButton) - flags |= ImGuiTabItemFlags_NoCloseWithMiddleMouseButton; - - // Render tab label, process close button - const ImGuiID close_button_id = p_open ? GetIDWithSeed("#CLOSE", NULL, id) : 0; - bool just_closed; - bool text_clipped; - TabItemLabelAndCloseButton(display_draw_list, bb, flags, tab_bar->FramePadding, label, id, close_button_id, tab_contents_visible, &just_closed, &text_clipped); - if (just_closed && p_open != NULL) - { - *p_open = false; - TabBarCloseTab(tab_bar, tab); - } - - // Restore main window position so user can draw there - if (want_clip_rect) - PopClipRect(); - window->DC.CursorPos = backup_main_cursor_pos; - - // Tooltip - // (Won't work over the close button because ItemOverlap systems messes up with HoveredIdTimer-> seems ok) - // (We test IsItemHovered() to discard e.g. when another item is active or drag and drop over the tab bar, which g.HoveredId ignores) - // FIXME: This is a mess. - // FIXME: We may want disabled tab to still display the tooltip? - if (text_clipped && g.HoveredId == id && !held && g.HoveredIdNotActiveTimer > g.TooltipSlowDelay && IsItemHovered()) - if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip) && !(tab->Flags & ImGuiTabItemFlags_NoTooltip)) - SetTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label); - - IM_ASSERT(!is_tab_button || !(tab_bar->SelectedTabId == tab->ID && is_tab_button)); // TabItemButton should not be selected - if (is_tab_button) - return pressed; - return tab_contents_visible; -} - -// [Public] This is call is 100% optional but it allows to remove some one-frame glitches when a tab has been unexpectedly removed. -// To use it to need to call the function SetTabItemClosed() between BeginTabBar() and EndTabBar(). -// Tabs closed by the close button will automatically be flagged to avoid this issue. -void ImGui::SetTabItemClosed(const char* label) -{ - ImGuiContext& g = *GImGui; - bool is_within_manual_tab_bar = g.CurrentTabBar && !(g.CurrentTabBar->Flags & ImGuiTabBarFlags_DockNode); - if (is_within_manual_tab_bar) - { - ImGuiTabBar* tab_bar = g.CurrentTabBar; - ImGuiID tab_id = TabBarCalcTabID(tab_bar, label); - if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id)) - tab->WantClose = true; // Will be processed by next call to TabBarLayout() - } -} - -ImVec2 ImGui::TabItemCalcSize(const char* label, bool has_close_button) -{ - ImGuiContext& g = *GImGui; - ImVec2 label_size = CalcTextSize(label, NULL, true); - ImVec2 size = ImVec2(label_size.x + g.Style.FramePadding.x, label_size.y + g.Style.FramePadding.y * 2.0f); - if (has_close_button) - size.x += g.Style.FramePadding.x + (g.Style.ItemInnerSpacing.x + g.FontSize); // We use Y intentionally to fit the close button circle. - else - size.x += g.Style.FramePadding.x + 1.0f; - return ImVec2(ImMin(size.x, TabBarCalcMaxTabWidth()), size.y); -} - -void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col) -{ - // While rendering tabs, we trim 1 pixel off the top of our bounding box so they can fit within a regular frame height while looking "detached" from it. - ImGuiContext& g = *GImGui; - const float width = bb.GetWidth(); - IM_UNUSED(flags); - IM_ASSERT(width > 0.0f); - const float rounding = ImMax(0.0f, ImMin((flags & ImGuiTabItemFlags_Button) ? g.Style.FrameRounding : g.Style.TabRounding, width * 0.5f - 1.0f)); - const float y1 = bb.Min.y + 1.0f; - const float y2 = bb.Max.y - 1.0f; - draw_list->PathLineTo(ImVec2(bb.Min.x, y2)); - draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding, y1 + rounding), rounding, 6, 9); - draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding, y1 + rounding), rounding, 9, 12); - draw_list->PathLineTo(ImVec2(bb.Max.x, y2)); - draw_list->PathFillConvex(col); - if (g.Style.TabBorderSize > 0.0f) - { - draw_list->PathLineTo(ImVec2(bb.Min.x + 0.5f, y2)); - draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding + 0.5f, y1 + rounding + 0.5f), rounding, 6, 9); - draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding - 0.5f, y1 + rounding + 0.5f), rounding, 9, 12); - draw_list->PathLineTo(ImVec2(bb.Max.x - 0.5f, y2)); - draw_list->PathStroke(GetColorU32(ImGuiCol_Border), 0, g.Style.TabBorderSize); - } -} - -// Render text label (with custom clipping) + Unsaved Document marker + Close Button logic -// We tend to lock style.FramePadding for a given tab-bar, hence the 'frame_padding' parameter. -void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped) -{ - ImGuiContext& g = *GImGui; - ImVec2 label_size = CalcTextSize(label, NULL, true); - - if (out_just_closed) - *out_just_closed = false; - if (out_text_clipped) - *out_text_clipped = false; - - if (bb.GetWidth() <= 1.0f) - return; - - // In Style V2 we'll have full override of all colors per state (e.g. focused, selected) - // But right now if you want to alter text color of tabs this is what you need to do. -#if 0 - const float backup_alpha = g.Style.Alpha; - if (!is_contents_visible) - g.Style.Alpha *= 0.7f; -#endif - - // Render text label (with clipping + alpha gradient) + unsaved marker - ImRect text_pixel_clip_bb(bb.Min.x + frame_padding.x, bb.Min.y + frame_padding.y, bb.Max.x - frame_padding.x, bb.Max.y); - ImRect text_ellipsis_clip_bb = text_pixel_clip_bb; - - // Return clipped state ignoring the close button - if (out_text_clipped) - { - *out_text_clipped = (text_ellipsis_clip_bb.Min.x + label_size.x) > text_pixel_clip_bb.Max.x; - //draw_list->AddCircle(text_ellipsis_clip_bb.Min, 3.0f, *out_text_clipped ? IM_COL32(255, 0, 0, 255) : IM_COL32(0, 255, 0, 255)); - } - - const float button_sz = g.FontSize; - const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x * 2.0f - button_sz), bb.Min.y); - - // Close Button & Unsaved Marker - // We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap() - // 'hovered' will be true when hovering the Tab but NOT when hovering the close button - // 'g.HoveredId==id' will be true when hovering the Tab including when hovering the close button - // 'g.ActiveId==close_button_id' will be true when we are holding on the close button, in which case both hovered booleans are false - bool close_button_pressed = false; - bool close_button_visible = false; - if (close_button_id != 0) - if (is_contents_visible || bb.GetWidth() >= ImMax(button_sz, g.Style.TabMinWidthForCloseButton)) - if (g.HoveredId == tab_id || g.HoveredId == close_button_id || g.ActiveId == tab_id || g.ActiveId == close_button_id) - close_button_visible = true; - bool unsaved_marker_visible = (flags & ImGuiTabItemFlags_UnsavedDocument) != 0 && (button_pos.x + button_sz <= bb.Max.x); - - if (close_button_visible) - { - ImGuiLastItemData last_item_backup = g.LastItemData; - PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding); - if (CloseButton(close_button_id, button_pos)) - close_button_pressed = true; - PopStyleVar(); - g.LastItemData = last_item_backup; - - // Close with middle mouse button - if (!(flags & ImGuiTabItemFlags_NoCloseWithMiddleMouseButton) && IsMouseClicked(2)) - close_button_pressed = true; - } - else if (unsaved_marker_visible) - { - const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz) + g.Style.FramePadding * 2.0f); - RenderBullet(draw_list, bullet_bb.GetCenter(), GetColorU32(ImGuiCol_Text)); - } - - // This is all rather complicated - // (the main idea is that because the close button only appears on hover, we don't want it to alter the ellipsis position) - // FIXME: if FramePadding is noticeably large, ellipsis_max_x will be wrong here (e.g. #3497), maybe for consistency that parameter of RenderTextEllipsis() shouldn't exist.. - float ellipsis_max_x = close_button_visible ? text_pixel_clip_bb.Max.x : bb.Max.x - 1.0f; - if (close_button_visible || unsaved_marker_visible) - { - text_pixel_clip_bb.Max.x -= close_button_visible ? (button_sz) : (button_sz * 0.80f); - text_ellipsis_clip_bb.Max.x -= unsaved_marker_visible ? (button_sz * 0.80f) : 0.0f; - ellipsis_max_x = text_pixel_clip_bb.Max.x; - } - RenderTextEllipsis(draw_list, text_ellipsis_clip_bb.Min, text_ellipsis_clip_bb.Max, text_pixel_clip_bb.Max.x, ellipsis_max_x, label, NULL, &label_size); - -#if 0 - if (!is_contents_visible) - g.Style.Alpha = backup_alpha; -#endif - - if (out_just_closed) - *out_just_closed = close_button_pressed; -} - - -#endif // #ifndef IMGUI_DISABLE diff --git a/dependencies/reboot/vendor/ImGui/imstb_rectpack.h b/dependencies/reboot/vendor/ImGui/imstb_rectpack.h deleted file mode 100644 index f6917e7..0000000 --- a/dependencies/reboot/vendor/ImGui/imstb_rectpack.h +++ /dev/null @@ -1,627 +0,0 @@ -// [DEAR IMGUI] -// This is a slightly modified version of stb_rect_pack.h 1.01. -// Grep for [DEAR IMGUI] to find the changes. -// -// stb_rect_pack.h - v1.01 - public domain - rectangle packing -// Sean Barrett 2014 -// -// Useful for e.g. packing rectangular textures into an atlas. -// Does not do rotation. -// -// Before #including, -// -// #define STB_RECT_PACK_IMPLEMENTATION -// -// in the file that you want to have the implementation. -// -// 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 -// github:IntellectualKitty -// -// Bugfixes / warning fixes -// Jeremy Jaussaud -// Fabian Giesen -// -// Version history: -// -// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section -// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles -// 0.99 (2019-02-07) warning fixes -// 0.11 (2017-03-03) return packing success/fail result -// 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 -// -// See end of file for license information. - -////////////////////////////////////////////////////////////////////////////// -// -// 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; - -typedef int stbrp_coord; - -#define STBRP__MAXVAL 0x7fffffff -// Mostly for internal use, but this is the maximum supported coordinate value. - -STBRP_DEF int 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. -// -// The function returns 1 if all of the rectangles were successfully -// packed and 0 otherwise. - -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 -#define STBRP_SORT qsort -#endif - -#ifndef STBRP_ASSERT -#include -#define STBRP_ASSERT assert -#endif - -#ifdef _MSC_VER -#define STBRP__NOTUSED(v) (void)(v) -#define STBRP__CDECL __cdecl -#else -#define STBRP__NOTUSED(v) (void)sizeof(v) -#define STBRP__CDECL -#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; - - 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; - context->extra[1].y = (1<<30); - 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); - - // if it can't possibly fit, bail immediately - if (width > c->width || height > c->height) { - fr.prev_link = NULL; - fr.x = fr.y = 0; - return fr; - } - - 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); [DEAR IMGUI] - 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); - - { - int count=0; - cur = context->active_head; - while (cur) { - cur = cur->next; - ++count; - } - cur = context->free_head; - while (cur) { - cur = cur->next; - ++count; - } - STBRP_ASSERT(count == context->num_nodes+2); - } -#endif - - return res; -} - -static int STBRP__CDECL 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 STBRP__CDECL 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); -} - -STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) -{ - int i, all_rects_packed = 1; - - // we use the 'was_packed' field internally to allow sorting/unsorting - for (i=0; i < num_rects; ++i) { - rects[i].was_packed = i; - } - - // 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 and all_rects_packed status - for (i=0; i < num_rects; ++i) { - rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); - if (!rects[i].was_packed) - all_rects_packed = 0; - } - - // return the all_rects_packed status - return all_rects_packed; -} -#endif - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -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. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -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 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. ------------------------------------------------------------------------------- -*/ diff --git a/dependencies/reboot/vendor/ImGui/imstb_textedit.h b/dependencies/reboot/vendor/ImGui/imstb_textedit.h deleted file mode 100644 index 75a159d..0000000 --- a/dependencies/reboot/vendor/ImGui/imstb_textedit.h +++ /dev/null @@ -1,1447 +0,0 @@ -// [DEAR IMGUI] -// This is a slightly modified version of stb_textedit.h 1.14. -// Those changes would need to be pushed into nothings/stb: -// - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321) -// Grep for [DEAR IMGUI] to find the changes. - -// stb_textedit.h - v1.14 - public domain - Sean Barrett -// Development of this library was sponsored by RAD Game Tools -// -// This C header file implements the guts of a multi-line text-editing -// widget; you implement display, word-wrapping, and low-level string -// insertion/deletion, and stb_textedit will map user inputs into -// insertions & deletions, plus updates to the cursor position, -// selection state, and undo state. -// -// It is intended for use in games and other systems that need to build -// their own custom widgets and which do not have heavy text-editing -// requirements (this library is not recommended for use for editing large -// texts, as its performance does not scale and it has limited undo). -// -// Non-trivial behaviors are modelled after Windows text controls. -// -// -// LICENSE -// -// See end of file for license information. -// -// -// DEPENDENCIES -// -// Uses the C runtime function 'memmove', which you can override -// by defining STB_TEXTEDIT_memmove before the implementation. -// Uses no other functions. Performs no runtime allocations. -// -// -// VERSION HISTORY -// -// 1.14 (2021-07-11) page up/down, various fixes -// 1.13 (2019-02-07) fix bug in undo size management -// 1.12 (2018-01-29) user can change STB_TEXTEDIT_KEYTYPE, fix redo to avoid crash -// 1.11 (2017-03-03) fix HOME on last line, dragging off single-line textfield -// 1.10 (2016-10-25) supress warnings about casting away const with -Wcast-qual -// 1.9 (2016-08-27) customizable move-by-word -// 1.8 (2016-04-02) better keyboard handling when mouse button is down -// 1.7 (2015-09-13) change y range handling in case baseline is non-0 -// 1.6 (2015-04-15) allow STB_TEXTEDIT_memmove -// 1.5 (2014-09-10) add support for secondary keys for OS X -// 1.4 (2014-08-17) fix signed/unsigned warnings -// 1.3 (2014-06-19) fix mouse clicking to round to nearest char boundary -// 1.2 (2014-05-27) fix some RAD types that had crept into the new code -// 1.1 (2013-12-15) move-by-word (requires STB_TEXTEDIT_IS_SPACE ) -// 1.0 (2012-07-26) improve documentation, initial public release -// 0.3 (2012-02-24) bugfixes, single-line mode; insert mode -// 0.2 (2011-11-28) fixes to undo/redo -// 0.1 (2010-07-08) initial version -// -// ADDITIONAL CONTRIBUTORS -// -// Ulf Winklemann: move-by-word in 1.1 -// Fabian Giesen: secondary key inputs in 1.5 -// Martins Mozeiko: STB_TEXTEDIT_memmove in 1.6 -// Louis Schnellbach: page up/down in 1.14 -// -// Bugfixes: -// Scott Graham -// Daniel Keller -// Omar Cornut -// Dan Thompson -// -// USAGE -// -// This file behaves differently depending on what symbols you define -// before including it. -// -// -// Header-file mode: -// -// If you do not define STB_TEXTEDIT_IMPLEMENTATION before including this, -// it will operate in "header file" mode. In this mode, it declares a -// single public symbol, STB_TexteditState, which encapsulates the current -// state of a text widget (except for the string, which you will store -// separately). -// -// To compile in this mode, you must define STB_TEXTEDIT_CHARTYPE to a -// primitive type that defines a single character (e.g. char, wchar_t, etc). -// -// To save space or increase undo-ability, you can optionally define the -// following things that are used by the undo system: -// -// STB_TEXTEDIT_POSITIONTYPE small int type encoding a valid cursor position -// STB_TEXTEDIT_UNDOSTATECOUNT the number of undo states to allow -// STB_TEXTEDIT_UNDOCHARCOUNT the number of characters to store in the undo buffer -// -// If you don't define these, they are set to permissive types and -// moderate sizes. The undo system does no memory allocations, so -// it grows STB_TexteditState by the worst-case storage which is (in bytes): -// -// [4 + 3 * sizeof(STB_TEXTEDIT_POSITIONTYPE)] * STB_TEXTEDIT_UNDOSTATECOUNT -// + sizeof(STB_TEXTEDIT_CHARTYPE) * STB_TEXTEDIT_UNDOCHARCOUNT -// -// -// Implementation mode: -// -// If you define STB_TEXTEDIT_IMPLEMENTATION before including this, it -// will compile the implementation of the text edit widget, depending -// on a large number of symbols which must be defined before the include. -// -// The implementation is defined only as static functions. You will then -// need to provide your own APIs in the same file which will access the -// static functions. -// -// The basic concept is that you provide a "string" object which -// behaves like an array of characters. stb_textedit uses indices to -// refer to positions in the string, implicitly representing positions -// in the displayed textedit. This is true for both plain text and -// rich text; even with rich text stb_truetype interacts with your -// code as if there was an array of all the displayed characters. -// -// Symbols that must be the same in header-file and implementation mode: -// -// STB_TEXTEDIT_CHARTYPE the character type -// STB_TEXTEDIT_POSITIONTYPE small type that is a valid cursor position -// STB_TEXTEDIT_UNDOSTATECOUNT the number of undo states to allow -// STB_TEXTEDIT_UNDOCHARCOUNT the number of characters to store in the undo buffer -// -// Symbols you must define for implementation mode: -// -// STB_TEXTEDIT_STRING the type of object representing a string being edited, -// typically this is a wrapper object with other data you need -// -// STB_TEXTEDIT_STRINGLEN(obj) the length of the string (ideally O(1)) -// STB_TEXTEDIT_LAYOUTROW(&r,obj,n) returns the results of laying out a line of characters -// starting from character #n (see discussion below) -// STB_TEXTEDIT_GETWIDTH(obj,n,i) returns the pixel delta from the xpos of the i'th character -// to the xpos of the i+1'th char for a line of characters -// starting at character #n (i.e. accounts for kerning -// with previous char) -// STB_TEXTEDIT_KEYTOTEXT(k) maps a keyboard input to an insertable character -// (return type is int, -1 means not valid to insert) -// STB_TEXTEDIT_GETCHAR(obj,i) returns the i'th character of obj, 0-based -// STB_TEXTEDIT_NEWLINE the character returned by _GETCHAR() we recognize -// as manually wordwrapping for end-of-line positioning -// -// STB_TEXTEDIT_DELETECHARS(obj,i,n) delete n characters starting at i -// STB_TEXTEDIT_INSERTCHARS(obj,i,c*,n) insert n characters at i (pointed to by STB_TEXTEDIT_CHARTYPE*) -// -// STB_TEXTEDIT_K_SHIFT a power of two that is or'd in to a keyboard input to represent the shift key -// -// STB_TEXTEDIT_K_LEFT keyboard input to move cursor left -// STB_TEXTEDIT_K_RIGHT keyboard input to move cursor right -// STB_TEXTEDIT_K_UP keyboard input to move cursor up -// STB_TEXTEDIT_K_DOWN keyboard input to move cursor down -// STB_TEXTEDIT_K_PGUP keyboard input to move cursor up a page -// STB_TEXTEDIT_K_PGDOWN keyboard input to move cursor down a page -// STB_TEXTEDIT_K_LINESTART keyboard input to move cursor to start of line // e.g. HOME -// STB_TEXTEDIT_K_LINEEND keyboard input to move cursor to end of line // e.g. END -// STB_TEXTEDIT_K_TEXTSTART keyboard input to move cursor to start of text // e.g. ctrl-HOME -// STB_TEXTEDIT_K_TEXTEND keyboard input to move cursor to end of text // e.g. ctrl-END -// STB_TEXTEDIT_K_DELETE keyboard input to delete selection or character under cursor -// STB_TEXTEDIT_K_BACKSPACE keyboard input to delete selection or character left of cursor -// STB_TEXTEDIT_K_UNDO keyboard input to perform undo -// STB_TEXTEDIT_K_REDO keyboard input to perform redo -// -// Optional: -// STB_TEXTEDIT_K_INSERT keyboard input to toggle insert mode -// STB_TEXTEDIT_IS_SPACE(ch) true if character is whitespace (e.g. 'isspace'), -// required for default WORDLEFT/WORDRIGHT handlers -// STB_TEXTEDIT_MOVEWORDLEFT(obj,i) custom handler for WORDLEFT, returns index to move cursor to -// STB_TEXTEDIT_MOVEWORDRIGHT(obj,i) custom handler for WORDRIGHT, returns index to move cursor to -// STB_TEXTEDIT_K_WORDLEFT keyboard input to move cursor left one word // e.g. ctrl-LEFT -// STB_TEXTEDIT_K_WORDRIGHT keyboard input to move cursor right one word // e.g. ctrl-RIGHT -// STB_TEXTEDIT_K_LINESTART2 secondary keyboard input to move cursor to start of line -// STB_TEXTEDIT_K_LINEEND2 secondary keyboard input to move cursor to end of line -// STB_TEXTEDIT_K_TEXTSTART2 secondary keyboard input to move cursor to start of text -// STB_TEXTEDIT_K_TEXTEND2 secondary keyboard input to move cursor to end of text -// -// Keyboard input must be encoded as a single integer value; e.g. a character code -// and some bitflags that represent shift states. to simplify the interface, SHIFT must -// be a bitflag, so we can test the shifted state of cursor movements to allow selection, -// i.e. (STB_TEXTEDIT_K_RIGHT|STB_TEXTEDIT_K_SHIFT) should be shifted right-arrow. -// -// You can encode other things, such as CONTROL or ALT, in additional bits, and -// then test for their presence in e.g. STB_TEXTEDIT_K_WORDLEFT. For example, -// my Windows implementations add an additional CONTROL bit, and an additional KEYDOWN -// bit. Then all of the STB_TEXTEDIT_K_ values bitwise-or in the KEYDOWN bit, -// and I pass both WM_KEYDOWN and WM_CHAR events to the "key" function in the -// API below. The control keys will only match WM_KEYDOWN events because of the -// keydown bit I add, and STB_TEXTEDIT_KEYTOTEXT only tests for the KEYDOWN -// bit so it only decodes WM_CHAR events. -// -// STB_TEXTEDIT_LAYOUTROW returns information about the shape of one displayed -// row of characters assuming they start on the i'th character--the width and -// the height and the number of characters consumed. This allows this library -// to traverse the entire layout incrementally. You need to compute word-wrapping -// here. -// -// Each textfield keeps its own insert mode state, which is not how normal -// applications work. To keep an app-wide insert mode, update/copy the -// "insert_mode" field of STB_TexteditState before/after calling API functions. -// -// API -// -// void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line) -// -// void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) -// void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) -// int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -// int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) -// void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXEDIT_KEYTYPE key) -// -// Each of these functions potentially updates the string and updates the -// state. -// -// initialize_state: -// set the textedit state to a known good default state when initially -// constructing the textedit. -// -// click: -// call this with the mouse x,y on a mouse down; it will update the cursor -// and reset the selection start/end to the cursor point. the x,y must -// be relative to the text widget, with (0,0) being the top left. -// -// drag: -// call this with the mouse x,y on a mouse drag/up; it will update the -// cursor and the selection end point -// -// cut: -// call this to delete the current selection; returns true if there was -// one. you should FIRST copy the current selection to the system paste buffer. -// (To copy, just copy the current selection out of the string yourself.) -// -// paste: -// call this to paste text at the current cursor point or over the current -// selection if there is one. -// -// key: -// call this for keyboard inputs sent to the textfield. you can use it -// for "key down" events or for "translated" key events. if you need to -// do both (as in Win32), or distinguish Unicode characters from control -// inputs, set a high bit to distinguish the two; then you can define the -// various definitions like STB_TEXTEDIT_K_LEFT have the is-key-event bit -// set, and make STB_TEXTEDIT_KEYTOCHAR check that the is-key-event bit is -// clear. STB_TEXTEDIT_KEYTYPE defaults to int, but you can #define it to -// anything other type you wante before including. -// -// -// When rendering, you can read the cursor position and selection state from -// the STB_TexteditState. -// -// -// Notes: -// -// This is designed to be usable in IMGUI, so it allows for the possibility of -// running in an IMGUI that has NOT cached the multi-line layout. For this -// reason, it provides an interface that is compatible with computing the -// layout incrementally--we try to make sure we make as few passes through -// as possible. (For example, to locate the mouse pointer in the text, we -// could define functions that return the X and Y positions of characters -// and binary search Y and then X, but if we're doing dynamic layout this -// will run the layout algorithm many times, so instead we manually search -// forward in one pass. Similar logic applies to e.g. up-arrow and -// down-arrow movement.) -// -// If it's run in a widget that *has* cached the layout, then this is less -// efficient, but it's not horrible on modern computers. But you wouldn't -// want to edit million-line files with it. - - -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -//// -//// Header-file mode -//// -//// - -#ifndef INCLUDE_STB_TEXTEDIT_H -#define INCLUDE_STB_TEXTEDIT_H - -//////////////////////////////////////////////////////////////////////// -// -// STB_TexteditState -// -// Definition of STB_TexteditState which you should store -// per-textfield; it includes cursor position, selection state, -// and undo state. -// - -#ifndef STB_TEXTEDIT_UNDOSTATECOUNT -#define STB_TEXTEDIT_UNDOSTATECOUNT 99 -#endif -#ifndef STB_TEXTEDIT_UNDOCHARCOUNT -#define STB_TEXTEDIT_UNDOCHARCOUNT 999 -#endif -#ifndef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_CHARTYPE int -#endif -#ifndef STB_TEXTEDIT_POSITIONTYPE -#define STB_TEXTEDIT_POSITIONTYPE int -#endif - -typedef struct -{ - // private data - STB_TEXTEDIT_POSITIONTYPE where; - STB_TEXTEDIT_POSITIONTYPE insert_length; - STB_TEXTEDIT_POSITIONTYPE delete_length; - int char_storage; -} StbUndoRecord; - -typedef struct -{ - // private data - StbUndoRecord undo_rec [STB_TEXTEDIT_UNDOSTATECOUNT]; - STB_TEXTEDIT_CHARTYPE undo_char[STB_TEXTEDIT_UNDOCHARCOUNT]; - short undo_point, redo_point; - int undo_char_point, redo_char_point; -} StbUndoState; - -typedef struct -{ - ///////////////////// - // - // public data - // - - int cursor; - // position of the text cursor within the string - - int select_start; // selection start point - int select_end; - // selection start and end point in characters; if equal, no selection. - // note that start may be less than or greater than end (e.g. when - // dragging the mouse, start is where the initial click was, and you - // can drag in either direction) - - unsigned char insert_mode; - // each textfield keeps its own insert mode state. to keep an app-wide - // insert mode, copy this value in/out of the app state - - int row_count_per_page; - // page size in number of row. - // this value MUST be set to >0 for pageup or pagedown in multilines documents. - - ///////////////////// - // - // private data - // - unsigned char cursor_at_end_of_line; // not implemented yet - unsigned char initialized; - unsigned char has_preferred_x; - unsigned char single_line; - unsigned char padding1, padding2, padding3; - float preferred_x; // this determines where the cursor up/down tries to seek to along x - StbUndoState undostate; -} STB_TexteditState; - - -//////////////////////////////////////////////////////////////////////// -// -// StbTexteditRow -// -// Result of layout query, used by stb_textedit to determine where -// the text in each row is. - -// result of layout query -typedef struct -{ - float x0,x1; // starting x location, end x location (allows for align=right, etc) - float baseline_y_delta; // position of baseline relative to previous row's baseline - float ymin,ymax; // height of row above and below baseline - int num_chars; -} StbTexteditRow; -#endif //INCLUDE_STB_TEXTEDIT_H - - -//////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -//// -//// Implementation mode -//// -//// - - -// implementation isn't include-guarded, since it might have indirectly -// included just the "header" portion -#ifdef STB_TEXTEDIT_IMPLEMENTATION - -#ifndef STB_TEXTEDIT_memmove -#include -#define STB_TEXTEDIT_memmove memmove -#endif - - -///////////////////////////////////////////////////////////////////////////// -// -// Mouse input handling -// - -// traverse the layout to locate the nearest character to a display position -static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) -{ - StbTexteditRow r; - int n = STB_TEXTEDIT_STRINGLEN(str); - float base_y = 0, prev_x; - int i=0, k; - - r.x0 = r.x1 = 0; - r.ymin = r.ymax = 0; - r.num_chars = 0; - - // search rows to find one that straddles 'y' - while (i < n) { - STB_TEXTEDIT_LAYOUTROW(&r, str, i); - if (r.num_chars <= 0) - return n; - - if (i==0 && y < base_y + r.ymin) - return 0; - - if (y < base_y + r.ymax) - break; - - i += r.num_chars; - base_y += r.baseline_y_delta; - } - - // below all text, return 'after' last character - if (i >= n) - return n; - - // check if it's before the beginning of the line - if (x < r.x0) - return i; - - // check if it's before the end of the line - if (x < r.x1) { - // search characters in row for one that straddles 'x' - prev_x = r.x0; - for (k=0; k < r.num_chars; ++k) { - float w = STB_TEXTEDIT_GETWIDTH(str, i, k); - if (x < prev_x+w) { - if (x < prev_x+w/2) - return k+i; - else - return k+i+1; - } - prev_x += w; - } - // shouldn't happen, but if it does, fall through to end-of-line case - } - - // if the last character is a newline, return that. otherwise return 'after' the last character - if (STB_TEXTEDIT_GETCHAR(str, i+r.num_chars-1) == STB_TEXTEDIT_NEWLINE) - return i+r.num_chars-1; - else - return i+r.num_chars; -} - -// API click: on mouse down, move the cursor to the clicked location, and reset the selection -static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) -{ - // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse - // goes off the top or bottom of the text - if( state->single_line ) - { - StbTexteditRow r; - STB_TEXTEDIT_LAYOUTROW(&r, str, 0); - y = r.ymin; - } - - state->cursor = stb_text_locate_coord(str, x, y); - state->select_start = state->cursor; - state->select_end = state->cursor; - state->has_preferred_x = 0; -} - -// API drag: on mouse drag, move the cursor and selection endpoint to the clicked location -static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) -{ - int p = 0; - - // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse - // goes off the top or bottom of the text - if( state->single_line ) - { - StbTexteditRow r; - STB_TEXTEDIT_LAYOUTROW(&r, str, 0); - y = r.ymin; - } - - if (state->select_start == state->select_end) - state->select_start = state->cursor; - - p = stb_text_locate_coord(str, x, y); - state->cursor = state->select_end = p; -} - -///////////////////////////////////////////////////////////////////////////// -// -// Keyboard input handling -// - -// forward declarations -static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); -static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); -static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length); -static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length); -static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length); - -typedef struct -{ - float x,y; // position of n'th character - float height; // height of line - int first_char, length; // first char of row, and length - int prev_first; // first char of previous row -} StbFindState; - -// find the x/y location of a character, and remember info about the previous row in -// case we get a move-up event (for page up, we'll have to rescan) -static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *str, int n, int single_line) -{ - StbTexteditRow r; - int prev_start = 0; - int z = STB_TEXTEDIT_STRINGLEN(str); - int i=0, first; - - if (n == z) { - // if it's at the end, then find the last line -- simpler than trying to - // explicitly handle this case in the regular code - if (single_line) { - STB_TEXTEDIT_LAYOUTROW(&r, str, 0); - find->y = 0; - find->first_char = 0; - find->length = z; - find->height = r.ymax - r.ymin; - find->x = r.x1; - } else { - find->y = 0; - find->x = 0; - find->height = 1; - while (i < z) { - STB_TEXTEDIT_LAYOUTROW(&r, str, i); - prev_start = i; - i += r.num_chars; - } - find->first_char = i; - find->length = 0; - find->prev_first = prev_start; - } - return; - } - - // search rows to find the one that straddles character n - find->y = 0; - - for(;;) { - STB_TEXTEDIT_LAYOUTROW(&r, str, i); - if (n < i + r.num_chars) - break; - prev_start = i; - i += r.num_chars; - find->y += r.baseline_y_delta; - } - - find->first_char = first = i; - find->length = r.num_chars; - find->height = r.ymax - r.ymin; - find->prev_first = prev_start; - - // now scan to find xpos - find->x = r.x0; - for (i=0; first+i < n; ++i) - find->x += STB_TEXTEDIT_GETWIDTH(str, first, i); -} - -#define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end) - -// make the selection/cursor state valid if client altered the string -static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - int n = STB_TEXTEDIT_STRINGLEN(str); - if (STB_TEXT_HAS_SELECTION(state)) { - if (state->select_start > n) state->select_start = n; - if (state->select_end > n) state->select_end = n; - // if clamping forced them to be equal, move the cursor to match - if (state->select_start == state->select_end) - state->cursor = state->select_start; - } - if (state->cursor > n) state->cursor = n; -} - -// delete characters while updating undo -static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len) -{ - stb_text_makeundo_delete(str, state, where, len); - STB_TEXTEDIT_DELETECHARS(str, where, len); - state->has_preferred_x = 0; -} - -// delete the section -static void stb_textedit_delete_selection(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - stb_textedit_clamp(str, state); - if (STB_TEXT_HAS_SELECTION(state)) { - if (state->select_start < state->select_end) { - stb_textedit_delete(str, state, state->select_start, state->select_end - state->select_start); - state->select_end = state->cursor = state->select_start; - } else { - stb_textedit_delete(str, state, state->select_end, state->select_start - state->select_end); - state->select_start = state->cursor = state->select_end; - } - state->has_preferred_x = 0; - } -} - -// canoncialize the selection so start <= end -static void stb_textedit_sortselection(STB_TexteditState *state) -{ - if (state->select_end < state->select_start) { - int temp = state->select_end; - state->select_end = state->select_start; - state->select_start = temp; - } -} - -// move cursor to first character of selection -static void stb_textedit_move_to_first(STB_TexteditState *state) -{ - if (STB_TEXT_HAS_SELECTION(state)) { - stb_textedit_sortselection(state); - state->cursor = state->select_start; - state->select_end = state->select_start; - state->has_preferred_x = 0; - } -} - -// move cursor to last character of selection -static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - if (STB_TEXT_HAS_SELECTION(state)) { - stb_textedit_sortselection(state); - stb_textedit_clamp(str, state); - state->cursor = state->select_end; - state->select_start = state->select_end; - state->has_preferred_x = 0; - } -} - -#ifdef STB_TEXTEDIT_IS_SPACE -static int is_word_boundary( STB_TEXTEDIT_STRING *str, int idx ) -{ - return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1; -} - -#ifndef STB_TEXTEDIT_MOVEWORDLEFT -static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) -{ - --c; // always move at least one character - while( c >= 0 && !is_word_boundary( str, c ) ) - --c; - - if( c < 0 ) - c = 0; - - return c; -} -#define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous -#endif - -#ifndef STB_TEXTEDIT_MOVEWORDRIGHT -static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c ) -{ - const int len = STB_TEXTEDIT_STRINGLEN(str); - ++c; // always move at least one character - while( c < len && !is_word_boundary( str, c ) ) - ++c; - - if( c > len ) - c = len; - - return c; -} -#define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next -#endif - -#endif - -// update selection and cursor to match each other -static void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state) -{ - if (!STB_TEXT_HAS_SELECTION(state)) - state->select_start = state->select_end = state->cursor; - else - state->cursor = state->select_end; -} - -// API cut: delete selection -static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - if (STB_TEXT_HAS_SELECTION(state)) { - stb_textedit_delete_selection(str,state); // implicitly clamps - state->has_preferred_x = 0; - return 1; - } - return 0; -} - -// API paste: replace existing selection with passed-in text -static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) -{ - // if there's a selection, the paste should delete it - stb_textedit_clamp(str, state); - stb_textedit_delete_selection(str,state); - // try to insert the characters - if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, text, len)) { - stb_text_makeundo_insert(state, state->cursor, len); - state->cursor += len; - state->has_preferred_x = 0; - return 1; - } - // note: paste failure will leave deleted selection, may be restored with an undo (see https://github.com/nothings/stb/issues/734 for details) - return 0; -} - -#ifndef STB_TEXTEDIT_KEYTYPE -#define STB_TEXTEDIT_KEYTYPE int -#endif - -// API key: process a keyboard input -static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key) -{ -retry: - switch (key) { - default: { - int c = STB_TEXTEDIT_KEYTOTEXT(key); - if (c > 0) { - STB_TEXTEDIT_CHARTYPE ch = (STB_TEXTEDIT_CHARTYPE) c; - - // can't add newline in single-line mode - if (c == '\n' && state->single_line) - break; - - if (state->insert_mode && !STB_TEXT_HAS_SELECTION(state) && state->cursor < STB_TEXTEDIT_STRINGLEN(str)) { - stb_text_makeundo_replace(str, state, state->cursor, 1, 1); - STB_TEXTEDIT_DELETECHARS(str, state->cursor, 1); - if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) { - ++state->cursor; - state->has_preferred_x = 0; - } - } else { - stb_textedit_delete_selection(str,state); // implicitly clamps - if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) { - stb_text_makeundo_insert(state, state->cursor, 1); - ++state->cursor; - state->has_preferred_x = 0; - } - } - } - break; - } - -#ifdef STB_TEXTEDIT_K_INSERT - case STB_TEXTEDIT_K_INSERT: - state->insert_mode = !state->insert_mode; - break; -#endif - - case STB_TEXTEDIT_K_UNDO: - stb_text_undo(str, state); - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_REDO: - stb_text_redo(str, state); - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_LEFT: - // if currently there's a selection, move cursor to start of selection - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_first(state); - else - if (state->cursor > 0) - --state->cursor; - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_RIGHT: - // if currently there's a selection, move cursor to end of selection - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_last(str, state); - else - ++state->cursor; - stb_textedit_clamp(str, state); - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_LEFT | STB_TEXTEDIT_K_SHIFT: - stb_textedit_clamp(str, state); - stb_textedit_prep_selection_at_cursor(state); - // move selection left - if (state->select_end > 0) - --state->select_end; - state->cursor = state->select_end; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_MOVEWORDLEFT - case STB_TEXTEDIT_K_WORDLEFT: - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_first(state); - else { - state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); - stb_textedit_clamp( str, state ); - } - break; - - case STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT: - if( !STB_TEXT_HAS_SELECTION( state ) ) - stb_textedit_prep_selection_at_cursor(state); - - state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); - state->select_end = state->cursor; - - stb_textedit_clamp( str, state ); - break; -#endif - -#ifdef STB_TEXTEDIT_MOVEWORDRIGHT - case STB_TEXTEDIT_K_WORDRIGHT: - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_last(str, state); - else { - state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); - stb_textedit_clamp( str, state ); - } - break; - - case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT: - if( !STB_TEXT_HAS_SELECTION( state ) ) - stb_textedit_prep_selection_at_cursor(state); - - state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); - state->select_end = state->cursor; - - stb_textedit_clamp( str, state ); - break; -#endif - - case STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT: - stb_textedit_prep_selection_at_cursor(state); - // move selection right - ++state->select_end; - stb_textedit_clamp(str, state); - state->cursor = state->select_end; - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_DOWN: - case STB_TEXTEDIT_K_DOWN | STB_TEXTEDIT_K_SHIFT: - case STB_TEXTEDIT_K_PGDOWN: - case STB_TEXTEDIT_K_PGDOWN | STB_TEXTEDIT_K_SHIFT: { - StbFindState find; - StbTexteditRow row; - int i, j, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; - int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGDOWN; - int row_count = is_page ? state->row_count_per_page : 1; - - if (!is_page && state->single_line) { - // on windows, up&down in single-line behave like left&right - key = STB_TEXTEDIT_K_RIGHT | (key & STB_TEXTEDIT_K_SHIFT); - goto retry; - } - - if (sel) - stb_textedit_prep_selection_at_cursor(state); - else if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_last(str, state); - - // compute current position of cursor point - stb_textedit_clamp(str, state); - stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); - - for (j = 0; j < row_count; ++j) { - float x, goal_x = state->has_preferred_x ? state->preferred_x : find.x; - int start = find.first_char + find.length; - - if (find.length == 0) - break; - - // [DEAR IMGUI] - // going down while being on the last line shouldn't bring us to that line end - if (STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE) - break; - - // now find character position down a row - state->cursor = start; - STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); - x = row.x0; - for (i=0; i < row.num_chars; ++i) { - float dx = STB_TEXTEDIT_GETWIDTH(str, start, i); - #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE - if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) - break; - #endif - x += dx; - if (x > goal_x) - break; - ++state->cursor; - } - stb_textedit_clamp(str, state); - - state->has_preferred_x = 1; - state->preferred_x = goal_x; - - if (sel) - state->select_end = state->cursor; - - // go to next line - find.first_char = find.first_char + find.length; - find.length = row.num_chars; - } - break; - } - - case STB_TEXTEDIT_K_UP: - case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: - case STB_TEXTEDIT_K_PGUP: - case STB_TEXTEDIT_K_PGUP | STB_TEXTEDIT_K_SHIFT: { - StbFindState find; - StbTexteditRow row; - int i, j, prev_scan, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; - int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGUP; - int row_count = is_page ? state->row_count_per_page : 1; - - if (!is_page && state->single_line) { - // on windows, up&down become left&right - key = STB_TEXTEDIT_K_LEFT | (key & STB_TEXTEDIT_K_SHIFT); - goto retry; - } - - if (sel) - stb_textedit_prep_selection_at_cursor(state); - else if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_move_to_first(state); - - // compute current position of cursor point - stb_textedit_clamp(str, state); - stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); - - for (j = 0; j < row_count; ++j) { - float x, goal_x = state->has_preferred_x ? state->preferred_x : find.x; - - // can only go up if there's a previous row - if (find.prev_first == find.first_char) - break; - - // now find character position up a row - state->cursor = find.prev_first; - STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); - x = row.x0; - for (i=0; i < row.num_chars; ++i) { - float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i); - #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE - if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) - break; - #endif - x += dx; - if (x > goal_x) - break; - ++state->cursor; - } - stb_textedit_clamp(str, state); - - state->has_preferred_x = 1; - state->preferred_x = goal_x; - - if (sel) - state->select_end = state->cursor; - - // go to previous line - // (we need to scan previous line the hard way. maybe we could expose this as a new API function?) - prev_scan = find.prev_first > 0 ? find.prev_first - 1 : 0; - while (prev_scan > 0 && STB_TEXTEDIT_GETCHAR(str, prev_scan - 1) != STB_TEXTEDIT_NEWLINE) - --prev_scan; - find.first_char = find.prev_first; - find.prev_first = prev_scan; - } - break; - } - - case STB_TEXTEDIT_K_DELETE: - case STB_TEXTEDIT_K_DELETE | STB_TEXTEDIT_K_SHIFT: - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_delete_selection(str, state); - else { - int n = STB_TEXTEDIT_STRINGLEN(str); - if (state->cursor < n) - stb_textedit_delete(str, state, state->cursor, 1); - } - state->has_preferred_x = 0; - break; - - case STB_TEXTEDIT_K_BACKSPACE: - case STB_TEXTEDIT_K_BACKSPACE | STB_TEXTEDIT_K_SHIFT: - if (STB_TEXT_HAS_SELECTION(state)) - stb_textedit_delete_selection(str, state); - else { - stb_textedit_clamp(str, state); - if (state->cursor > 0) { - stb_textedit_delete(str, state, state->cursor-1, 1); - --state->cursor; - } - } - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_TEXTSTART2 - case STB_TEXTEDIT_K_TEXTSTART2: -#endif - case STB_TEXTEDIT_K_TEXTSTART: - state->cursor = state->select_start = state->select_end = 0; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_TEXTEND2 - case STB_TEXTEDIT_K_TEXTEND2: -#endif - case STB_TEXTEDIT_K_TEXTEND: - state->cursor = STB_TEXTEDIT_STRINGLEN(str); - state->select_start = state->select_end = 0; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_TEXTSTART2 - case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT: -#endif - case STB_TEXTEDIT_K_TEXTSTART | STB_TEXTEDIT_K_SHIFT: - stb_textedit_prep_selection_at_cursor(state); - state->cursor = state->select_end = 0; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_TEXTEND2 - case STB_TEXTEDIT_K_TEXTEND2 | STB_TEXTEDIT_K_SHIFT: -#endif - case STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT: - stb_textedit_prep_selection_at_cursor(state); - state->cursor = state->select_end = STB_TEXTEDIT_STRINGLEN(str); - state->has_preferred_x = 0; - break; - - -#ifdef STB_TEXTEDIT_K_LINESTART2 - case STB_TEXTEDIT_K_LINESTART2: -#endif - case STB_TEXTEDIT_K_LINESTART: - stb_textedit_clamp(str, state); - stb_textedit_move_to_first(state); - if (state->single_line) - state->cursor = 0; - else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE) - --state->cursor; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_LINEEND2 - case STB_TEXTEDIT_K_LINEEND2: -#endif - case STB_TEXTEDIT_K_LINEEND: { - int n = STB_TEXTEDIT_STRINGLEN(str); - stb_textedit_clamp(str, state); - stb_textedit_move_to_first(state); - if (state->single_line) - state->cursor = n; - else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE) - ++state->cursor; - state->has_preferred_x = 0; - break; - } - -#ifdef STB_TEXTEDIT_K_LINESTART2 - case STB_TEXTEDIT_K_LINESTART2 | STB_TEXTEDIT_K_SHIFT: -#endif - case STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT: - stb_textedit_clamp(str, state); - stb_textedit_prep_selection_at_cursor(state); - if (state->single_line) - state->cursor = 0; - else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE) - --state->cursor; - state->select_end = state->cursor; - state->has_preferred_x = 0; - break; - -#ifdef STB_TEXTEDIT_K_LINEEND2 - case STB_TEXTEDIT_K_LINEEND2 | STB_TEXTEDIT_K_SHIFT: -#endif - case STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT: { - int n = STB_TEXTEDIT_STRINGLEN(str); - stb_textedit_clamp(str, state); - stb_textedit_prep_selection_at_cursor(state); - if (state->single_line) - state->cursor = n; - else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE) - ++state->cursor; - state->select_end = state->cursor; - state->has_preferred_x = 0; - break; - } - } -} - -///////////////////////////////////////////////////////////////////////////// -// -// Undo processing -// -// @OPTIMIZE: the undo/redo buffer should be circular - -static void stb_textedit_flush_redo(StbUndoState *state) -{ - state->redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; - state->redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; -} - -// discard the oldest entry in the undo list -static void stb_textedit_discard_undo(StbUndoState *state) -{ - if (state->undo_point > 0) { - // if the 0th undo state has characters, clean those up - if (state->undo_rec[0].char_storage >= 0) { - int n = state->undo_rec[0].insert_length, i; - // delete n characters from all other records - state->undo_char_point -= n; - STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE))); - for (i=0; i < state->undo_point; ++i) - if (state->undo_rec[i].char_storage >= 0) - state->undo_rec[i].char_storage -= n; // @OPTIMIZE: get rid of char_storage and infer it - } - --state->undo_point; - STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0]))); - } -} - -// discard the oldest entry in the redo list--it's bad if this -// ever happens, but because undo & redo have to store the actual -// characters in different cases, the redo character buffer can -// fill up even though the undo buffer didn't -static void stb_textedit_discard_redo(StbUndoState *state) -{ - int k = STB_TEXTEDIT_UNDOSTATECOUNT-1; - - if (state->redo_point <= k) { - // if the k'th undo state has characters, clean those up - if (state->undo_rec[k].char_storage >= 0) { - int n = state->undo_rec[k].insert_length, i; - // move the remaining redo character data to the end of the buffer - state->redo_char_point += n; - STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((STB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE))); - // adjust the position of all the other records to account for above memmove - for (i=state->redo_point; i < k; ++i) - if (state->undo_rec[i].char_storage >= 0) - state->undo_rec[i].char_storage += n; - } - // now move all the redo records towards the end of the buffer; the first one is at 'redo_point' - // [DEAR IMGUI] - size_t move_size = (size_t)((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0])); - const char* buf_begin = (char*)state->undo_rec; (void)buf_begin; - const char* buf_end = (char*)state->undo_rec + sizeof(state->undo_rec); (void)buf_end; - IM_ASSERT(((char*)(state->undo_rec + state->redo_point)) >= buf_begin); - IM_ASSERT(((char*)(state->undo_rec + state->redo_point + 1) + move_size) <= buf_end); - STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size); - - // now move redo_point to point to the new one - ++state->redo_point; - } -} - -static StbUndoRecord *stb_text_create_undo_record(StbUndoState *state, int numchars) -{ - // any time we create a new undo record, we discard redo - stb_textedit_flush_redo(state); - - // if we have no free records, we have to make room, by sliding the - // existing records down - if (state->undo_point == STB_TEXTEDIT_UNDOSTATECOUNT) - stb_textedit_discard_undo(state); - - // if the characters to store won't possibly fit in the buffer, we can't undo - if (numchars > STB_TEXTEDIT_UNDOCHARCOUNT) { - state->undo_point = 0; - state->undo_char_point = 0; - return NULL; - } - - // if we don't have enough free characters in the buffer, we have to make room - while (state->undo_char_point + numchars > STB_TEXTEDIT_UNDOCHARCOUNT) - stb_textedit_discard_undo(state); - - return &state->undo_rec[state->undo_point++]; -} - -static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len) -{ - StbUndoRecord *r = stb_text_create_undo_record(state, insert_len); - if (r == NULL) - return NULL; - - r->where = pos; - r->insert_length = (STB_TEXTEDIT_POSITIONTYPE) insert_len; - r->delete_length = (STB_TEXTEDIT_POSITIONTYPE) delete_len; - - if (insert_len == 0) { - r->char_storage = -1; - return NULL; - } else { - r->char_storage = state->undo_char_point; - state->undo_char_point += insert_len; - return &state->undo_char[r->char_storage]; - } -} - -static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - StbUndoState *s = &state->undostate; - StbUndoRecord u, *r; - if (s->undo_point == 0) - return; - - // we need to do two things: apply the undo record, and create a redo record - u = s->undo_rec[s->undo_point-1]; - r = &s->undo_rec[s->redo_point-1]; - r->char_storage = -1; - - r->insert_length = u.delete_length; - r->delete_length = u.insert_length; - r->where = u.where; - - if (u.delete_length) { - // if the undo record says to delete characters, then the redo record will - // need to re-insert the characters that get deleted, so we need to store - // them. - - // there are three cases: - // there's enough room to store the characters - // characters stored for *redoing* don't leave room for redo - // characters stored for *undoing* don't leave room for redo - // if the last is true, we have to bail - - if (s->undo_char_point + u.delete_length >= STB_TEXTEDIT_UNDOCHARCOUNT) { - // the undo records take up too much character space; there's no space to store the redo characters - r->insert_length = 0; - } else { - int i; - - // there's definitely room to store the characters eventually - while (s->undo_char_point + u.delete_length > s->redo_char_point) { - // should never happen: - if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) - return; - // there's currently not enough room, so discard a redo record - stb_textedit_discard_redo(s); - } - r = &s->undo_rec[s->redo_point-1]; - - r->char_storage = s->redo_char_point - u.delete_length; - s->redo_char_point = s->redo_char_point - u.delete_length; - - // now save the characters - for (i=0; i < u.delete_length; ++i) - s->undo_char[r->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u.where + i); - } - - // now we can carry out the deletion - STB_TEXTEDIT_DELETECHARS(str, u.where, u.delete_length); - } - - // check type of recorded action: - if (u.insert_length) { - // easy case: was a deletion, so we need to insert n characters - STB_TEXTEDIT_INSERTCHARS(str, u.where, &s->undo_char[u.char_storage], u.insert_length); - s->undo_char_point -= u.insert_length; - } - - state->cursor = u.where + u.insert_length; - - s->undo_point--; - s->redo_point--; -} - -static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) -{ - StbUndoState *s = &state->undostate; - StbUndoRecord *u, r; - if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) - return; - - // we need to do two things: apply the redo record, and create an undo record - u = &s->undo_rec[s->undo_point]; - r = s->undo_rec[s->redo_point]; - - // we KNOW there must be room for the undo record, because the redo record - // was derived from an undo record - - u->delete_length = r.insert_length; - u->insert_length = r.delete_length; - u->where = r.where; - u->char_storage = -1; - - if (r.delete_length) { - // the redo record requires us to delete characters, so the undo record - // needs to store the characters - - if (s->undo_char_point + u->insert_length > s->redo_char_point) { - u->insert_length = 0; - u->delete_length = 0; - } else { - int i; - u->char_storage = s->undo_char_point; - s->undo_char_point = s->undo_char_point + u->insert_length; - - // now save the characters - for (i=0; i < u->insert_length; ++i) - s->undo_char[u->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u->where + i); - } - - STB_TEXTEDIT_DELETECHARS(str, r.where, r.delete_length); - } - - if (r.insert_length) { - // easy case: need to insert n characters - STB_TEXTEDIT_INSERTCHARS(str, r.where, &s->undo_char[r.char_storage], r.insert_length); - s->redo_char_point += r.insert_length; - } - - state->cursor = r.where + r.insert_length; - - s->undo_point++; - s->redo_point++; -} - -static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length) -{ - stb_text_createundo(&state->undostate, where, 0, length); -} - -static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length) -{ - int i; - STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0); - if (p) { - for (i=0; i < length; ++i) - p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); - } -} - -static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length) -{ - int i; - STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length); - if (p) { - for (i=0; i < old_length; ++i) - p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); - } -} - -// reset the state to default -static void stb_textedit_clear_state(STB_TexteditState *state, int is_single_line) -{ - state->undostate.undo_point = 0; - state->undostate.undo_char_point = 0; - state->undostate.redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; - state->undostate.redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; - state->select_end = state->select_start = 0; - state->cursor = 0; - state->has_preferred_x = 0; - state->preferred_x = 0; - state->cursor_at_end_of_line = 0; - state->initialized = 1; - state->single_line = (unsigned char) is_single_line; - state->insert_mode = 0; - state->row_count_per_page = 0; -} - -// API initialize -static void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line) -{ - stb_textedit_clear_state(state, is_single_line); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -static int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE const *ctext, int len) -{ - return stb_textedit_paste_internal(str, state, (STB_TEXTEDIT_CHARTYPE *) ctext, len); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#endif//STB_TEXTEDIT_IMPLEMENTATION - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -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. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -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 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. ------------------------------------------------------------------------------- -*/ diff --git a/dependencies/reboot/vendor/ImGui/imstb_truetype.h b/dependencies/reboot/vendor/ImGui/imstb_truetype.h deleted file mode 100644 index 643d378..0000000 --- a/dependencies/reboot/vendor/ImGui/imstb_truetype.h +++ /dev/null @@ -1,5085 +0,0 @@ -// [DEAR IMGUI] -// This is a slightly modified version of stb_truetype.h 1.26. -// Mostly fixing for compiler and static analyzer warnings. -// Grep for [DEAR IMGUI] to find the changes. - -// stb_truetype.h - v1.26 - public domain -// authored from 2009-2021 by Sean Barrett / RAD Game Tools -// -// ======================================================================= -// -// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES -// -// This library does no range checking of the offsets found in the file, -// meaning an attacker can use it to read arbitrary memory. -// -// ======================================================================= -// -// This library processes TrueType files: -// parse files -// extract glyph metrics -// extract glyph shapes -// render glyphs to one-channel bitmaps with antialiasing (box filter) -// render glyphs to one-channel SDF bitmaps (signed-distance field/function) -// -// Todo: -// non-MS cmaps -// crashproof on bad data -// hinting? (no longer patented) -// cleartype-style AA? -// optimize: use simple memory allocator for intermediates -// optimize: build edge-list directly from curves -// optimize: rasterize directly from curves? -// -// ADDITIONAL CONTRIBUTORS -// -// Mikko Mononen: compound shape support, more cmap formats -// Tor Andersson: kerning, subpixel rendering -// Dougall Johnson: OpenType / Type 2 font handling -// Daniel Ribeiro Maciel: basic GPOS-based kerning -// -// Misc other: -// Ryan Gordon -// Simon Glass -// github:IntellectualKitty -// Imanol Celaya -// Daniel Ribeiro Maciel -// -// Bug/warning reports/fixes: -// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe -// Cass Everitt Martins Mozeiko github:aloucks -// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam -// Brian Hook Omar Cornut github:vassvik -// Walter van Niftrik Ryan Griege -// David Gow Peter LaValle -// David Given Sergey Popov -// Ivan-Assen Ivanov Giumo X. Clanjor -// Anthony Pesch Higor Euripedes -// Johan Duparc Thomas Fields -// Hou Qiming Derek Vinyard -// Rob Loach Cort Stratton -// Kenney Phillis Jr. Brian Costabile -// Ken Voskuil (kaesve) -// -// VERSION HISTORY -// -// 1.26 (2021-08-28) fix broken rasterizer -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// variant PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// -// Full history can be found at the end of this file. -// -// LICENSE -// -// See end of file for license information. -// -// USAGE -// -// Include this file in whatever places need to refer to it. In ONE C/C++ -// file, write: -// #define STB_TRUETYPE_IMPLEMENTATION -// before the #include of this file. This expands out the actual -// implementation into that C/C++ file. -// -// To make the implementation private to the file that generates the implementation, -// #define STBTT_STATIC -// -// Simple 3D API (don't ship this, but it's fine for tools and quick start) -// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture -// stbtt_GetBakedQuad() -- compute quad to draw for a given char -// -// Improved 3D API (more shippable): -// #include "stb_rect_pack.h" -- optional, but you really want it -// stbtt_PackBegin() -// stbtt_PackSetOversampling() -- for improved quality on small fonts -// stbtt_PackFontRanges() -- pack and renders -// stbtt_PackEnd() -// stbtt_GetPackedQuad() -// -// "Load" a font file from a memory buffer (you have to keep the buffer loaded) -// stbtt_InitFont() -// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections -// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections -// -// Render a unicode codepoint to a bitmap -// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap -// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide -// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be -// -// Character advance/positioning -// stbtt_GetCodepointHMetrics() -// stbtt_GetFontVMetrics() -// stbtt_GetFontVMetricsOS2() -// stbtt_GetCodepointKernAdvance() -// -// Starting with version 1.06, the rasterizer was replaced with a new, -// faster and generally-more-precise rasterizer. The new rasterizer more -// accurately measures pixel coverage for anti-aliasing, except in the case -// where multiple shapes overlap, in which case it overestimates the AA pixel -// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If -// this turns out to be a problem, you can re-enable the old rasterizer with -// #define STBTT_RASTERIZER_VERSION 1 -// which will incur about a 15% speed hit. -// -// ADDITIONAL DOCUMENTATION -// -// Immediately after this block comment are a series of sample programs. -// -// After the sample programs is the "header file" section. This section -// includes documentation for each API function. -// -// Some important concepts to understand to use this library: -// -// Codepoint -// Characters are defined by unicode codepoints, e.g. 65 is -// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is -// the hiragana for "ma". -// -// Glyph -// A visual character shape (every codepoint is rendered as -// some glyph) -// -// Glyph index -// A font-specific integer ID representing a glyph -// -// Baseline -// Glyph shapes are defined relative to a baseline, which is the -// bottom of uppercase characters. Characters extend both above -// and below the baseline. -// -// Current Point -// As you draw text to the screen, you keep track of a "current point" -// which is the origin of each character. The current point's vertical -// position is the baseline. Even "baked fonts" use this model. -// -// Vertical Font Metrics -// The vertical qualities of the font, used to vertically position -// and space the characters. See docs for stbtt_GetFontVMetrics. -// -// Font Size in Pixels or Points -// The preferred interface for specifying font sizes in stb_truetype -// is to specify how tall the font's vertical extent should be in pixels. -// If that sounds good enough, skip the next paragraph. -// -// Most font APIs instead use "points", which are a common typographic -// measurement for describing font size, defined as 72 points per inch. -// stb_truetype provides a point API for compatibility. However, true -// "per inch" conventions don't make much sense on computer displays -// since different monitors have different number of pixels per -// inch. For example, Windows traditionally uses a convention that -// there are 96 pixels per inch, thus making 'inch' measurements have -// nothing to do with inches, and thus effectively defining a point to -// be 1.333 pixels. Additionally, the TrueType font data provides -// an explicit scale factor to scale a given font's glyphs to points, -// but the author has observed that this scale factor is often wrong -// for non-commercial fonts, thus making fonts scaled in points -// according to the TrueType spec incoherently sized in practice. -// -// DETAILED USAGE: -// -// Scale: -// Select how high you want the font to be, in points or pixels. -// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute -// a scale factor SF that will be used by all other functions. -// -// Baseline: -// You need to select a y-coordinate that is the baseline of where -// your text will appear. Call GetFontBoundingBox to get the baseline-relative -// bounding box for all characters. SF*-y0 will be the distance in pixels -// that the worst-case character could extend above the baseline, so if -// you want the top edge of characters to appear at the top of the -// screen where y=0, then you would set the baseline to SF*-y0. -// -// Current point: -// Set the current point where the first character will appear. The -// first character could extend left of the current point; this is font -// dependent. You can either choose a current point that is the leftmost -// point and hope, or add some padding, or check the bounding box or -// left-side-bearing of the first character to be displayed and set -// the current point based on that. -// -// Displaying a character: -// Compute the bounding box of the character. It will contain signed values -// relative to . I.e. if it returns x0,y0,x1,y1, -// then the character should be displayed in the rectangle from -// to = 32 && *text < 128) { - stbtt_aligned_quad q; - stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 - glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); - glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); - glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); - glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); - } - ++text; - } - glEnd(); -} -#endif -// -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program (this compiles): get a single bitmap, print as ASCII art -// -#if 0 -#include -#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation -#include "stb_truetype.h" - -char ttf_buffer[1<<25]; - -int main(int argc, char **argv) -{ - stbtt_fontinfo font; - unsigned char *bitmap; - int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); - - fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); - - stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); - bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); - - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) - putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); - putchar('\n'); - } - return 0; -} -#endif -// -// Output: -// -// .ii. -// @@@@@@. -// V@Mio@@o -// :i. V@V -// :oM@@M -// :@@@MM@M -// @@o o@M -// :@@. M@M -// @@@o@@@@ -// :M@@V:@@. -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program: print "Hello World!" banner, with bugs -// -#if 0 -char buffer[24<<20]; -unsigned char screen[20][79]; - -int main(int arg, char **argv) -{ - stbtt_fontinfo font; - int i,j,ascent,baseline,ch=0; - float scale, xpos=2; // leave a little padding in case the character extends left - char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness - - fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); - stbtt_InitFont(&font, buffer, 0); - - scale = stbtt_ScaleForPixelHeight(&font, 15); - stbtt_GetFontVMetrics(&font, &ascent,0,0); - baseline = (int) (ascent*scale); - - while (text[ch]) { - int advance,lsb,x0,y0,x1,y1; - float x_shift = xpos - (float) floor(xpos); - stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); - stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); - stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); - // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong - // because this API is really for baking character bitmaps into textures. if you want to render - // a sequence of characters, you really need to render each bitmap to a temp buffer, then - // "alpha blend" that into the working buffer - xpos += (advance * scale); - if (text[ch+1]) - xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); - ++ch; - } - - for (j=0; j < 20; ++j) { - for (i=0; i < 78; ++i) - putchar(" .:ioVM@"[screen[j][i]>>5]); - putchar('\n'); - } - - return 0; -} -#endif - - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//// -//// INTEGRATION WITH YOUR CODEBASE -//// -//// The following sections allow you to supply alternate definitions -//// of C library functions used by stb_truetype, e.g. if you don't -//// link with the C runtime library. - -#ifdef STB_TRUETYPE_IMPLEMENTATION - // #define your own (u)stbtt_int8/16/32 before including to override this - #ifndef stbtt_uint8 - typedef unsigned char stbtt_uint8; - typedef signed char stbtt_int8; - typedef unsigned short stbtt_uint16; - typedef signed short stbtt_int16; - typedef unsigned int stbtt_uint32; - typedef signed int stbtt_int32; - #endif - - typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; - typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; - - // e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h - #ifndef STBTT_ifloor - #include - #define STBTT_ifloor(x) ((int) floor(x)) - #define STBTT_iceil(x) ((int) ceil(x)) - #endif - - #ifndef STBTT_sqrt - #include - #define STBTT_sqrt(x) sqrt(x) - #define STBTT_pow(x,y) pow(x,y) - #endif - - #ifndef STBTT_fmod - #include - #define STBTT_fmod(x,y) fmod(x,y) - #endif - - #ifndef STBTT_cos - #include - #define STBTT_cos(x) cos(x) - #define STBTT_acos(x) acos(x) - #endif - - #ifndef STBTT_fabs - #include - #define STBTT_fabs(x) fabs(x) - #endif - - // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h - #ifndef STBTT_malloc - #include - #define STBTT_malloc(x,u) ((void)(u),malloc(x)) - #define STBTT_free(x,u) ((void)(u),free(x)) - #endif - - #ifndef STBTT_assert - #include - #define STBTT_assert(x) assert(x) - #endif - - #ifndef STBTT_strlen - #include - #define STBTT_strlen(x) strlen(x) - #endif - - #ifndef STBTT_memcpy - #include - #define STBTT_memcpy memcpy - #define STBTT_memset memset - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// INTERFACE -//// -//// - -#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ -#define __STB_INCLUDE_STB_TRUETYPE_H__ - -#ifdef STBTT_STATIC -#define STBTT_DEF static -#else -#define STBTT_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// private structure -typedef struct -{ - unsigned char *data; - int cursor; - int size; -} stbtt__buf; - -////////////////////////////////////////////////////////////////////////////// -// -// TEXTURE BAKING API -// -// If you use this API, you only have to call two functions ever. -// - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; -} stbtt_bakedchar; - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata); // you allocate this, it's num_chars long -// if return is positive, the first unused row of the bitmap -// if return is negative, returns the negative of the number of characters that fit -// if return is 0, no characters fit and no rows were used -// This uses a very crappy packing. - -typedef struct -{ - float x0,y0,s0,t0; // top-left - float x1,y1,s1,t1; // bottom-right -} stbtt_aligned_quad; - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier -// Call GetBakedQuad with char_index = 'character - first_char', and it -// creates the quad you need to draw and advances the current position. -// -// The coordinate system used assumes y increases downwards. -// -// Characters will extend both above and below the current position; -// see discussion of "BASELINE" above. -// -// It's inefficient; you might want to c&p it and optimize it. - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); -// Query the font vertical metrics without having to create a font first. - - -////////////////////////////////////////////////////////////////////////////// -// -// NEW TEXTURE BAKING API -// -// This provides options for packing multiple fonts into one atlas, not -// perfectly but better than nothing. - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; - float xoff2,yoff2; -} stbtt_packedchar; - -typedef struct stbtt_pack_context stbtt_pack_context; -typedef struct stbtt_fontinfo stbtt_fontinfo; -#ifndef STB_RECT_PACK_VERSION -typedef struct stbrp_rect stbrp_rect; -#endif - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); -// Initializes a packing context stored in the passed-in stbtt_pack_context. -// Future calls using this context will pack characters into the bitmap passed -// in here: a 1-channel bitmap that is width * height. stride_in_bytes is -// the distance from one row to the next (or 0 to mean they are packed tightly -// together). "padding" is the amount of padding to leave between each -// character (normally you want '1' for bitmaps you'll use as textures with -// bilinear filtering). -// -// Returns 0 on failure, 1 on success. - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); -// Cleans up the packing context and frees all memory. - -#define STBTT_POINT_SIZE(x) (-(x)) - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); -// Creates character bitmaps from the font_index'th font found in fontdata (use -// font_index=0 if you don't know what that is). It creates num_chars_in_range -// bitmaps for characters with unicode values starting at first_unicode_char_in_range -// and increasing. Data for how to render them is stored in chardata_for_range; -// pass these to stbtt_GetPackedQuad to get back renderable quads. -// -// font_size is the full height of the character from ascender to descender, -// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed -// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() -// and pass that result as 'font_size': -// ..., 20 , ... // font max minus min y is 20 pixels tall -// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall - -typedef struct -{ - float font_size; - int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint - int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints - int num_chars; - stbtt_packedchar *chardata_for_range; // output - unsigned char h_oversample, v_oversample; // don't set these, they're used internally -} stbtt_pack_range; - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); -// Creates character bitmaps from multiple ranges of characters stored in -// ranges. This will usually create a better-packed bitmap than multiple -// calls to stbtt_PackFontRange. Note that you can call this multiple -// times within a single PackBegin/PackEnd. - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); -// Oversampling a font increases the quality by allowing higher-quality subpixel -// positioning, and is especially valuable at smaller text sizes. -// -// This function sets the amount of oversampling for all following calls to -// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given -// pack context. The default (no oversampling) is achieved by h_oversample=1 -// and v_oversample=1. The total number of pixels required is -// h_oversample*v_oversample larger than the default; for example, 2x2 -// oversampling requires 4x the storage of 1x1. For best results, render -// oversampled textures with bilinear filtering. Look at the readme in -// stb/tests/oversample for information about oversampled fonts -// -// To use with PackFontRangesGather etc., you must set it before calls -// call to PackFontRangesGatherRects. - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); -// If skip != 0, this tells stb_truetype to skip any codepoints for which -// there is no corresponding glyph. If skip=0, which is the default, then -// codepoints without a glyph recived the font's "missing character" glyph, -// typically an empty box by convention. - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int align_to_integer); - -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -// Calling these functions in sequence is roughly equivalent to calling -// stbtt_PackFontRanges(). If you more control over the packing of multiple -// fonts, or if you want to pack custom data into a font texture, take a look -// at the source to of stbtt_PackFontRanges() and create a custom version -// using these functions, e.g. call GatherRects multiple times, -// building up a single array of rects, then call PackRects once, -// then call RenderIntoRects repeatedly. This may result in a -// better packing than calling PackFontRanges multiple times -// (or it may not). - -// this is an opaque structure that you shouldn't mess with which holds -// all the context needed from PackBegin to PackEnd. -struct stbtt_pack_context { - void *user_allocator_context; - void *pack_info; - int width; - int height; - int stride_in_bytes; - int padding; - int skip_missing; - unsigned int h_oversample, v_oversample; - unsigned char *pixels; - void *nodes; -}; - -////////////////////////////////////////////////////////////////////////////// -// -// FONT LOADING -// -// - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); -// This function will determine the number of fonts in a font file. TrueType -// collection (.ttc) files may contain multiple fonts, while TrueType font -// (.ttf) files only contain one font. The number of fonts can be used for -// indexing with the previous function where the index is between zero and one -// less than the total fonts. If an error occurs, -1 is returned. - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); -// Each .ttf/.ttc file may have more than one font. Each font has a sequential -// index number starting from 0. Call this function to get the font offset for -// a given index; it returns -1 if the index is out of range. A regular .ttf -// file will only define one font and it always be at offset 0, so it will -// return '0' for index 0, and -1 for all other indices. - -// The following structure is defined publicly so you can declare one on -// the stack or as a global or etc, but you should treat it as opaque. -struct stbtt_fontinfo -{ - void * userdata; - unsigned char * data; // pointer to .ttf file - int fontstart; // offset of start of font - - int numGlyphs; // number of glyphs, needed for range checking - - int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf - int index_map; // a cmap mapping for our chosen character encoding - int indexToLocFormat; // format needed to map from glyph index to glyph - - stbtt__buf cff; // cff font data - stbtt__buf charstrings; // the charstring index - stbtt__buf gsubrs; // global charstring subroutines index - stbtt__buf subrs; // private charstring subroutines index - stbtt__buf fontdicts; // array of font dicts - stbtt__buf fdselect; // map from glyph to fontdict -}; - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); -// Given an offset into the file that defines a font, this function builds -// the necessary cached info for the rest of the system. You must allocate -// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't -// need to do anything special to free it, because the contents are pure -// value data with no additional data structures. Returns 0 on failure. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER TO GLYPH-INDEX CONVERSIOn - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); -// If you're going to perform multiple operations on the same character -// and you want a speed-up, call this function with the character you're -// going to process, then use glyph-based functions instead of the -// codepoint-based functions. -// Returns 0 if the character codepoint is not defined in the font. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER PROPERTIES -// - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose "height" is 'pixels' tall. -// Height is measured as the distance from the highest ascender to the lowest -// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics -// and computing: -// scale = pixels / (ascent - descent) -// so if you prefer to measure height by the ascent only, use a similar calculation. - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose EM size is mapped to -// 'pixels' tall. This is probably what traditional APIs compute, but -// I'm not positive. - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); -// ascent is the coordinate above the baseline the font extends; descent -// is the coordinate below the baseline the font extends (i.e. it is typically negative) -// lineGap is the spacing between one row's descent and the next row's ascent... -// so you should advance the vertical position by "*ascent - *descent + *lineGap" -// these are expressed in unscaled coordinates, so you must multiply by -// the scale factor for a given size - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); -// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 -// table (specific to MS/Windows TTF files). -// -// Returns 1 on success (table present), 0 on failure. - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); -// the bounding box around all possible characters - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); -// leftSideBearing is the offset from the current horizontal position to the left edge of the character -// advanceWidth is the offset from the current horizontal position to the next horizontal position -// these are expressed in unscaled coordinates - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); -// an additional amount to add to the 'advance' value between ch1 and ch2 - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); -// Gets the bounding box of the visible part of the glyph, in unscaled coordinates - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); -// as above, but takes one or more glyph indices for greater efficiency - -typedef struct stbtt_kerningentry -{ - int glyph1; // use stbtt_FindGlyphIndex - int glyph2; - int advance; -} stbtt_kerningentry; - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); -// Retrieves a complete list of all of the kerning pairs provided by the font -// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. -// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) - -////////////////////////////////////////////////////////////////////////////// -// -// GLYPH SHAPES (you probably don't need these, but they have to go before -// the bitmaps for C declaration-order reasons) -// - -#ifndef STBTT_vmove // you can predefine these to use different values (but why?) - enum { - STBTT_vmove=1, - STBTT_vline, - STBTT_vcurve, - STBTT_vcubic - }; -#endif - -#ifndef stbtt_vertex // you can predefine this to use different values - // (we share this with other code at RAD) - #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file - typedef struct - { - stbtt_vertex_type x,y,cx,cy,cx1,cy1; - unsigned char type,padding; - } stbtt_vertex; -#endif - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); -// returns non-zero if nothing is drawn for this glyph - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); -// returns # of vertices and fills *vertices with the pointer to them -// these are expressed in "unscaled" coordinates -// -// The shape is a series of contours. Each one starts with -// a STBTT_moveto, then consists of a series of mixed -// STBTT_lineto and STBTT_curveto segments. A lineto -// draws a line from previous endpoint to its x,y; a curveto -// draws a quadratic bezier from previous endpoint to -// its x,y, using cx,cy as the bezier control point. - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); -// frees the data allocated above - -STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl); -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); -// fills svg with the character's SVG data. -// returns data size or 0 if SVG not found. - -////////////////////////////////////////////////////////////////////////////// -// -// BITMAP RENDERING -// - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); -// frees the bitmap allocated below - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// allocates a large-enough single-channel 8bpp bitmap and renders the -// specified character/glyph at the specified scale into it, with -// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). -// *width & *height are filled out with the width & height of the bitmap, -// which is stored left-to-right, top-to-bottom. -// -// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); -// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap -// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap -// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the -// width and height and positioning info for it first. - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); -// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); -// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering -// is performed (see stbtt_PackSetOversampling) - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -// get the bbox of the bitmap centered around the glyph origin; so the -// bitmap width is ix1-ix0, height is iy1-iy0, and location to place -// the bitmap top left is (leftSideBearing*scale,iy0). -// (Note that the bitmap uses y-increases-down, but the shape uses -// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); -// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel -// shift for the character - -// the following functions are equivalent to the above functions, but operate -// on glyph indices instead of Unicode codepoints (for efficiency) -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); - - -// @TODO: don't expose this structure -typedef struct -{ - int w,h,stride; - unsigned char *pixels; -} stbtt__bitmap; - -// rasterize a shape with quadratic beziers into a bitmap -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into - float flatness_in_pixels, // allowable error of curve in pixels - stbtt_vertex *vertices, // array of vertices defining shape - int num_verts, // number of vertices in above array - float scale_x, float scale_y, // scale applied to input vertices - float shift_x, float shift_y, // translation applied to input vertices - int x_off, int y_off, // another translation applied to input - int invert, // if non-zero, vertically flip shape - void *userdata); // context for to STBTT_MALLOC - -////////////////////////////////////////////////////////////////////////////// -// -// Signed Distance Function (or Field) rendering - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); -// frees the SDF bitmap allocated below - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -// These functions compute a discretized SDF field for a single character, suitable for storing -// in a single-channel texture, sampling with bilinear filtering, and testing against -// larger than some threshold to produce scalable fonts. -// info -- the font -// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap -// glyph/codepoint -- the character to generate the SDF for -// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), -// which allows effects like bit outlines -// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) -// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) -// if positive, > onedge_value is inside; if negative, < onedge_value is inside -// width,height -- output height & width of the SDF bitmap (including padding) -// xoff,yoff -- output origin of the character -// return value -- a 2D array of bytes 0..255, width*height in size -// -// pixel_dist_scale & onedge_value are a scale & bias that allows you to make -// optimal use of the limited 0..255 for your application, trading off precision -// and special effects. SDF values outside the range 0..255 are clamped to 0..255. -// -// Example: -// scale = stbtt_ScaleForPixelHeight(22) -// padding = 5 -// onedge_value = 180 -// pixel_dist_scale = 180/5.0 = 36.0 -// -// This will create an SDF bitmap in which the character is about 22 pixels -// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled -// shape, sample the SDF at each pixel and fill the pixel if the SDF value -// is greater than or equal to 180/255. (You'll actually want to antialias, -// which is beyond the scope of this example.) Additionally, you can compute -// offset outlines (e.g. to stroke the character border inside & outside, -// or only outside). For example, to fill outside the character up to 3 SDF -// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above -// choice of variables maps a range from 5 pixels outside the shape to -// 2 pixels inside the shape to 0..255; this is intended primarily for apply -// outside effects only (the interior range is needed to allow proper -// antialiasing of the font at *smaller* sizes) -// -// The function computes the SDF analytically at each SDF pixel, not by e.g. -// building a higher-res bitmap and approximating it. In theory the quality -// should be as high as possible for an SDF of this size & representation, but -// unclear if this is true in practice (perhaps building a higher-res bitmap -// and computing from that can allow drop-out prevention). -// -// The algorithm has not been optimized at all, so expect it to be slow -// if computing lots of characters or very large sizes. - - - -////////////////////////////////////////////////////////////////////////////// -// -// Finding the right font... -// -// You should really just solve this offline, keep your own tables -// of what font is what, and don't try to get it out of the .ttf file. -// That's because getting it out of the .ttf file is really hard, because -// the names in the file can appear in many possible encodings, in many -// possible languages, and e.g. if you need a case-insensitive comparison, -// the details of that depend on the encoding & language in a complex way -// (actually underspecified in truetype, but also gigantic). -// -// But you can use the provided functions in two possible ways: -// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on -// unicode-encoded names to try to find the font you want; -// you can run this before calling stbtt_InitFont() -// -// stbtt_GetFontNameString() lets you get any of the various strings -// from the file yourself and do your own comparisons on them. -// You have to have called stbtt_InitFont() first. - - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); -// returns the offset (not index) of the font that matches, or -1 if none -// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". -// if you use any other flag, use a font name like "Arial"; this checks -// the 'macStyle' header field; i don't know if fonts set this consistently -#define STBTT_MACSTYLE_DONTCARE 0 -#define STBTT_MACSTYLE_BOLD 1 -#define STBTT_MACSTYLE_ITALIC 2 -#define STBTT_MACSTYLE_UNDERSCORE 4 -#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); -// returns 1/0 whether the first string interpreted as utf8 is identical to -// the second string interpreted as big-endian utf16... useful for strings from next func - -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); -// returns the string (which may be big-endian double byte, e.g. for unicode) -// and puts the length in bytes in *length. -// -// some of the values for the IDs are below; for more see the truetype spec: -// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html -// http://www.microsoft.com/typography/otspec/name.htm - -enum { // platformID - STBTT_PLATFORM_ID_UNICODE =0, - STBTT_PLATFORM_ID_MAC =1, - STBTT_PLATFORM_ID_ISO =2, - STBTT_PLATFORM_ID_MICROSOFT =3 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_UNICODE - STBTT_UNICODE_EID_UNICODE_1_0 =0, - STBTT_UNICODE_EID_UNICODE_1_1 =1, - STBTT_UNICODE_EID_ISO_10646 =2, - STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, - STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT - STBTT_MS_EID_SYMBOL =0, - STBTT_MS_EID_UNICODE_BMP =1, - STBTT_MS_EID_SHIFTJIS =2, - STBTT_MS_EID_UNICODE_FULL =10 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes - STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, - STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, - STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, - STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 -}; - -enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... - // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs - STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, - STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, - STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, - STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, - STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, - STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D -}; - -enum { // languageID for STBTT_PLATFORM_ID_MAC - STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, - STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, - STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, - STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , - STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , - STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, - STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 -}; - -#ifdef __cplusplus -} -#endif - -#endif // __STB_INCLUDE_STB_TRUETYPE_H__ - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// IMPLEMENTATION -//// -//// - -#ifdef STB_TRUETYPE_IMPLEMENTATION - -#ifndef STBTT_MAX_OVERSAMPLE -#define STBTT_MAX_OVERSAMPLE 8 -#endif - -#if STBTT_MAX_OVERSAMPLE > 255 -#error "STBTT_MAX_OVERSAMPLE cannot be > 255" -#endif - -typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; - -#ifndef STBTT_RASTERIZER_VERSION -#define STBTT_RASTERIZER_VERSION 2 -#endif - -#ifdef _MSC_VER -#define STBTT__NOTUSED(v) (void)(v) -#else -#define STBTT__NOTUSED(v) (void)sizeof(v) -#endif - -////////////////////////////////////////////////////////////////////////// -// -// stbtt__buf helpers to parse data from file -// - -static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor++]; -} - -static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor]; -} - -static void stbtt__buf_seek(stbtt__buf *b, int o) -{ - STBTT_assert(!(o > b->size || o < 0)); - b->cursor = (o > b->size || o < 0) ? b->size : o; -} - -static void stbtt__buf_skip(stbtt__buf *b, int o) -{ - stbtt__buf_seek(b, b->cursor + o); -} - -static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) -{ - stbtt_uint32 v = 0; - int i; - STBTT_assert(n >= 1 && n <= 4); - for (i = 0; i < n; i++) - v = (v << 8) | stbtt__buf_get8(b); - return v; -} - -static stbtt__buf stbtt__new_buf(const void *p, size_t size) -{ - stbtt__buf r; - STBTT_assert(size < 0x40000000); - r.data = (stbtt_uint8*) p; - r.size = (int) size; - r.cursor = 0; - return r; -} - -#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) -#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) - -static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) -{ - stbtt__buf r = stbtt__new_buf(NULL, 0); - if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; - r.data = b->data + o; - r.size = s; - return r; -} - -static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) -{ - int count, start, offsize; - start = b->cursor; - count = stbtt__buf_get16(b); - if (count) { - offsize = stbtt__buf_get8(b); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(b, offsize * count); - stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); - } - return stbtt__buf_range(b, start, b->cursor - start); -} - -static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) -{ - int b0 = stbtt__buf_get8(b); - if (b0 >= 32 && b0 <= 246) return b0 - 139; - else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; - else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; - else if (b0 == 28) return stbtt__buf_get16(b); - else if (b0 == 29) return stbtt__buf_get32(b); - STBTT_assert(0); - return 0; -} - -static void stbtt__cff_skip_operand(stbtt__buf *b) { - int v, b0 = stbtt__buf_peek8(b); - STBTT_assert(b0 >= 28); - if (b0 == 30) { - stbtt__buf_skip(b, 1); - while (b->cursor < b->size) { - v = stbtt__buf_get8(b); - if ((v & 0xF) == 0xF || (v >> 4) == 0xF) - break; - } - } else { - stbtt__cff_int(b); - } -} - -static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) -{ - stbtt__buf_seek(b, 0); - while (b->cursor < b->size) { - int start = b->cursor, end, op; - while (stbtt__buf_peek8(b) >= 28) - stbtt__cff_skip_operand(b); - end = b->cursor; - op = stbtt__buf_get8(b); - if (op == 12) op = stbtt__buf_get8(b) | 0x100; - if (op == key) return stbtt__buf_range(b, start, end-start); - } - return stbtt__buf_range(b, 0, 0); -} - -static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) -{ - int i; - stbtt__buf operands = stbtt__dict_get(b, key); - for (i = 0; i < outcount && operands.cursor < operands.size; i++) - out[i] = stbtt__cff_int(&operands); -} - -static int stbtt__cff_index_count(stbtt__buf *b) -{ - stbtt__buf_seek(b, 0); - return stbtt__buf_get16(b); -} - -static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) -{ - int count, offsize, start, end; - stbtt__buf_seek(&b, 0); - count = stbtt__buf_get16(&b); - offsize = stbtt__buf_get8(&b); - STBTT_assert(i >= 0 && i < count); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(&b, i*offsize); - start = stbtt__buf_get(&b, offsize); - end = stbtt__buf_get(&b, offsize); - return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); -} - -////////////////////////////////////////////////////////////////////////// -// -// accessors to parse data from file -// - -// on platforms that don't allow misaligned reads, if we want to allow -// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE - -#define ttBYTE(p) (* (stbtt_uint8 *) (p)) -#define ttCHAR(p) (* (stbtt_int8 *) (p)) -#define ttFixed(p) ttLONG(p) - -static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } -static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } - -#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) -#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) - -static int stbtt__isfont(stbtt_uint8 *font) -{ - // check the version number - if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 - if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! - if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF - if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 - if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts - return 0; -} - -// @OPTIMIZE: binary search -static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) -{ - stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); - stbtt_uint32 tabledir = fontstart + 12; - stbtt_int32 i; - for (i=0; i < num_tables; ++i) { - stbtt_uint32 loc = tabledir + 16*i; - if (stbtt_tag(data+loc+0, tag)) - return ttULONG(data+loc+8); - } - return 0; -} - -static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) -{ - // if it's just a font, there's only one valid index - if (stbtt__isfont(font_collection)) - return index == 0 ? 0 : -1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - stbtt_int32 n = ttLONG(font_collection+8); - if (index >= n) - return -1; - return ttULONG(font_collection+12+index*4); - } - } - return -1; -} - -static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) -{ - // if it's just a font, there's only one valid font - if (stbtt__isfont(font_collection)) - return 1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - return ttLONG(font_collection+8); - } - } - return 0; -} - -static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) -{ - stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; - stbtt__buf pdict; - stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); - if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); - pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); - stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); - if (!subrsoff) return stbtt__new_buf(NULL, 0); - stbtt__buf_seek(&cff, private_loc[1]+subrsoff); - return stbtt__cff_get_index(&cff); -} - -// since most people won't use this, find this table the first time it's needed -static int stbtt__get_svg(stbtt_fontinfo *info) -{ - stbtt_uint32 t; - if (info->svg < 0) { - t = stbtt__find_table(info->data, info->fontstart, "SVG "); - if (t) { - stbtt_uint32 offset = ttULONG(info->data + t + 2); - info->svg = t + offset; - } else { - info->svg = 0; - } - } - return info->svg; -} - -static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) -{ - stbtt_uint32 cmap, t; - stbtt_int32 i,numTables; - - info->data = data; - info->fontstart = fontstart; - info->cff = stbtt__new_buf(NULL, 0); - - cmap = stbtt__find_table(data, fontstart, "cmap"); // required - info->loca = stbtt__find_table(data, fontstart, "loca"); // required - info->head = stbtt__find_table(data, fontstart, "head"); // required - info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required - info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required - info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required - info->kern = stbtt__find_table(data, fontstart, "kern"); // not required - info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required - - if (!cmap || !info->head || !info->hhea || !info->hmtx) - return 0; - if (info->glyf) { - // required for truetype - if (!info->loca) return 0; - } else { - // initialization for CFF / Type2 fonts (OTF) - stbtt__buf b, topdict, topdictidx; - stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; - stbtt_uint32 cff; - - cff = stbtt__find_table(data, fontstart, "CFF "); - if (!cff) return 0; - - info->fontdicts = stbtt__new_buf(NULL, 0); - info->fdselect = stbtt__new_buf(NULL, 0); - - // @TODO this should use size from table (not 512MB) - info->cff = stbtt__new_buf(data+cff, 512*1024*1024); - b = info->cff; - - // read the header - stbtt__buf_skip(&b, 2); - stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize - - // @TODO the name INDEX could list multiple fonts, - // but we just use the first one. - stbtt__cff_get_index(&b); // name INDEX - topdictidx = stbtt__cff_get_index(&b); - topdict = stbtt__cff_index_get(topdictidx, 0); - stbtt__cff_get_index(&b); // string INDEX - info->gsubrs = stbtt__cff_get_index(&b); - - stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); - stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); - stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); - stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); - info->subrs = stbtt__get_subrs(b, topdict); - - // we only support Type 2 charstrings - if (cstype != 2) return 0; - if (charstrings == 0) return 0; - - if (fdarrayoff) { - // looks like a CID font - if (!fdselectoff) return 0; - stbtt__buf_seek(&b, fdarrayoff); - info->fontdicts = stbtt__cff_get_index(&b); - info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); - } - - stbtt__buf_seek(&b, charstrings); - info->charstrings = stbtt__cff_get_index(&b); - } - - t = stbtt__find_table(data, fontstart, "maxp"); - if (t) - info->numGlyphs = ttUSHORT(data+t+4); - else - info->numGlyphs = 0xffff; - - info->svg = -1; - - // find a cmap encoding table we understand *now* to avoid searching - // later. (todo: could make this installable) - // the same regardless of glyph. - numTables = ttUSHORT(data + cmap + 2); - info->index_map = 0; - for (i=0; i < numTables; ++i) { - stbtt_uint32 encoding_record = cmap + 4 + 8 * i; - // find an encoding we understand: - switch(ttUSHORT(data+encoding_record)) { - case STBTT_PLATFORM_ID_MICROSOFT: - switch (ttUSHORT(data+encoding_record+2)) { - case STBTT_MS_EID_UNICODE_BMP: - case STBTT_MS_EID_UNICODE_FULL: - // MS/Unicode - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - break; - case STBTT_PLATFORM_ID_UNICODE: - // Mac/iOS has these - // all the encodingIDs are unicode, so we don't bother to check it - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - } - if (info->index_map == 0) - return 0; - - info->indexToLocFormat = ttUSHORT(data+info->head + 50); - return 1; -} - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) -{ - stbtt_uint8 *data = info->data; - stbtt_uint32 index_map = info->index_map; - - stbtt_uint16 format = ttUSHORT(data + index_map + 0); - if (format == 0) { // apple byte encoding - stbtt_int32 bytes = ttUSHORT(data + index_map + 2); - if (unicode_codepoint < bytes-6) - return ttBYTE(data + index_map + 6 + unicode_codepoint); - return 0; - } else if (format == 6) { - stbtt_uint32 first = ttUSHORT(data + index_map + 6); - stbtt_uint32 count = ttUSHORT(data + index_map + 8); - if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) - return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); - return 0; - } else if (format == 2) { - STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean - return 0; - } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges - stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; - stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; - stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); - stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; - - // do a binary search of the segments - stbtt_uint32 endCount = index_map + 14; - stbtt_uint32 search = endCount; - - if (unicode_codepoint > 0xffff) - return 0; - - // they lie from endCount .. endCount + segCount - // but searchRange is the nearest power of two, so... - if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) - search += rangeShift*2; - - // now decrement to bias correctly to find smallest - search -= 2; - while (entrySelector) { - stbtt_uint16 end; - searchRange >>= 1; - end = ttUSHORT(data + search + searchRange*2); - if (unicode_codepoint > end) - search += searchRange*2; - --entrySelector; - } - search += 2; - - { - stbtt_uint16 offset, start, last; - stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); - - start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); - last = ttUSHORT(data + endCount + 2*item); - if (unicode_codepoint < start || unicode_codepoint > last) - return 0; - - offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); - if (offset == 0) - return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); - - return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); - } - } else if (format == 12 || format == 13) { - stbtt_uint32 ngroups = ttULONG(data+index_map+12); - stbtt_int32 low,high; - low = 0; high = (stbtt_int32)ngroups; - // Binary search the right group. - while (low < high) { - stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high - stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); - stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); - if ((stbtt_uint32) unicode_codepoint < start_char) - high = mid; - else if ((stbtt_uint32) unicode_codepoint > end_char) - low = mid+1; - else { - stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); - if (format == 12) - return start_glyph + unicode_codepoint-start_char; - else // format == 13 - return start_glyph; - } - } - return 0; // not found - } - // @TODO - STBTT_assert(0); - return 0; -} - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) -{ - return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); -} - -static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) -{ - v->type = type; - v->x = (stbtt_int16) x; - v->y = (stbtt_int16) y; - v->cx = (stbtt_int16) cx; - v->cy = (stbtt_int16) cy; -} - -static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) -{ - int g1,g2; - - STBTT_assert(!info->cff.size); - - if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range - if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format - - if (info->indexToLocFormat == 0) { - g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; - g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; - } else { - g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); - g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); - } - - return g1==g2 ? -1 : g1; // if length is 0, return -1 -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); - -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - if (info->cff.size) { - stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); - } else { - int g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 0; - - if (x0) *x0 = ttSHORT(info->data + g + 2); - if (y0) *y0 = ttSHORT(info->data + g + 4); - if (x1) *x1 = ttSHORT(info->data + g + 6); - if (y1) *y1 = ttSHORT(info->data + g + 8); - } - return 1; -} - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) -{ - return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); -} - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt_int16 numberOfContours; - int g; - if (info->cff.size) - return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; - g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 1; - numberOfContours = ttSHORT(info->data + g); - return numberOfContours == 0; -} - -static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, - stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) -{ - if (start_off) { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); - } - return num_vertices; -} - -static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - stbtt_int16 numberOfContours; - stbtt_uint8 *endPtsOfContours; - stbtt_uint8 *data = info->data; - stbtt_vertex *vertices=0; - int num_vertices=0; - int g = stbtt__GetGlyfOffset(info, glyph_index); - - *pvertices = NULL; - - if (g < 0) return 0; - - numberOfContours = ttSHORT(data + g); - - if (numberOfContours > 0) { - stbtt_uint8 flags=0,flagcount; - stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; - stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; - stbtt_uint8 *points; - endPtsOfContours = (data + g + 10); - ins = ttUSHORT(data + g + 10 + numberOfContours * 2); - points = data + g + 10 + numberOfContours * 2 + 2 + ins; - - n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); - - m = n + 2*numberOfContours; // a loose bound on how many vertices we might need - vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); - if (vertices == 0) - return 0; - - next_move = 0; - flagcount=0; - - // in first pass, we load uninterpreted data into the allocated array - // above, shifted to the end of the array so we won't overwrite it when - // we create our final data starting from the front - - off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated - - // first load flags - - for (i=0; i < n; ++i) { - if (flagcount == 0) { - flags = *points++; - if (flags & 8) - flagcount = *points++; - } else - --flagcount; - vertices[off+i].type = flags; - } - - // now load x coordinates - x=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 2) { - stbtt_int16 dx = *points++; - x += (flags & 16) ? dx : -dx; // ??? - } else { - if (!(flags & 16)) { - x = x + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].x = (stbtt_int16) x; - } - - // now load y coordinates - y=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 4) { - stbtt_int16 dy = *points++; - y += (flags & 32) ? dy : -dy; // ??? - } else { - if (!(flags & 32)) { - y = y + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].y = (stbtt_int16) y; - } - - // now convert them to our format - num_vertices=0; - sx = sy = cx = cy = scx = scy = 0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - x = (stbtt_int16) vertices[off+i].x; - y = (stbtt_int16) vertices[off+i].y; - - if (next_move == i) { - if (i != 0) - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - - // now start the new one - start_off = !(flags & 1); - if (start_off) { - // if we start off with an off-curve point, then when we need to find a point on the curve - // where we can start, and we need to save some state for when we wraparound. - scx = x; - scy = y; - if (!(vertices[off+i+1].type & 1)) { - // next point is also a curve point, so interpolate an on-point curve - sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; - sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; - } else { - // otherwise just use the next point as our start point - sx = (stbtt_int32) vertices[off+i+1].x; - sy = (stbtt_int32) vertices[off+i+1].y; - ++i; // we're using point i+1 as the starting point, so skip it - } - } else { - sx = x; - sy = y; - } - stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); - was_off = 0; - next_move = 1 + ttUSHORT(endPtsOfContours+j*2); - ++j; - } else { - if (!(flags & 1)) { // if it's a curve - if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); - cx = x; - cy = y; - was_off = 1; - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); - was_off = 0; - } - } - } - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - } else if (numberOfContours < 0) { - // Compound shapes. - int more = 1; - stbtt_uint8 *comp = data + g + 10; - num_vertices = 0; - vertices = 0; - while (more) { - stbtt_uint16 flags, gidx; - int comp_num_verts = 0, i; - stbtt_vertex *comp_verts = 0, *tmp = 0; - float mtx[6] = {1,0,0,1,0,0}, m, n; - - flags = ttSHORT(comp); comp+=2; - gidx = ttSHORT(comp); comp+=2; - - if (flags & 2) { // XY values - if (flags & 1) { // shorts - mtx[4] = ttSHORT(comp); comp+=2; - mtx[5] = ttSHORT(comp); comp+=2; - } else { - mtx[4] = ttCHAR(comp); comp+=1; - mtx[5] = ttCHAR(comp); comp+=1; - } - } - else { - // @TODO handle matching point - STBTT_assert(0); - } - if (flags & (1<<3)) { // WE_HAVE_A_SCALE - mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } - - // Find transformation scales. - m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); - n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); - - // Get indexed glyph. - comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); - if (comp_num_verts > 0) { - // Transform vertices. - for (i = 0; i < comp_num_verts; ++i) { - stbtt_vertex* v = &comp_verts[i]; - stbtt_vertex_type x,y; - x=v->x; y=v->y; - v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - x=v->cx; y=v->cy; - v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - } - // Append vertices. - tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); - if (!tmp) { - if (vertices) STBTT_free(vertices, info->userdata); - if (comp_verts) STBTT_free(comp_verts, info->userdata); - return 0; - } - if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); - STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); - if (vertices) STBTT_free(vertices, info->userdata); - vertices = tmp; - STBTT_free(comp_verts, info->userdata); - num_vertices += comp_num_verts; - } - // More components ? - more = flags & (1<<5); - } - } else { - // numberOfCounters == 0, do nothing - } - - *pvertices = vertices; - return num_vertices; -} - -typedef struct -{ - int bounds; - int started; - float first_x, first_y; - float x, y; - stbtt_int32 min_x, max_x, min_y, max_y; - - stbtt_vertex *pvertices; - int num_vertices; -} stbtt__csctx; - -#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} - -static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) -{ - if (x > c->max_x || !c->started) c->max_x = x; - if (y > c->max_y || !c->started) c->max_y = y; - if (x < c->min_x || !c->started) c->min_x = x; - if (y < c->min_y || !c->started) c->min_y = y; - c->started = 1; -} - -static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) -{ - if (c->bounds) { - stbtt__track_vertex(c, x, y); - if (type == STBTT_vcubic) { - stbtt__track_vertex(c, cx, cy); - stbtt__track_vertex(c, cx1, cy1); - } - } else { - stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); - c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; - c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; - } - c->num_vertices++; -} - -static void stbtt__csctx_close_shape(stbtt__csctx *ctx) -{ - if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) -{ - stbtt__csctx_close_shape(ctx); - ctx->first_x = ctx->x = ctx->x + dx; - ctx->first_y = ctx->y = ctx->y + dy; - stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) -{ - ctx->x += dx; - ctx->y += dy; - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) -{ - float cx1 = ctx->x + dx1; - float cy1 = ctx->y + dy1; - float cx2 = cx1 + dx2; - float cy2 = cy1 + dy2; - ctx->x = cx2 + dx3; - ctx->y = cy2 + dy3; - stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); -} - -static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) -{ - int count = stbtt__cff_index_count(&idx); - int bias = 107; - if (count >= 33900) - bias = 32768; - else if (count >= 1240) - bias = 1131; - n += bias; - if (n < 0 || n >= count) - return stbtt__new_buf(NULL, 0); - return stbtt__cff_index_get(idx, n); -} - -static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt__buf fdselect = info->fdselect; - int nranges, start, end, v, fmt, fdselector = -1, i; - - stbtt__buf_seek(&fdselect, 0); - fmt = stbtt__buf_get8(&fdselect); - if (fmt == 0) { - // untested - stbtt__buf_skip(&fdselect, glyph_index); - fdselector = stbtt__buf_get8(&fdselect); - } else if (fmt == 3) { - nranges = stbtt__buf_get16(&fdselect); - start = stbtt__buf_get16(&fdselect); - for (i = 0; i < nranges; i++) { - v = stbtt__buf_get8(&fdselect); - end = stbtt__buf_get16(&fdselect); - if (glyph_index >= start && glyph_index < end) { - fdselector = v; - break; - } - start = end; - } - } - if (fdselector == -1) stbtt__new_buf(NULL, 0); - return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); -} - -static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) -{ - int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; - int has_subrs = 0, clear_stack; - float s[48]; - stbtt__buf subr_stack[10], subrs = info->subrs, b; - float f; - -#define STBTT__CSERR(s) (0) - - // this currently ignores the initial width value, which isn't needed if we have hmtx - b = stbtt__cff_index_get(info->charstrings, glyph_index); - while (b.cursor < b.size) { - i = 0; - clear_stack = 1; - b0 = stbtt__buf_get8(&b); - switch (b0) { - // @TODO implement hinting - case 0x13: // hintmask - case 0x14: // cntrmask - if (in_header) - maskbits += (sp / 2); // implicit "vstem" - in_header = 0; - stbtt__buf_skip(&b, (maskbits + 7) / 8); - break; - - case 0x01: // hstem - case 0x03: // vstem - case 0x12: // hstemhm - case 0x17: // vstemhm - maskbits += (sp / 2); - break; - - case 0x15: // rmoveto - in_header = 0; - if (sp < 2) return STBTT__CSERR("rmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); - break; - case 0x04: // vmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("vmoveto stack"); - stbtt__csctx_rmove_to(c, 0, s[sp-1]); - break; - case 0x16: // hmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("hmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-1], 0); - break; - - case 0x05: // rlineto - if (sp < 2) return STBTT__CSERR("rlineto stack"); - for (; i + 1 < sp; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical - // starting from a different place. - - case 0x07: // vlineto - if (sp < 1) return STBTT__CSERR("vlineto stack"); - goto vlineto; - case 0x06: // hlineto - if (sp < 1) return STBTT__CSERR("hlineto stack"); - for (;;) { - if (i >= sp) break; - stbtt__csctx_rline_to(c, s[i], 0); - i++; - vlineto: - if (i >= sp) break; - stbtt__csctx_rline_to(c, 0, s[i]); - i++; - } - break; - - case 0x1F: // hvcurveto - if (sp < 4) return STBTT__CSERR("hvcurveto stack"); - goto hvcurveto; - case 0x1E: // vhcurveto - if (sp < 4) return STBTT__CSERR("vhcurveto stack"); - for (;;) { - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); - i += 4; - hvcurveto: - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); - i += 4; - } - break; - - case 0x08: // rrcurveto - if (sp < 6) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x18: // rcurveline - if (sp < 8) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp - 2; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - case 0x19: // rlinecurve - if (sp < 8) return STBTT__CSERR("rlinecurve stack"); - for (; i + 1 < sp - 6; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x1A: // vvcurveto - case 0x1B: // hhcurveto - if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); - f = 0.0; - if (sp & 1) { f = s[i]; i++; } - for (; i + 3 < sp; i += 4) { - if (b0 == 0x1B) - stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); - else - stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); - f = 0.0; - } - break; - - case 0x0A: // callsubr - if (!has_subrs) { - if (info->fdselect.size) - subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); - has_subrs = 1; - } - // FALLTHROUGH - case 0x1D: // callgsubr - if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); - v = (int) s[--sp]; - if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); - subr_stack[subr_stack_height++] = b; - b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); - if (b.size == 0) return STBTT__CSERR("subr not found"); - b.cursor = 0; - clear_stack = 0; - break; - - case 0x0B: // return - if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); - b = subr_stack[--subr_stack_height]; - clear_stack = 0; - break; - - case 0x0E: // endchar - stbtt__csctx_close_shape(c); - return 1; - - case 0x0C: { // two-byte escape - float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; - float dx, dy; - int b1 = stbtt__buf_get8(&b); - switch (b1) { - // @TODO These "flex" implementations ignore the flex-depth and resolution, - // and always draw beziers. - case 0x22: // hflex - if (sp < 7) return STBTT__CSERR("hflex stack"); - dx1 = s[0]; - dx2 = s[1]; - dy2 = s[2]; - dx3 = s[3]; - dx4 = s[4]; - dx5 = s[5]; - dx6 = s[6]; - stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); - break; - - case 0x23: // flex - if (sp < 13) return STBTT__CSERR("flex stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = s[10]; - dy6 = s[11]; - //fd is s[12] - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - case 0x24: // hflex1 - if (sp < 9) return STBTT__CSERR("hflex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dx4 = s[5]; - dx5 = s[6]; - dy5 = s[7]; - dx6 = s[8]; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); - break; - - case 0x25: // flex1 - if (sp < 11) return STBTT__CSERR("flex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = dy6 = s[10]; - dx = dx1+dx2+dx3+dx4+dx5; - dy = dy1+dy2+dy3+dy4+dy5; - if (STBTT_fabs(dx) > STBTT_fabs(dy)) - dy6 = -dy; - else - dx6 = -dx; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - default: - return STBTT__CSERR("unimplemented"); - } - } break; - - default: - if (b0 != 255 && b0 != 28 && b0 < 32) - return STBTT__CSERR("reserved operator"); - - // push immediate - if (b0 == 255) { - f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; - } else { - stbtt__buf_skip(&b, -1); - f = (float)(stbtt_int16)stbtt__cff_int(&b); - } - if (sp >= 48) return STBTT__CSERR("push stack overflow"); - s[sp++] = f; - clear_stack = 0; - break; - } - if (clear_stack) sp = 0; - } - return STBTT__CSERR("no endchar"); - -#undef STBTT__CSERR -} - -static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - // runs the charstring twice, once to count and once to output (to avoid realloc) - stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); - stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); - if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { - *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); - output_ctx.pvertices = *pvertices; - if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { - STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); - return output_ctx.num_vertices; - } - } - *pvertices = NULL; - return 0; -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - stbtt__csctx c = STBTT__CSCTX_INIT(1); - int r = stbtt__run_charstring(info, glyph_index, &c); - if (x0) *x0 = r ? c.min_x : 0; - if (y0) *y0 = r ? c.min_y : 0; - if (x1) *x1 = r ? c.max_x : 0; - if (y1) *y1 = r ? c.max_y : 0; - return r ? c.num_vertices : 0; -} - -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - if (!info->cff.size) - return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); - else - return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); -} - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) -{ - stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); - if (glyph_index < numOfLongHorMetrics) { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); - } else { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); - } -} - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) -{ - stbtt_uint8 *data = info->data + info->kern; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - return ttUSHORT(data+10); -} - -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) -{ - stbtt_uint8 *data = info->data + info->kern; - int k, length; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - length = ttUSHORT(data+10); - if (table_length < length) - length = table_length; - - for (k = 0; k < length; k++) - { - table[k].glyph1 = ttUSHORT(data+18+(k*6)); - table[k].glyph2 = ttUSHORT(data+20+(k*6)); - table[k].advance = ttSHORT(data+22+(k*6)); - } - - return length; -} - -static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint8 *data = info->data + info->kern; - stbtt_uint32 needle, straw; - int l, r, m; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - l = 0; - r = ttUSHORT(data+10) - 1; - needle = glyph1 << 16 | glyph2; - while (l <= r) { - m = (l + r) >> 1; - straw = ttULONG(data+18+(m*6)); // note: unaligned read - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else - return ttSHORT(data+22+(m*6)); - } - return 0; -} - -static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) -{ - stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); - switch (coverageFormat) { - case 1: { - stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); - - // Binary search. - stbtt_int32 l=0, r=glyphCount-1, m; - int straw, needle=glyph; - while (l <= r) { - stbtt_uint8 *glyphArray = coverageTable + 4; - stbtt_uint16 glyphID; - m = (l + r) >> 1; - glyphID = ttUSHORT(glyphArray + 2 * m); - straw = glyphID; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - return m; - } - } - break; - } - - case 2: { - stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); - stbtt_uint8 *rangeArray = coverageTable + 4; - - // Binary search. - stbtt_int32 l=0, r=rangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *rangeRecord; - m = (l + r) >> 1; - rangeRecord = rangeArray + 6 * m; - strawStart = ttUSHORT(rangeRecord); - strawEnd = ttUSHORT(rangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else { - stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); - return startCoverageIndex + glyph - strawStart; - } - } - break; - } - - default: return -1; // unsupported - } - - return -1; -} - -static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) -{ - stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); - switch (classDefFormat) - { - case 1: { - stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); - stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); - stbtt_uint8 *classDef1ValueArray = classDefTable + 6; - - if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) - return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); - break; - } - - case 2: { - stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); - stbtt_uint8 *classRangeRecords = classDefTable + 4; - - // Binary search. - stbtt_int32 l=0, r=classRangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *classRangeRecord; - m = (l + r) >> 1; - classRangeRecord = classRangeRecords + 6 * m; - strawStart = ttUSHORT(classRangeRecord); - strawEnd = ttUSHORT(classRangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else - return (stbtt_int32)ttUSHORT(classRangeRecord + 4); - } - break; - } - - default: - return -1; // Unsupported definition type, return an error. - } - - // "All glyphs not assigned to a class fall into class 0". (OpenType spec) - return 0; -} - -// Define to STBTT_assert(x) if you want to break on unimplemented formats. -#define STBTT_GPOS_TODO_assert(x) - -static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint16 lookupListOffset; - stbtt_uint8 *lookupList; - stbtt_uint16 lookupCount; - stbtt_uint8 *data; - stbtt_int32 i, sti; - - if (!info->gpos) return 0; - - data = info->data + info->gpos; - - if (ttUSHORT(data+0) != 1) return 0; // Major version 1 - if (ttUSHORT(data+2) != 0) return 0; // Minor version 0 - - lookupListOffset = ttUSHORT(data+8); - lookupList = data + lookupListOffset; - lookupCount = ttUSHORT(lookupList); - - for (i=0; i= pairSetCount) return 0; - - needle=glyph2; - r=pairValueCount-1; - l=0; - - // Binary search. - while (l <= r) { - stbtt_uint16 secondGlyph; - stbtt_uint8 *pairValue; - m = (l + r) >> 1; - pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; - secondGlyph = ttUSHORT(pairValue); - straw = secondGlyph; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - stbtt_int16 xAdvance = ttSHORT(pairValue + 2); - return xAdvance; - } - } - } else - return 0; - break; - } - - case 2: { - stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); - stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); - if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? - stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); - stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); - int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); - int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); - - stbtt_uint16 class1Count = ttUSHORT(table + 12); - stbtt_uint16 class2Count = ttUSHORT(table + 14); - stbtt_uint8 *class1Records, *class2Records; - stbtt_int16 xAdvance; - - if (glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed - if (glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed - - class1Records = table + 16; - class2Records = class1Records + 2 * (glyph1class * class2Count); - xAdvance = ttSHORT(class2Records + 2 * glyph2class); - return xAdvance; - } else - return 0; - break; - } - - default: - return 0; // Unsupported position format - } - } - } - - return 0; -} - -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) -{ - int xAdvance = 0; - - if (info->gpos) - xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); - else if (info->kern) - xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); - - return xAdvance; -} - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) -{ - if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs - return 0; - return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); -} - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) -{ - stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); -} - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) -{ - if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); - if (descent) *descent = ttSHORT(info->data+info->hhea + 6); - if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); -} - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) -{ - int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); - if (!tab) - return 0; - if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); - if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); - if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); - return 1; -} - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) -{ - *x0 = ttSHORT(info->data + info->head + 36); - *y0 = ttSHORT(info->data + info->head + 38); - *x1 = ttSHORT(info->data + info->head + 40); - *y1 = ttSHORT(info->data + info->head + 42); -} - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) -{ - int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); - return (float) height / fheight; -} - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) -{ - int unitsPerEm = ttUSHORT(info->data + info->head + 18); - return pixels / unitsPerEm; -} - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) -{ - STBTT_free(v, info->userdata); -} - -STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) -{ - int i; - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); - - int numEntries = ttUSHORT(svg_doc_list); - stbtt_uint8 *svg_docs = svg_doc_list + 2; - - for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) - return svg_doc; - } - return 0; -} - -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) -{ - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc; - - if (info->svg == 0) - return 0; - - svg_doc = stbtt_FindSVGDoc(info, gl); - if (svg_doc != NULL) { - *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); - return ttULONG(svg_doc + 8); - } else { - return 0; - } -} - -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) -{ - return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); -} - -////////////////////////////////////////////////////////////////////////////// -// -// antialiasing software rasterizer -// - -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning - if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { - // e.g. space character - if (ix0) *ix0 = 0; - if (iy0) *iy0 = 0; - if (ix1) *ix1 = 0; - if (iy1) *iy1 = 0; - } else { - // move to integral bboxes (treating pixels as little squares, what pixels get touched)? - if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); - if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); - if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); - if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); - } -} - -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); -} - -////////////////////////////////////////////////////////////////////////////// -// -// Rasterizer - -typedef struct stbtt__hheap_chunk -{ - struct stbtt__hheap_chunk *next; -} stbtt__hheap_chunk; - -typedef struct stbtt__hheap -{ - struct stbtt__hheap_chunk *head; - void *first_free; - int num_remaining_in_head_chunk; -} stbtt__hheap; - -static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) -{ - if (hh->first_free) { - void *p = hh->first_free; - hh->first_free = * (void **) p; - return p; - } else { - if (hh->num_remaining_in_head_chunk == 0) { - int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); - stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); - if (c == NULL) - return NULL; - c->next = hh->head; - hh->head = c; - hh->num_remaining_in_head_chunk = count; - } - --hh->num_remaining_in_head_chunk; - return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; - } -} - -static void stbtt__hheap_free(stbtt__hheap *hh, void *p) -{ - *(void **) p = hh->first_free; - hh->first_free = p; -} - -static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) -{ - stbtt__hheap_chunk *c = hh->head; - while (c) { - stbtt__hheap_chunk *n = c->next; - STBTT_free(c, userdata); - c = n; - } -} - -typedef struct stbtt__edge { - float x0,y0, x1,y1; - int invert; -} stbtt__edge; - - -typedef struct stbtt__active_edge -{ - struct stbtt__active_edge *next; - #if STBTT_RASTERIZER_VERSION==1 - int x,dx; - float ey; - int direction; - #elif STBTT_RASTERIZER_VERSION==2 - float fx,fdx,fdy; - float direction; - float sy; - float ey; - #else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" - #endif -} stbtt__active_edge; - -#if STBTT_RASTERIZER_VERSION == 1 -#define STBTT_FIXSHIFT 10 -#define STBTT_FIX (1 << STBTT_FIXSHIFT) -#define STBTT_FIXMASK (STBTT_FIX-1) - -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - if (!z) return z; - - // round dx down to avoid overshooting - if (dxdy < 0) - z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); - else - z->dx = STBTT_ifloor(STBTT_FIX * dxdy); - - z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount - z->x -= off_x * STBTT_FIX; - - z->ey = e->y1; - z->next = 0; - z->direction = e->invert ? 1 : -1; - return z; -} -#elif STBTT_RASTERIZER_VERSION == 2 -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - //STBTT_assert(e->y0 <= start_point); - if (!z) return z; - z->fdx = dxdy; - z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; - z->fx = e->x0 + dxdy * (start_point - e->y0); - z->fx -= off_x; - z->direction = e->invert ? 1.0f : -1.0f; - z->sy = e->y0; - z->ey = e->y1; - z->next = 0; - return z; -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#if STBTT_RASTERIZER_VERSION == 1 -// note: this routine clips fills that extend off the edges... ideally this -// wouldn't happen, but it could happen if the truetype glyph bounding boxes -// are wrong, or if the user supplies a too-small bitmap -static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) -{ - // non-zero winding fill - int x0=0, w=0; - - while (e) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w += e->direction; - } else { - int x1 = e->x; w += e->direction; - // if we went to zero, we need to draw - if (w == 0) { - int i = x0 >> STBTT_FIXSHIFT; - int j = x1 >> STBTT_FIXSHIFT; - - if (i < len && j >= 0) { - if (i == j) { - // x0,x1 are the same pixel, so compute combined coverage - scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); - } else { - if (i >= 0) // add antialiasing for x0 - scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); - else - i = -1; // clip - - if (j < len) // add antialiasing for x1 - scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); - else - j = len; // clip - - for (++i; i < j; ++i) // fill pixels between x0 and x1 - scanline[i] = scanline[i] + (stbtt_uint8) max_weight; - } - } - } - } - - e = e->next; - } -} - -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0; - int max_weight = (255 / vsubsample); // weight per vertical scanline - int s; // vertical subsample index - unsigned char scanline_data[512], *scanline; - - if (result->w > 512) - scanline = (unsigned char *) STBTT_malloc(result->w, userdata); - else - scanline = scanline_data; - - y = off_y * vsubsample; - e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; - - while (j < result->h) { - STBTT_memset(scanline, 0, result->w); - for (s=0; s < vsubsample; ++s) { - // find center of pixel for this scanline - float scan_y = y + 0.5f; - stbtt__active_edge **step = &active; - - // update all active edges; - // remove all active edges that terminate before the center of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - z->x += z->dx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - } - - // resort the list if needed - for(;;) { - int changed=0; - step = &active; - while (*step && (*step)->next) { - if ((*step)->x > (*step)->next->x) { - stbtt__active_edge *t = *step; - stbtt__active_edge *q = t->next; - - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if (!changed) break; - } - - // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline - while (e->y0 <= scan_y) { - if (e->y1 > scan_y) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); - if (z != NULL) { - // find insertion point - if (active == NULL) - active = z; - else if (z->x < active->x) { - // insert at front - z->next = active; - active = z; - } else { - // find thing to insert AFTER - stbtt__active_edge *p = active; - while (p->next && p->next->x < z->x) - p = p->next; - // at this point, p->next->x is NOT < z->x - z->next = p->next; - p->next = z; - } - } - } - ++e; - } - - // now process all active edges in XOR fashion - if (active) - stbtt__fill_active_edges(scanline, result->w, active, max_weight); - - ++y; - } - STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} - -#elif STBTT_RASTERIZER_VERSION == 2 - -// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 -// (i.e. it has already been clipped to those) -static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) -{ - if (y0 == y1) return; - STBTT_assert(y0 < y1); - STBTT_assert(e->sy <= e->ey); - if (y0 > e->ey) return; - if (y1 < e->sy) return; - if (y0 < e->sy) { - x0 += (x1-x0) * (e->sy - y0) / (y1-y0); - y0 = e->sy; - } - if (y1 > e->ey) { - x1 += (x1-x0) * (e->ey - y1) / (y1-y0); - y1 = e->ey; - } - - if (x0 == x) - STBTT_assert(x1 <= x+1); - else if (x0 == x+1) - STBTT_assert(x1 >= x); - else if (x0 <= x) - STBTT_assert(x1 <= x); - else if (x0 >= x+1) - STBTT_assert(x1 >= x+1); - else - STBTT_assert(x1 >= x && x1 <= x+1); - - if (x0 <= x && x1 <= x) - scanline[x] += e->direction * (y1-y0); - else if (x0 >= x+1 && x1 >= x+1) - ; - else { - STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); - scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position - } -} - -static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) -{ - STBTT_assert(top_width >= 0); - STBTT_assert(bottom_width >= 0); - return (top_width + bottom_width) / 2.0f * height; -} - -static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) -{ - return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); -} - -static float stbtt__sized_triangle_area(float height, float width) -{ - return height * width / 2; -} - -static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) -{ - float y_bottom = y_top+1; - - while (e) { - // brute force every pixel - - // compute intersection points with top & bottom - STBTT_assert(e->ey >= y_top); - - if (e->fdx == 0) { - float x0 = e->fx; - if (x0 < len) { - if (x0 >= 0) { - stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); - stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); - } else { - stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); - } - } - } else { - float x0 = e->fx; - float dx = e->fdx; - float xb = x0 + dx; - float x_top, x_bottom; - float sy0,sy1; - float dy = e->fdy; - STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); - - // compute endpoints of line segment clipped to this scanline (if the - // line segment starts on this scanline. x0 is the intersection of the - // line with y_top, but that may be off the line segment. - if (e->sy > y_top) { - x_top = x0 + dx * (e->sy - y_top); - sy0 = e->sy; - } else { - x_top = x0; - sy0 = y_top; - } - if (e->ey < y_bottom) { - x_bottom = x0 + dx * (e->ey - y_top); - sy1 = e->ey; - } else { - x_bottom = xb; - sy1 = y_bottom; - } - - if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { - // from here on, we don't have to range check x values - - if ((int) x_top == (int) x_bottom) { - float height; - // simple case, only spans one pixel - int x = (int) x_top; - height = (sy1 - sy0) * e->direction; - STBTT_assert(x >= 0 && x < len); - scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f); - scanline_fill[x] += height; // everything right of this pixel is filled - } else { - int x,x1,x2; - float y_crossing, y_final, step, sign, area; - // covers 2+ pixels - if (x_top > x_bottom) { - // flip scanline vertically; signed area is the same - float t; - sy0 = y_bottom - (sy0 - y_top); - sy1 = y_bottom - (sy1 - y_top); - t = sy0, sy0 = sy1, sy1 = t; - t = x_bottom, x_bottom = x_top, x_top = t; - dx = -dx; - dy = -dy; - t = x0, x0 = xb, xb = t; - } - STBTT_assert(dy >= 0); - STBTT_assert(dx >= 0); - - x1 = (int) x_top; - x2 = (int) x_bottom; - // compute intersection with y axis at x1+1 - y_crossing = y_top + dy * (x1+1 - x0); - - // compute intersection with y axis at x2 - y_final = y_top + dy * (x2 - x0); - - // x1 x_top x2 x_bottom - // y_top +------|-----+------------+------------+--------|---+------------+ - // | | | | | | - // | | | | | | - // sy0 | Txxxxx|............|............|............|............| - // y_crossing | *xxxxx.......|............|............|............| - // | | xxxxx..|............|............|............| - // | | /- xx*xxxx........|............|............| - // | | dy < | xxxxxx..|............|............| - // y_final | | \- | xx*xxx.........|............| - // sy1 | | | | xxxxxB...|............| - // | | | | | | - // | | | | | | - // y_bottom +------------+------------+------------+------------+------------+ - // - // goal is to measure the area covered by '.' in each pixel - - // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 - // @TODO: maybe test against sy1 rather than y_bottom? - if (y_crossing > y_bottom) - y_crossing = y_bottom; - - sign = e->direction; - - // area of the rectangle covered from sy0..y_crossing - area = sign * (y_crossing-sy0); - - // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) - scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top); - - // check if final y_crossing is blown up; no test case for this - if (y_final > y_bottom) { - int denom = (x2 - (x1+1)); - y_final = y_bottom; - if (denom != 0) { // [DEAR IMGUI] Avoid div by zero (https://github.com/nothings/stb/issues/1316) - dy = (y_final - y_crossing ) / denom; // if denom=0, y_final = y_crossing, so y_final <= y_bottom - } - } - - // in second pixel, area covered by line segment found in first pixel - // is always a rectangle 1 wide * the height of that line segment; this - // is exactly what the variable 'area' stores. it also gets a contribution - // from the line segment within it. the THIRD pixel will get the first - // pixel's rectangle contribution, the second pixel's rectangle contribution, - // and its own contribution. the 'own contribution' is the same in every pixel except - // the leftmost and rightmost, a trapezoid that slides down in each pixel. - // the second pixel's contribution to the third pixel will be the - // rectangle 1 wide times the height change in the second pixel, which is dy. - - step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, - // which multiplied by 1-pixel-width is how much pixel area changes for each step in x - // so the area advances by 'step' every time - - for (x = x1+1; x < x2; ++x) { - scanline[x] += area + step/2; // area of trapezoid is 1*step/2 - area += step; - } - STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down - STBTT_assert(sy1 > y_final-0.01f); - - // area covered in the last pixel is the rectangle from all the pixels to the left, - // plus the trapezoid filled by the line segment in this pixel all the way to the right edge - scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f); - - // the rest of the line is filled based on the total height of the line segment in this pixel - scanline_fill[x2] += sign * (sy1-sy0); - } - } else { - // if edge goes outside of box we're drawing, we require - // clipping logic. since this does not match the intended use - // of this library, we use a different, very slow brute - // force implementation - // note though that this does happen some of the time because - // x_top and x_bottom can be extrapolated at the top & bottom of - // the shape and actually lie outside the bounding box - int x; - for (x=0; x < len; ++x) { - // cases: - // - // there can be up to two intersections with the pixel. any intersection - // with left or right edges can be handled by splitting into two (or three) - // regions. intersections with top & bottom do not necessitate case-wise logic. - // - // the old way of doing this found the intersections with the left & right edges, - // then used some simple logic to produce up to three segments in sorted order - // from top-to-bottom. however, this had a problem: if an x edge was epsilon - // across the x border, then the corresponding y position might not be distinct - // from the other y segment, and it might ignored as an empty segment. to avoid - // that, we need to explicitly produce segments based on x positions. - - // rename variables to clearly-defined pairs - float y0 = y_top; - float x1 = (float) (x); - float x2 = (float) (x+1); - float x3 = xb; - float y3 = y_bottom; - - // x = e->x + e->dx * (y-y_top) - // (y-y_top) = (x - e->x) / e->dx - // y = (x - e->x) / e->dx + y_top - float y1 = (x - x0) / dx + y_top; - float y2 = (x+1 - x0) / dx + y_top; - - if (x0 < x1 && x3 > x2) { // three segments descending down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x1 && x0 > x2) { // three segments descending down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else { // one segment - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); - } - } - } - } - e = e->next; - } -} - -// directly AA rasterize edges w/o supersampling -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0, i; - float scanline_data[129], *scanline, *scanline2; - - STBTT__NOTUSED(vsubsample); - - if (result->w > 64) - scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); - else - scanline = scanline_data; - - scanline2 = scanline + result->w; - - y = off_y; - e[n].y0 = (float) (off_y + result->h) + 1; - - while (j < result->h) { - // find center of pixel for this scanline - float scan_y_top = y + 0.0f; - float scan_y_bottom = y + 1.0f; - stbtt__active_edge **step = &active; - - STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); - STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); - - // update all active edges; - // remove all active edges that terminate before the top of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y_top) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - step = &((*step)->next); // advance through list - } - } - - // insert all edges that start before the bottom of this scanline - while (e->y0 <= scan_y_bottom) { - if (e->y0 != e->y1) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); - if (z != NULL) { - if (j == 0 && off_y != 0) { - if (z->ey < scan_y_top) { - // this can happen due to subpixel positioning and some kind of fp rounding error i think - z->ey = scan_y_top; - } - } - STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds - // insert at front - z->next = active; - active = z; - } - } - ++e; - } - - // now process all active edges - if (active) - stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); - - { - float sum = 0; - for (i=0; i < result->w; ++i) { - float k; - int m; - sum += scanline2[i]; - k = scanline[i] + sum; - k = (float) STBTT_fabs(k)*255 + 0.5f; - m = (int) k; - if (m > 255) m = 255; - result->pixels[j*result->stride + i] = (unsigned char) m; - } - } - // advance all the edges - step = &active; - while (*step) { - stbtt__active_edge *z = *step; - z->fx += z->fdx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - - ++y; - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) - -static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) -{ - int i,j; - for (i=1; i < n; ++i) { - stbtt__edge t = p[i], *a = &t; - j = i; - while (j > 0) { - stbtt__edge *b = &p[j-1]; - int c = STBTT__COMPARE(a,b); - if (!c) break; - p[j] = p[j-1]; - --j; - } - if (i != j) - p[j] = t; - } -} - -static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) -{ - /* threshold for transitioning to insertion sort */ - while (n > 12) { - stbtt__edge t; - int c01,c12,c,m,i,j; - - /* compute median of three */ - m = n >> 1; - c01 = STBTT__COMPARE(&p[0],&p[m]); - c12 = STBTT__COMPARE(&p[m],&p[n-1]); - /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ - if (c01 != c12) { - /* otherwise, we'll need to swap something else to middle */ - int z; - c = STBTT__COMPARE(&p[0],&p[n-1]); - /* 0>mid && midn => n; 0 0 */ - /* 0n: 0>n => 0; 0 n */ - z = (c == c12) ? 0 : n-1; - t = p[z]; - p[z] = p[m]; - p[m] = t; - } - /* now p[m] is the median-of-three */ - /* swap it to the beginning so it won't move around */ - t = p[0]; - p[0] = p[m]; - p[m] = t; - - /* partition loop */ - i=1; - j=n-1; - for(;;) { - /* handling of equality is crucial here */ - /* for sentinels & efficiency with duplicates */ - for (;;++i) { - if (!STBTT__COMPARE(&p[i], &p[0])) break; - } - for (;;--j) { - if (!STBTT__COMPARE(&p[0], &p[j])) break; - } - /* make sure we haven't crossed */ - if (i >= j) break; - t = p[i]; - p[i] = p[j]; - p[j] = t; - - ++i; - --j; - } - /* recurse on smaller side, iterate on larger */ - if (j < (n-i)) { - stbtt__sort_edges_quicksort(p,j); - p = p+i; - n = n-i; - } else { - stbtt__sort_edges_quicksort(p+i, n-i); - n = j; - } - } -} - -static void stbtt__sort_edges(stbtt__edge *p, int n) -{ - stbtt__sort_edges_quicksort(p, n); - stbtt__sort_edges_ins_sort(p, n); -} - -typedef struct -{ - float x,y; -} stbtt__point; - -static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) -{ - float y_scale_inv = invert ? -scale_y : scale_y; - stbtt__edge *e; - int n,i,j,k,m; -#if STBTT_RASTERIZER_VERSION == 1 - int vsubsample = result->h < 8 ? 15 : 5; -#elif STBTT_RASTERIZER_VERSION == 2 - int vsubsample = 1; -#else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - // vsubsample should divide 255 evenly; otherwise we won't reach full opacity - - // now we have to blow out the windings into explicit edge lists - n = 0; - for (i=0; i < windings; ++i) - n += wcount[i]; - - e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel - if (e == 0) return; - n = 0; - - m=0; - for (i=0; i < windings; ++i) { - stbtt__point *p = pts + m; - m += wcount[i]; - j = wcount[i]-1; - for (k=0; k < wcount[i]; j=k++) { - int a=k,b=j; - // skip the edge if horizontal - if (p[j].y == p[k].y) - continue; - // add edge from j to k to the list - e[n].invert = 0; - if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { - e[n].invert = 1; - a=j,b=k; - } - e[n].x0 = p[a].x * scale_x + shift_x; - e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; - e[n].x1 = p[b].x * scale_x + shift_x; - e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; - ++n; - } - } - - // now sort the edges by their highest point (should snap to integer, and then by x) - //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); - stbtt__sort_edges(e, n); - - // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule - stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); - - STBTT_free(e, userdata); -} - -static void stbtt__add_point(stbtt__point *points, int n, float x, float y) -{ - if (!points) return; // during first pass, it's unallocated - points[n].x = x; - points[n].y = y; -} - -// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching -static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) -{ - // midpoint - float mx = (x0 + 2*x1 + x2)/4; - float my = (y0 + 2*y1 + y2)/4; - // versus directly drawn line - float dx = (x0+x2)/2 - mx; - float dy = (y0+y2)/2 - my; - if (n > 16) // 65536 segments on one curve better be enough! - return 1; - if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA - stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x2,y2); - *num_points = *num_points+1; - } - return 1; -} - -static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) -{ - // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough - float dx0 = x1-x0; - float dy0 = y1-y0; - float dx1 = x2-x1; - float dy1 = y2-y1; - float dx2 = x3-x2; - float dy2 = y3-y2; - float dx = x3-x0; - float dy = y3-y0; - float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); - float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); - float flatness_squared = longlen*longlen-shortlen*shortlen; - - if (n > 16) // 65536 segments on one curve better be enough! - return; - - if (flatness_squared > objspace_flatness_squared) { - float x01 = (x0+x1)/2; - float y01 = (y0+y1)/2; - float x12 = (x1+x2)/2; - float y12 = (y1+y2)/2; - float x23 = (x2+x3)/2; - float y23 = (y2+y3)/2; - - float xa = (x01+x12)/2; - float ya = (y01+y12)/2; - float xb = (x12+x23)/2; - float yb = (y12+y23)/2; - - float mx = (xa+xb)/2; - float my = (ya+yb)/2; - - stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x3,y3); - *num_points = *num_points+1; - } -} - -// returns number of contours -static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) -{ - stbtt__point *points=0; - int num_points=0; - - float objspace_flatness_squared = objspace_flatness * objspace_flatness; - int i,n=0,start=0, pass; - - // count how many "moves" there are to get the contour count - for (i=0; i < num_verts; ++i) - if (vertices[i].type == STBTT_vmove) - ++n; - - *num_contours = n; - if (n == 0) return 0; - - *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); - - if (*contour_lengths == 0) { - *num_contours = 0; - return 0; - } - - // make two passes through the points so we don't need to realloc - for (pass=0; pass < 2; ++pass) { - float x=0,y=0; - if (pass == 1) { - points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); - if (points == NULL) goto error; - } - num_points = 0; - n= -1; - for (i=0; i < num_verts; ++i) { - switch (vertices[i].type) { - case STBTT_vmove: - // start the next contour - if (n >= 0) - (*contour_lengths)[n] = num_points - start; - ++n; - start = num_points; - - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x,y); - break; - case STBTT_vline: - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x, y); - break; - case STBTT_vcurve: - stbtt__tesselate_curve(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - case STBTT_vcubic: - stbtt__tesselate_cubic(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].cx1, vertices[i].cy1, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - } - } - (*contour_lengths)[n] = num_points - start; - } - - return points; -error: - STBTT_free(points, userdata); - STBTT_free(*contour_lengths, userdata); - *contour_lengths = 0; - *num_contours = 0; - return NULL; -} - -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) -{ - float scale = scale_x > scale_y ? scale_y : scale_x; - int winding_count = 0; - int *winding_lengths = NULL; - stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); - if (windings) { - stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); - STBTT_free(winding_lengths, userdata); - STBTT_free(windings, userdata); - } -} - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - int ix0,iy0,ix1,iy1; - stbtt__bitmap gbm; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - - if (scale_x == 0) scale_x = scale_y; - if (scale_y == 0) { - if (scale_x == 0) { - STBTT_free(vertices, info->userdata); - return NULL; - } - scale_y = scale_x; - } - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); - - // now we get the size - gbm.w = (ix1 - ix0); - gbm.h = (iy1 - iy0); - gbm.pixels = NULL; // in case we error - - if (width ) *width = gbm.w; - if (height) *height = gbm.h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - if (gbm.w && gbm.h) { - gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); - if (gbm.pixels) { - gbm.stride = gbm.w; - - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); - } - } - STBTT_free(vertices, info->userdata); - return gbm.pixels; -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) -{ - int ix0,iy0; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - stbtt__bitmap gbm; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); - gbm.pixels = output; - gbm.w = out_w; - gbm.h = out_h; - gbm.stride = out_stride; - - if (gbm.w && gbm.h) - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); - - STBTT_free(vertices, info->userdata); -} - -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) -{ - stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); -} - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-CRAPPY packing to keep source code small - -static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata) -{ - float scale; - int x,y,bottom_y, i; - stbtt_fontinfo f; - f.userdata = NULL; - if (!stbtt_InitFont(&f, data, offset)) - return -1; - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - x=y=1; - bottom_y = 1; - - scale = stbtt_ScaleForPixelHeight(&f, pixel_height); - - for (i=0; i < num_chars; ++i) { - int advance, lsb, x0,y0,x1,y1,gw,gh; - int g = stbtt_FindGlyphIndex(&f, first_char + i); - stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); - stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); - gw = x1-x0; - gh = y1-y0; - if (x + gw + 1 >= pw) - y = bottom_y, x = 1; // advance to next row - if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row - return -i; - STBTT_assert(x+gw < pw); - STBTT_assert(y+gh < ph); - stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); - chardata[i].x0 = (stbtt_int16) x; - chardata[i].y0 = (stbtt_int16) y; - chardata[i].x1 = (stbtt_int16) (x + gw); - chardata[i].y1 = (stbtt_int16) (y + gh); - chardata[i].xadvance = scale * advance; - chardata[i].xoff = (float) x0; - chardata[i].yoff = (float) y0; - x = x + gw + 1; - if (y+gh+1 > bottom_y) - bottom_y = y+gh+1; - } - return bottom_y; -} - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) -{ - float d3d_bias = opengl_fillrule ? 0 : -0.5f; - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_bakedchar *b = chardata + char_index; - int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); - int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); - - q->x0 = round_x + d3d_bias; - q->y0 = round_y + d3d_bias; - q->x1 = round_x + b->x1 - b->x0 + d3d_bias; - q->y1 = round_y + b->y1 - b->y0 + d3d_bias; - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// rectangle packing replacement routines if you don't have stb_rect_pack.h -// - -#ifndef STB_RECT_PACK_VERSION - -typedef int stbrp_coord; - -//////////////////////////////////////////////////////////////////////////////////// -// // -// // -// COMPILER WARNING ?!?!? // -// // -// // -// if you get a compile warning due to these symbols being defined more than // -// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // -// // -//////////////////////////////////////////////////////////////////////////////////// - -typedef struct -{ - int width,height; - int x,y,bottom_y; -} stbrp_context; - -typedef struct -{ - unsigned char x; -} stbrp_node; - -struct stbrp_rect -{ - stbrp_coord x,y; - int id,w,h,was_packed; -}; - -static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) -{ - con->width = pw; - con->height = ph; - con->x = 0; - con->y = 0; - con->bottom_y = 0; - STBTT__NOTUSED(nodes); - STBTT__NOTUSED(num_nodes); -} - -static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) -{ - int i; - for (i=0; i < num_rects; ++i) { - if (con->x + rects[i].w > con->width) { - con->x = 0; - con->y = con->bottom_y; - } - if (con->y + rects[i].h > con->height) - break; - rects[i].x = con->x; - rects[i].y = con->y; - rects[i].was_packed = 1; - con->x += rects[i].w; - if (con->y + rects[i].h > con->bottom_y) - con->bottom_y = con->y + rects[i].h; - } - for ( ; i < num_rects; ++i) - rects[i].was_packed = 0; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If -// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) -{ - stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); - int num_nodes = pw - padding; - stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); - - if (context == NULL || nodes == NULL) { - if (context != NULL) STBTT_free(context, alloc_context); - if (nodes != NULL) STBTT_free(nodes , alloc_context); - return 0; - } - - spc->user_allocator_context = alloc_context; - spc->width = pw; - spc->height = ph; - spc->pixels = pixels; - spc->pack_info = context; - spc->nodes = nodes; - spc->padding = padding; - spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; - spc->h_oversample = 1; - spc->v_oversample = 1; - spc->skip_missing = 0; - - stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); - - if (pixels) - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - - return 1; -} - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) -{ - STBTT_free(spc->nodes , spc->user_allocator_context); - STBTT_free(spc->pack_info, spc->user_allocator_context); -} - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) -{ - STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); - STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); - if (h_oversample <= STBTT_MAX_OVERSAMPLE) - spc->h_oversample = h_oversample; - if (v_oversample <= STBTT_MAX_OVERSAMPLE) - spc->v_oversample = v_oversample; -} - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) -{ - spc->skip_missing = skip; -} - -#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) - -static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_w = w - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < h; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < w; ++i) { - STBTT_assert(pixels[i] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i] = (unsigned char) (total / kernel_width); - } - - pixels += stride_in_bytes; - } -} - -static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_h = h - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < w; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < h; ++i) { - STBTT_assert(pixels[i*stride_in_bytes] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - - pixels += 1; - } -} - -static float stbtt__oversample_shift(int oversample) -{ - if (!oversample) - return 0.0f; - - // The prefilter is a box filter of width "oversample", - // which shifts phase by (oversample - 1)/2 pixels in - // oversampled space. We want to shift in the opposite - // direction to counter this. - return (float)-(oversample - 1) / (2.0f * (float)oversample); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k; - int missing_glyph_added = 0; - - k=0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - ranges[i].h_oversample = (unsigned char) spc->h_oversample; - ranges[i].v_oversample = (unsigned char) spc->v_oversample; - for (j=0; j < ranges[i].num_chars; ++j) { - int x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { - rects[k].w = rects[k].h = 0; - } else { - stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - &x0,&y0,&x1,&y1); - rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); - rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); - if (glyph == 0) - missing_glyph_added = 1; - } - ++k; - } - } - - return k; -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, - output, - out_w - (prefilter_x - 1), - out_h - (prefilter_y - 1), - out_stride, - scale_x, - scale_y, - shift_x, - shift_y, - glyph); - - if (prefilter_x > 1) - stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); - - if (prefilter_y > 1) - stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); - - *sub_x = stbtt__oversample_shift(prefilter_x); - *sub_y = stbtt__oversample_shift(prefilter_y); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k, missing_glyph = -1, return_value = 1; - - // save current values - int old_h_over = spc->h_oversample; - int old_v_over = spc->v_oversample; - - k = 0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - float recip_h,recip_v,sub_x,sub_y; - spc->h_oversample = ranges[i].h_oversample; - spc->v_oversample = ranges[i].v_oversample; - recip_h = 1.0f / spc->h_oversample; - recip_v = 1.0f / spc->v_oversample; - sub_x = stbtt__oversample_shift(spc->h_oversample); - sub_y = stbtt__oversample_shift(spc->v_oversample); - for (j=0; j < ranges[i].num_chars; ++j) { - stbrp_rect *r = &rects[k]; - if (r->was_packed && r->w != 0 && r->h != 0) { - stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; - int advance, lsb, x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - stbrp_coord pad = (stbrp_coord) spc->padding; - - // pad on left and top - r->x += pad; - r->y += pad; - r->w -= pad; - r->h -= pad; - stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); - stbtt_GetGlyphBitmapBox(info, glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - &x0,&y0,&x1,&y1); - stbtt_MakeGlyphBitmapSubpixel(info, - spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w - spc->h_oversample+1, - r->h - spc->v_oversample+1, - spc->stride_in_bytes, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - glyph); - - if (spc->h_oversample > 1) - stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->h_oversample); - - if (spc->v_oversample > 1) - stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->v_oversample); - - bc->x0 = (stbtt_int16) r->x; - bc->y0 = (stbtt_int16) r->y; - bc->x1 = (stbtt_int16) (r->x + r->w); - bc->y1 = (stbtt_int16) (r->y + r->h); - bc->xadvance = scale * advance; - bc->xoff = (float) x0 * recip_h + sub_x; - bc->yoff = (float) y0 * recip_v + sub_y; - bc->xoff2 = (x0 + r->w) * recip_h + sub_x; - bc->yoff2 = (y0 + r->h) * recip_v + sub_y; - - if (glyph == 0) - missing_glyph = j; - } else if (spc->skip_missing) { - return_value = 0; - } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { - ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; - } else { - return_value = 0; // if any fail, report failure - } - - ++k; - } - } - - // restore original values - spc->h_oversample = old_h_over; - spc->v_oversample = old_v_over; - - return return_value; -} - -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) -{ - stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); -} - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) -{ - stbtt_fontinfo info; - int i, j, n, return_value; // [DEAR IMGUI] removed = 1; - //stbrp_context *context = (stbrp_context *) spc->pack_info; - stbrp_rect *rects; - - // flag all characters as NOT packed - for (i=0; i < num_ranges; ++i) - for (j=0; j < ranges[i].num_chars; ++j) - ranges[i].chardata_for_range[j].x0 = - ranges[i].chardata_for_range[j].y0 = - ranges[i].chardata_for_range[j].x1 = - ranges[i].chardata_for_range[j].y1 = 0; - - n = 0; - for (i=0; i < num_ranges; ++i) - n += ranges[i].num_chars; - - rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); - if (rects == NULL) - return 0; - - info.userdata = spc->user_allocator_context; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); - - n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); - - stbtt_PackFontRangesPackRects(spc, rects, n); - - return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); - - STBTT_free(rects, spc->user_allocator_context); - return return_value; -} - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) -{ - stbtt_pack_range range; - range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; - range.array_of_unicode_codepoints = NULL; - range.num_chars = num_chars_in_range; - range.chardata_for_range = chardata_for_range; - range.font_size = font_size; - return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); -} - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) -{ - int i_ascent, i_descent, i_lineGap; - float scale; - stbtt_fontinfo info; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); - scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); - stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); - *ascent = (float) i_ascent * scale; - *descent = (float) i_descent * scale; - *lineGap = (float) i_lineGap * scale; -} - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) -{ - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_packedchar *b = chardata + char_index; - - if (align_to_integer) { - float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); - float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); - q->x0 = x; - q->y0 = y; - q->x1 = x + b->xoff2 - b->xoff; - q->y1 = y + b->yoff2 - b->yoff; - } else { - q->x0 = *xpos + b->xoff; - q->y0 = *ypos + b->yoff; - q->x1 = *xpos + b->xoff2; - q->y1 = *ypos + b->yoff2; - } - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// sdf computation -// - -#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) -#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) - -static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) -{ - float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; - float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; - float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; - float roperp = orig[1]*ray[0] - orig[0]*ray[1]; - - float a = q0perp - 2*q1perp + q2perp; - float b = q1perp - q0perp; - float c = q0perp - roperp; - - float s0 = 0., s1 = 0.; - int num_s = 0; - - if (a != 0.0) { - float discr = b*b - a*c; - if (discr > 0.0) { - float rcpna = -1 / a; - float d = (float) STBTT_sqrt(discr); - s0 = (b+d) * rcpna; - s1 = (b-d) * rcpna; - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { - if (num_s == 0) s0 = s1; - ++num_s; - } - } - } else { - // 2*b*s + c = 0 - // s = -c / (2*b) - s0 = c / (-2 * b); - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - } - - if (num_s == 0) - return 0; - else { - float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); - float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; - - float q0d = q0[0]*rayn_x + q0[1]*rayn_y; - float q1d = q1[0]*rayn_x + q1[1]*rayn_y; - float q2d = q2[0]*rayn_x + q2[1]*rayn_y; - float rod = orig[0]*rayn_x + orig[1]*rayn_y; - - float q10d = q1d - q0d; - float q20d = q2d - q0d; - float q0rd = q0d - rod; - - hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; - hits[0][1] = a*s0+b; - - if (num_s > 1) { - hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; - hits[1][1] = a*s1+b; - return 2; - } else { - return 1; - } - } -} - -static int equal(float *a, float *b) -{ - return (a[0] == b[0] && a[1] == b[1]); -} - -static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) -{ - int i; - float orig[2], ray[2] = { 1, 0 }; - float y_frac; - int winding = 0; - - // make sure y never passes through a vertex of the shape - y_frac = (float) STBTT_fmod(y, 1.0f); - if (y_frac < 0.01f) - y += 0.01f; - else if (y_frac > 0.99f) - y -= 0.01f; - - orig[0] = x; - orig[1] = y; - - // test a ray from (-infinity,y) to (x,y) - for (i=0; i < nverts; ++i) { - if (verts[i].type == STBTT_vline) { - int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; - int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } - if (verts[i].type == STBTT_vcurve) { - int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; - int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; - int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; - int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); - int by = STBTT_max(y0,STBTT_max(y1,y2)); - if (y > ay && y < by && x > ax) { - float q0[2],q1[2],q2[2]; - float hits[2][2]; - q0[0] = (float)x0; - q0[1] = (float)y0; - q1[0] = (float)x1; - q1[1] = (float)y1; - q2[0] = (float)x2; - q2[1] = (float)y2; - if (equal(q0,q1) || equal(q1,q2)) { - x0 = (int)verts[i-1].x; - y0 = (int)verts[i-1].y; - x1 = (int)verts[i ].x; - y1 = (int)verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } else { - int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); - if (num_hits >= 1) - if (hits[0][0] < 0) - winding += (hits[0][1] < 0 ? -1 : 1); - if (num_hits >= 2) - if (hits[1][0] < 0) - winding += (hits[1][1] < 0 ? -1 : 1); - } - } - } - } - return winding; -} - -static float stbtt__cuberoot( float x ) -{ - if (x<0) - return -(float) STBTT_pow(-x,1.0f/3.0f); - else - return (float) STBTT_pow( x,1.0f/3.0f); -} - -// x^3 + a*x^2 + b*x + c = 0 -static int stbtt__solve_cubic(float a, float b, float c, float* r) -{ - float s = -a / 3; - float p = b - a*a / 3; - float q = a * (2*a*a - 9*b) / 27 + c; - float p3 = p*p*p; - float d = q*q + 4*p3 / 27; - if (d >= 0) { - float z = (float) STBTT_sqrt(d); - float u = (-q + z) / 2; - float v = (-q - z) / 2; - u = stbtt__cuberoot(u); - v = stbtt__cuberoot(v); - r[0] = s + u + v; - return 1; - } else { - float u = (float) STBTT_sqrt(-p/3); - float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative - float m = (float) STBTT_cos(v); - float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; - r[0] = s + u * 2 * m; - r[1] = s - u * (m + n); - r[2] = s - u * (m - n); - - //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? - //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); - //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); - return 3; - } -} - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - float scale_x = scale, scale_y = scale; - int ix0,iy0,ix1,iy1; - int w,h; - unsigned char *data; - - if (scale == 0) return NULL; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); - - // if empty, return NULL - if (ix0 == ix1 || iy0 == iy1) - return NULL; - - ix0 -= padding; - iy0 -= padding; - ix1 += padding; - iy1 += padding; - - w = (ix1 - ix0); - h = (iy1 - iy0); - - if (width ) *width = w; - if (height) *height = h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - // invert for y-downwards bitmaps - scale_y = -scale_y; - - { - int x,y,i,j; - float *precompute; - stbtt_vertex *verts; - int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); - data = (unsigned char *) STBTT_malloc(w * h, info->userdata); - precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); - - for (i=0,j=num_verts-1; i < num_verts; j=i++) { - if (verts[i].type == STBTT_vline) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; - float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); - precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; - float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; - float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float len2 = bx*bx + by*by; - if (len2 != 0.0f) - precompute[i] = 1.0f / (bx*bx + by*by); - else - precompute[i] = 0.0f; - } else - precompute[i] = 0.0f; - } - - for (y=iy0; y < iy1; ++y) { - for (x=ix0; x < ix1; ++x) { - float val; - float min_dist = 999999.0f; - float sx = (float) x + 0.5f; - float sy = (float) y + 0.5f; - float x_gspace = (sx / scale_x); - float y_gspace = (sy / scale_y); - - int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path - - for (i=0; i < num_verts; ++i) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - - if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) { - float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; - - float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - // coarse culling against bbox - //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && - // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) - dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; - STBTT_assert(i != 0); - if (dist < min_dist) { - // check position along line - // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) - // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) - float dx = x1-x0, dy = y1-y0; - float px = x0-sx, py = y0-sy; - // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy - // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve - float t = -(px*dx + py*dy) / (dx*dx + dy*dy); - if (t >= 0.0f && t <= 1.0f) - min_dist = dist; - } - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; - float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; - float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); - float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); - float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); - float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); - // coarse culling against bbox to avoid computing cubic unnecessarily - if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { - int num=0; - float ax = x1-x0, ay = y1-y0; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float mx = x0 - sx, my = y0 - sy; - float res[3] = {0.f,0.f,0.f}; - float px,py,t,it,dist2; - float a_inv = precompute[i]; - if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula - float a = 3*(ax*bx + ay*by); - float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); - float c = mx*ax+my*ay; - if (a == 0.0) { // if a is 0, it's linear - if (b != 0.0) { - res[num++] = -c/b; - } - } else { - float discriminant = b*b - 4*a*c; - if (discriminant < 0) - num = 0; - else { - float root = (float) STBTT_sqrt(discriminant); - res[0] = (-b - root)/(2*a); - res[1] = (-b + root)/(2*a); - num = 2; // don't bother distinguishing 1-solution case, as code below will still work - } - } - } else { - float b = 3*(ax*bx + ay*by) * a_inv; // could precompute this as it doesn't depend on sample point - float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; - float d = (mx*ax+my*ay) * a_inv; - num = stbtt__solve_cubic(b, c, d, res); - } - dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { - t = res[0], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { - t = res[1], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { - t = res[2], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - } - } - } - if (winding == 0) - min_dist = -min_dist; // if outside the shape, value is negative - val = onedge_value + pixel_dist_scale * min_dist; - if (val < 0) - val = 0; - else if (val > 255) - val = 255; - data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; - } - } - STBTT_free(precompute, info->userdata); - STBTT_free(verts, info->userdata); - } - return data; -} - -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -////////////////////////////////////////////////////////////////////////////// -// -// font name matching -- recommended not to use this -// - -// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string -static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) -{ - stbtt_int32 i=0; - - // convert utf16 to utf8 and compare the results while converting - while (len2) { - stbtt_uint16 ch = s2[0]*256 + s2[1]; - if (ch < 0x80) { - if (i >= len1) return -1; - if (s1[i++] != ch) return -1; - } else if (ch < 0x800) { - if (i+1 >= len1) return -1; - if (s1[i++] != 0xc0 + (ch >> 6)) return -1; - if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; - } else if (ch >= 0xd800 && ch < 0xdc00) { - stbtt_uint32 c; - stbtt_uint16 ch2 = s2[2]*256 + s2[3]; - if (i+3 >= len1) return -1; - c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; - if (s1[i++] != 0xf0 + (c >> 18)) return -1; - if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; - s2 += 2; // plus another 2 below - len2 -= 2; - } else if (ch >= 0xdc00 && ch < 0xe000) { - return -1; - } else { - if (i+2 >= len1) return -1; - if (s1[i++] != 0xe0 + (ch >> 12)) return -1; - if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; - } - s2 += 2; - len2 -= 2; - } - return i; -} - -static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) -{ - return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); -} - -// returns results in whatever encoding you request... but note that 2-byte encodings -// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) -{ - stbtt_int32 i,count,stringOffset; - stbtt_uint8 *fc = font->data; - stbtt_uint32 offset = font->fontstart; - stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return NULL; - - count = ttUSHORT(fc+nm+2); - stringOffset = nm + ttUSHORT(fc+nm+4); - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) - && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { - *length = ttUSHORT(fc+loc+8); - return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); - } - } - return NULL; -} - -static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) -{ - stbtt_int32 i; - stbtt_int32 count = ttUSHORT(fc+nm+2); - stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); - - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - stbtt_int32 id = ttUSHORT(fc+loc+6); - if (id == target_id) { - // find the encoding - stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); - - // is this a Unicode encoding? - if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { - stbtt_int32 slen = ttUSHORT(fc+loc+8); - stbtt_int32 off = ttUSHORT(fc+loc+10); - - // check if there's a prefix match - stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); - if (matchlen >= 0) { - // check for target_id+1 immediately following, with same encoding & language - if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { - slen = ttUSHORT(fc+loc+12+8); - off = ttUSHORT(fc+loc+12+10); - if (slen == 0) { - if (matchlen == nlen) - return 1; - } else if (matchlen < nlen && name[matchlen] == ' ') { - ++matchlen; - if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) - return 1; - } - } else { - // if nothing immediately following - if (matchlen == nlen) - return 1; - } - } - } - - // @TODO handle other encodings - } - } - return 0; -} - -static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) -{ - stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); - stbtt_uint32 nm,hd; - if (!stbtt__isfont(fc+offset)) return 0; - - // check italics/bold/underline flags in macStyle... - if (flags) { - hd = stbtt__find_table(fc, offset, "head"); - if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; - } - - nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return 0; - - if (flags) { - // if we checked the macStyle flags, then just check the family and ignore the subfamily - if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } else { - if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } - - return 0; -} - -static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) -{ - stbtt_int32 i; - for (i=0;;++i) { - stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); - if (off < 0) return off; - if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) - return off; - } -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, - float pixel_height, unsigned char *pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar *chardata) -{ - return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); -} - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) -{ - return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); -} - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) -{ - return stbtt_GetNumberOfFonts_internal((unsigned char *) data); -} - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) -{ - return stbtt_InitFont_internal(info, (unsigned char *) data, offset); -} - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) -{ - return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); -} - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) -{ - return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#endif // STB_TRUETYPE_IMPLEMENTATION - - -// FULL VERSION HISTORY -// -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) allow user-defined fabs() replacement -// fix memory leak if fontsize=0.0 -// fix warning from duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// allow PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) -// also more precise AA rasterizer, except if shapes overlap -// remove need for STBTT_sort -// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC -// 1.04 (2015-04-15) typo in example -// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes -// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ -// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match -// non-oversampled; STBTT_POINT_SIZE for packed case only -// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling -// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) -// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID -// 0.8b (2014-07-07) fix a warning -// 0.8 (2014-05-25) fix a few more warnings -// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back -// 0.6c (2012-07-24) improve documentation -// 0.6b (2012-07-20) fix a few more warnings -// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, -// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty -// 0.5 (2011-12-09) bugfixes: -// subpixel glyph renderer computed wrong bounding box -// first vertex of shape can be off-curve (FreeSans) -// 0.4b (2011-12-03) fixed an error in the font baking example -// 0.4 (2011-12-01) kerning, subpixel rendering (tor) -// bugfixes for: -// codepoint-to-glyph conversion using table fmt=12 -// codepoint-to-glyph conversion using table fmt=4 -// stbtt_GetBakedQuad with non-square texture (Zer) -// updated Hello World! sample to use kerning and subpixel -// fixed some warnings -// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) -// userdata, malloc-from-userdata, non-zero fill (stb) -// 0.2 (2009-03-11) Fix unsigned/signed char warnings -// 0.1 (2009-03-09) First public release -// - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -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. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -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 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. ------------------------------------------------------------------------------- -*/ diff --git a/dependencies/reboot/vendor/Images/reboot_icon.h b/dependencies/reboot/vendor/Images/reboot_icon.h deleted file mode 100644 index d0ae317..0000000 --- a/dependencies/reboot/vendor/Images/reboot_icon.h +++ /dev/null @@ -1,1263 +0,0 @@ -/* F:\Fortnite\Seasons\Fortnite 8.51\FortniteGame\Binaries\Win64\Reboot Resources\images\reboot.ico (7/27/2022 10:26:15 PM) - StartOffset(h): 00000000, EndOffset(h): 00003AED, Length(h): 00003AEE */ - -static inline unsigned char reboot_icon_data[15086] = { - 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x30, 0x30, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0xA8, 0x25, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x20, 0x20, - 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10, 0x00, 0x00, 0xDE, 0x25, - 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x68, 0x04, - 0x00, 0x00, 0x86, 0x36, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD7, 0xD7, 0x01, 0x01, 0xD9, 0xD9, 0x30, 0x0A, 0xE3, 0xE3, - 0x59, 0x1A, 0xDD, 0xDD, 0x5F, 0x2B, 0xD6, 0xD3, 0x60, 0x33, 0xBB, 0xB4, - 0x35, 0x45, 0xAF, 0xA7, 0x13, 0x4A, 0xA3, 0x98, 0x04, 0x2D, 0x80, 0x70, - 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xAA, 0xA2, 0x15, 0x10, 0xCF, 0xCD, 0x3E, 0x3A, 0xE5, 0xE5, - 0x78, 0x5F, 0xF0, 0xF0, 0x95, 0x8E, 0xEF, 0xEF, 0x7E, 0xBE, 0xEA, 0xEA, - 0x73, 0xDA, 0xE6, 0xE6, 0x6F, 0xEA, 0xE5, 0xE5, 0x6B, 0xF0, 0xE1, 0xE0, - 0x5F, 0xF8, 0xE0, 0xDF, 0x59, 0xFA, 0xDA, 0xD8, 0x5F, 0xEA, 0xD5, 0xD2, - 0x5F, 0xC6, 0xD2, 0xCF, 0x51, 0x80, 0xCF, 0xCE, 0x3D, 0x33, 0xBF, 0xBF, - 0x39, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xCC, 0x4B, 0x09, 0xD6, 0xD3, - 0x5D, 0x59, 0xDC, 0xDB, 0x66, 0xC3, 0xE7, 0xE7, 0x65, 0xF2, 0xE2, 0xE2, - 0x4B, 0xFE, 0xDA, 0xDA, 0x35, 0xFF, 0xD1, 0xD0, 0x21, 0xFF, 0xC7, 0xC5, - 0x15, 0xFF, 0xBE, 0xBB, 0x0F, 0xFF, 0xBC, 0xB9, 0x0B, 0xFF, 0xC0, 0xBE, - 0x0C, 0xFF, 0xCA, 0xC8, 0x12, 0xFF, 0xD1, 0xD0, 0x28, 0xFF, 0xDB, 0xDB, - 0x3C, 0xFF, 0xE4, 0xE4, 0x4F, 0xFF, 0xE8, 0xE8, 0x67, 0xE8, 0xE7, 0xE7, - 0x79, 0x9C, 0xDA, 0xD9, 0x6B, 0x44, 0xB7, 0xB2, 0x1D, 0x09, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE7, 0xE7, 0x7E, 0x27, 0xE7, 0xE7, 0x70, 0xA3, 0xE6, 0xE6, - 0x53, 0xF5, 0xD8, 0xD7, 0x29, 0xFF, 0xC7, 0xC5, 0x0D, 0xFF, 0xB3, 0xAE, - 0x01, 0xFF, 0xA2, 0x9A, 0x00, 0xFF, 0x96, 0x8B, 0x00, 0xFF, 0x8E, 0x80, - 0x00, 0xFF, 0x8B, 0x7B, 0x00, 0xFF, 0x8B, 0x7C, 0x00, 0xFF, 0x8C, 0x7E, - 0x00, 0xFF, 0x91, 0x84, 0x00, 0xFF, 0x99, 0x8F, 0x00, 0xFF, 0xA2, 0x9A, - 0x00, 0xFF, 0xB1, 0xAC, 0x02, 0xFF, 0xC6, 0xC3, 0x0E, 0xFF, 0xD6, 0xD6, - 0x2D, 0xFF, 0xE3, 0xE3, 0x59, 0xF2, 0xE4, 0xE4, 0x61, 0xA1, 0xE1, 0xE1, - 0x59, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF4, 0x02, 0xED, 0xED, - 0x80, 0x49, 0xE7, 0xE7, 0x57, 0xCF, 0xD5, 0xD4, 0x26, 0xFF, 0xB7, 0xB2, - 0x04, 0xFF, 0x9F, 0x95, 0x00, 0xFF, 0x92, 0x86, 0x00, 0xFF, 0x89, 0x7A, - 0x00, 0xFF, 0x83, 0x71, 0x00, 0xFF, 0x7F, 0x6D, 0x00, 0xFF, 0x7A, 0x67, - 0x00, 0xFF, 0x79, 0x65, 0x00, 0xFF, 0x78, 0x64, 0x00, 0xFF, 0x78, 0x63, - 0x00, 0xFF, 0x7B, 0x67, 0x00, 0xFF, 0x7F, 0x6D, 0x00, 0xFF, 0x84, 0x73, - 0x00, 0xFF, 0x8A, 0x7A, 0x00, 0xFF, 0x90, 0x82, 0x00, 0xFF, 0x9C, 0x91, - 0x00, 0xFF, 0xB3, 0xAE, 0x05, 0xFF, 0xD2, 0xD1, 0x21, 0xFF, 0xE3, 0xE3, - 0x4A, 0xDD, 0xE9, 0xE9, 0x6C, 0x5A, 0xF0, 0xF0, 0x90, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF6, 0xF6, 0xCE, 0x04, 0xE9, 0xE9, 0x70, 0x66, 0xDD, 0xDC, - 0x39, 0xEA, 0xBA, 0xB5, 0x08, 0xFF, 0x96, 0x89, 0x00, 0xFF, 0x87, 0x77, - 0x00, 0xFF, 0x83, 0x71, 0x00, 0xFF, 0x7C, 0x69, 0x00, 0xFF, 0x79, 0x65, - 0x00, 0xFF, 0x77, 0x63, 0x00, 0xFF, 0x77, 0x62, 0x00, 0xFF, 0x75, 0x60, - 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x71, 0x5C, 0x00, 0xFF, 0x71, 0x5C, - 0x00, 0xFF, 0x72, 0x5C, 0x00, 0xFF, 0x74, 0x60, 0x00, 0xFF, 0x77, 0x62, - 0x00, 0xFF, 0x79, 0x64, 0x00, 0xFF, 0x7A, 0x66, 0x00, 0xFF, 0x80, 0x6E, - 0x00, 0xFF, 0x8A, 0x7A, 0x00, 0xFF, 0x96, 0x8A, 0x00, 0xFF, 0xB6, 0xB1, - 0x08, 0xFF, 0xDD, 0xDD, 0x31, 0xF2, 0xE8, 0xE8, 0x5D, 0x84, 0xE9, 0xE9, - 0x76, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xEB, - 0xFF, 0x01, 0xE7, 0xE7, 0x59, 0x65, 0xDA, 0xD9, 0x25, 0xF2, 0xA9, 0xA0, - 0x02, 0xFF, 0x86, 0x75, 0x00, 0xFF, 0x7B, 0x68, 0x00, 0xFF, 0x78, 0x64, - 0x00, 0xFF, 0x78, 0x63, 0x00, 0xFF, 0x76, 0x62, 0x00, 0xFF, 0x76, 0x61, - 0x00, 0xFF, 0x75, 0x60, 0x00, 0xFF, 0x75, 0x60, 0x00, 0xFF, 0x75, 0x60, - 0x00, 0xFF, 0x75, 0x60, 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x72, 0x5D, - 0x00, 0xFF, 0x72, 0x5D, 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x74, 0x5F, - 0x00, 0xFF, 0x76, 0x61, 0x00, 0xFF, 0x76, 0x61, 0x00, 0xFF, 0x77, 0x63, - 0x00, 0xFF, 0x78, 0x64, 0x00, 0xFF, 0x7C, 0x69, 0x00, 0xFF, 0x87, 0x77, - 0x00, 0xFF, 0xA1, 0x96, 0x02, 0xFF, 0xCC, 0xCA, 0x1E, 0xFA, 0xE3, 0xE3, - 0x37, 0x8B, 0xE6, 0xE6, 0x35, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xE4, - 0x48, 0x4C, 0xD5, 0xD4, 0x1B, 0xE9, 0xA3, 0x99, 0x01, 0xFF, 0x81, 0x6F, - 0x00, 0xFF, 0x77, 0x62, 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x72, 0x5D, - 0x00, 0xFF, 0x72, 0x5D, 0x00, 0xFF, 0x75, 0x61, 0x00, 0xFF, 0x82, 0x70, - 0x00, 0xFF, 0x90, 0x81, 0x00, 0xFD, 0xA0, 0x96, 0x00, 0xF4, 0xA6, 0x9D, - 0x00, 0xE0, 0xA7, 0x9E, 0x00, 0xDC, 0xA5, 0x9B, 0x00, 0xE6, 0x9A, 0x8E, - 0x00, 0xF5, 0x8B, 0x7C, 0x00, 0xFC, 0x7E, 0x6B, 0x00, 0xFF, 0x75, 0x61, - 0x00, 0xFF, 0x72, 0x5D, 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x74, 0x5F, - 0x00, 0xFF, 0x72, 0x5C, 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x76, 0x61, - 0x00, 0xFF, 0x7D, 0x6A, 0x00, 0xFF, 0x91, 0x83, 0x00, 0xFF, 0xC2, 0xBE, - 0x09, 0xF8, 0xE0, 0xE1, 0x1A, 0x83, 0xE8, 0xE9, 0x35, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xE5, 0x46, 0x23, 0xD5, 0xD4, - 0x1F, 0xD0, 0xA1, 0x97, 0x01, 0xFF, 0x7D, 0x6A, 0x00, 0xFF, 0x72, 0x5D, - 0x00, 0xFF, 0x70, 0x5A, 0x00, 0xFF, 0x70, 0x5B, 0x00, 0xFF, 0x72, 0x5D, - 0x00, 0xFF, 0x82, 0x70, 0x00, 0xFF, 0xA0, 0x95, 0x00, 0xF4, 0xBD, 0xB8, - 0x00, 0xC0, 0xCE, 0xCC, 0x00, 0x6D, 0xD8, 0xD9, 0x00, 0x3B, 0xE2, 0xE5, - 0x00, 0x20, 0xEA, 0xEE, 0x00, 0x1A, 0xDD, 0xE0, 0x00, 0x26, 0xD5, 0xD6, - 0x00, 0x3D, 0xCC, 0xCA, 0x00, 0x5F, 0xBC, 0xB7, 0x00, 0xA5, 0xA7, 0x9E, - 0x00, 0xDB, 0x8D, 0x7F, 0x00, 0xFB, 0x75, 0x61, 0x00, 0xFF, 0x71, 0x5B, - 0x00, 0xFF, 0x70, 0x5A, 0x00, 0xFF, 0x6F, 0x5A, 0x00, 0xFF, 0x6F, 0x59, - 0x00, 0xFF, 0x6F, 0x5A, 0x00, 0xFF, 0x77, 0x63, 0x00, 0xFF, 0x8E, 0x7F, - 0x00, 0xFF, 0xC0, 0xBB, 0x09, 0xF2, 0xDE, 0xDF, 0x0E, 0x53, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0xDC, 0xDC, 0x0F, 0x8B, 0xAE, 0xA6, - 0x04, 0xFF, 0x7A, 0x67, 0x00, 0xFF, 0x70, 0x5B, 0x00, 0xFF, 0x6E, 0x58, - 0x00, 0xFF, 0x70, 0x5B, 0x00, 0xFF, 0x79, 0x66, 0x00, 0xFF, 0x9A, 0x8D, - 0x00, 0xF5, 0xC1, 0xBC, 0x00, 0xA9, 0xD7, 0xD7, 0x00, 0x44, 0xD5, 0xD4, - 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFB, 0x00, 0x03, 0xE6, 0xE8, - 0x00, 0x1D, 0xCC, 0xCA, 0x00, 0x6D, 0xA8, 0x9F, 0x00, 0xD6, 0x7F, 0x6E, - 0x00, 0xFE, 0x70, 0x5A, 0x00, 0xFF, 0x6E, 0x58, 0x00, 0xFF, 0x6C, 0x56, - 0x00, 0xFF, 0x6B, 0x54, 0x00, 0xFF, 0x6D, 0x57, 0x00, 0xFF, 0x74, 0x5F, - 0x00, 0xFF, 0x8A, 0x7B, 0x00, 0xFF, 0xC2, 0xBE, 0x00, 0xCE, 0xDE, 0xE0, - 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xDD, 0xDE, 0x02, 0x38, 0xBF, 0xBB, 0x00, 0xE8, 0x84, 0x73, - 0x00, 0xFF, 0x6E, 0x59, 0x00, 0xFF, 0x6F, 0x59, 0x00, 0xFF, 0x70, 0x5A, - 0x00, 0xFF, 0x79, 0x66, 0x00, 0xFF, 0xA8, 0x9E, 0x00, 0xCE, 0xD5, 0xD5, - 0x00, 0x56, 0xF2, 0xF7, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xE3, 0x00, 0x22, 0xB2, 0xAB, - 0x00, 0x9E, 0x84, 0x73, 0x00, 0xFA, 0x6D, 0x57, 0x00, 0xFF, 0x6A, 0x54, - 0x00, 0xFF, 0x68, 0x52, 0x00, 0xFF, 0x68, 0x52, 0x00, 0xFF, 0x6B, 0x55, - 0x00, 0xFF, 0x71, 0x5C, 0x00, 0xFF, 0x92, 0x85, 0x00, 0xFF, 0xCE, 0xCD, - 0x00, 0x87, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xCB, 0xCA, 0x00, 0x91, 0x93, 0x86, 0x00, 0xFF, 0x6E, 0x58, - 0x00, 0xFF, 0x69, 0x53, 0x00, 0xFF, 0x6E, 0x59, 0x00, 0xFF, 0x75, 0x61, - 0x00, 0xFF, 0xA3, 0x9A, 0x00, 0xBE, 0xDA, 0xDA, 0x00, 0x26, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFC, - 0x00, 0x0B, 0xB8, 0xB1, 0x00, 0x93, 0x7C, 0x6A, 0x00, 0xFD, 0x6A, 0x54, - 0x00, 0xFF, 0x67, 0x51, 0x00, 0xFF, 0x66, 0x4F, 0x00, 0xFF, 0x67, 0x50, - 0x00, 0xFF, 0x6B, 0x54, 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0xAD, 0xA5, - 0x00, 0xE3, 0xE6, 0xE8, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xE9, - 0x00, 0x1B, 0xB4, 0xAD, 0x00, 0xD7, 0x74, 0x60, 0x00, 0xFF, 0x67, 0x50, - 0x00, 0xFF, 0x6B, 0x55, 0x00, 0xFF, 0x6E, 0x59, 0x00, 0xFF, 0x93, 0x87, - 0x00, 0xD1, 0xD2, 0xD1, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0xF4, 0x00, 0x10, 0xA8, 0x9F, 0x00, 0xA7, 0x75, 0x61, - 0x00, 0xFF, 0x67, 0x50, 0x00, 0xFF, 0x65, 0x4F, 0x00, 0xFF, 0x65, 0x4F, - 0x00, 0xFF, 0x66, 0x50, 0x00, 0xFF, 0x6A, 0x53, 0x00, 0xFF, 0x83, 0x72, - 0x00, 0xFF, 0xC7, 0xC4, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xD3, - 0x00, 0x41, 0x96, 0x8A, 0x00, 0xF4, 0x69, 0x53, 0x00, 0xFF, 0x66, 0x50, - 0x00, 0xFF, 0x6B, 0x55, 0x00, 0xFF, 0x7F, 0x6E, 0x00, 0xED, 0xB6, 0xB1, - 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xD8, 0x00, 0x2B, 0x95, 0x89, - 0x00, 0xDD, 0x68, 0x52, 0x00, 0xFF, 0x64, 0x4D, 0x00, 0xFF, 0x64, 0x4D, - 0x00, 0xFF, 0x64, 0x4D, 0x00, 0xFF, 0x68, 0x52, 0x00, 0xFF, 0x71, 0x5D, - 0x00, 0xFF, 0xAD, 0xA5, 0x00, 0xBC, 0xFF, 0xFF, 0x00, 0x0B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xBF, - 0x00, 0x76, 0x80, 0x70, 0x00, 0xFF, 0x65, 0x4E, 0x00, 0xFF, 0x66, 0x4F, - 0x00, 0xFF, 0x6D, 0x59, 0x00, 0xFF, 0x9F, 0x95, 0x00, 0x91, 0xFF, 0xFF, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0xB1, - 0x00, 0x7F, 0x77, 0x65, 0x00, 0xFF, 0x64, 0x4E, 0x00, 0xFF, 0x64, 0x4D, - 0x00, 0xFF, 0x64, 0x4D, 0x00, 0xFF, 0x66, 0x50, 0x00, 0xFF, 0x6C, 0x56, - 0x00, 0xFF, 0x98, 0x8C, 0x00, 0xEC, 0xDC, 0xDD, 0x00, 0x34, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x02, 0xB9, 0xB3, - 0x00, 0xA2, 0x72, 0x5F, 0x00, 0xFF, 0x64, 0x4E, 0x00, 0xFF, 0x65, 0x4F, - 0x00, 0xFF, 0x7E, 0x6D, 0x00, 0xED, 0xBF, 0xBC, 0x00, 0x35, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xD4, - 0x00, 0x28, 0x8C, 0x7E, 0x00, 0xE3, 0x68, 0x52, 0x00, 0xFF, 0x65, 0x4F, - 0x00, 0xFF, 0x65, 0x4E, 0x00, 0xFF, 0x65, 0x4F, 0x00, 0xFF, 0x67, 0x50, - 0x00, 0xFF, 0x80, 0x6F, 0x00, 0xFF, 0xC9, 0xC6, 0x00, 0x73, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xF9, 0x00, 0x0D, 0xA4, 0x9B, - 0x00, 0xC6, 0x6D, 0x57, 0x00, 0xFF, 0x65, 0x4F, 0x00, 0xFF, 0x6B, 0x55, - 0x00, 0xFF, 0x97, 0x8B, 0x00, 0xBE, 0xEA, 0xF1, 0x00, 0x0C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x09, 0xA2, 0x99, 0x00, 0xB6, 0x74, 0x60, 0x00, 0xFE, 0x72, 0x5D, - 0x00, 0xF9, 0x73, 0x5E, 0x00, 0xF8, 0x72, 0x5D, 0x00, 0xF9, 0x72, 0x5D, - 0x00, 0xFA, 0x7E, 0x6C, 0x00, 0xFF, 0xBD, 0xB8, 0x00, 0xA3, 0xFF, 0xFF, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xE8, 0x00, 0x1E, 0xA2, 0x97, - 0x00, 0xDF, 0x71, 0x5C, 0x00, 0xFF, 0x6E, 0x58, 0x00, 0xFF, 0x7D, 0x6B, - 0x00, 0xFF, 0xB8, 0xB3, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xB8, 0xB3, 0x00, 0x83, 0x92, 0x84, 0x00, 0xEB, 0x8B, 0x7B, - 0x00, 0xE2, 0x88, 0x78, 0x00, 0xDF, 0x85, 0x73, 0x00, 0xE0, 0x88, 0x77, - 0x00, 0xE3, 0x8F, 0x81, 0x00, 0xEC, 0xBA, 0xB6, 0x00, 0xBD, 0xED, 0xF0, - 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xE3, 0x00, 0x2F, 0xB1, 0xAA, - 0x00, 0xED, 0x8F, 0x80, 0x00, 0xFF, 0x8E, 0x7F, 0x00, 0xFF, 0x98, 0x8C, - 0x00, 0xFF, 0xC9, 0xC7, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC3, 0xC1, 0x00, 0x5B, 0x80, 0x6F, 0x00, 0xC3, 0x68, 0x52, - 0x00, 0xB6, 0x67, 0x50, 0x00, 0xB1, 0x67, 0x50, 0x00, 0xB2, 0x69, 0x53, - 0x00, 0xB9, 0x6E, 0x58, 0x00, 0xC5, 0x9D, 0x92, 0x00, 0xB9, 0xE3, 0xE5, - 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE2, 0x00, 0x3A, 0x9B, 0x90, - 0x00, 0xF3, 0x74, 0x60, 0x00, 0xFF, 0x78, 0x64, 0x00, 0xFF, 0x8D, 0x7F, - 0x00, 0xFE, 0xCA, 0xC8, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xCC, 0xC9, 0x00, 0x36, 0x7F, 0x6E, 0x00, 0x83, 0x60, 0x49, - 0x00, 0x73, 0x60, 0x49, 0x00, 0x6B, 0x61, 0x4B, 0x00, 0x6C, 0x61, 0x4B, - 0x00, 0x75, 0x65, 0x4E, 0x00, 0x87, 0x97, 0x8B, 0x00, 0x98, 0xE0, 0xE0, - 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xE4, 0x00, 0x3B, 0x92, 0x85, - 0x00, 0xF4, 0x66, 0x50, 0x00, 0xFF, 0x6E, 0x58, 0x00, 0xFF, 0x8F, 0x81, - 0x00, 0xFF, 0xD0, 0xD0, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC4, 0xC2, 0x00, 0x23, 0x7C, 0x6C, 0x00, 0x3E, 0x5D, 0x45, - 0x00, 0x2E, 0x5E, 0x47, 0x00, 0x27, 0x60, 0x49, 0x00, 0x28, 0x61, 0x4A, - 0x00, 0x30, 0x64, 0x4D, 0x00, 0x41, 0x9A, 0x8E, 0x00, 0x59, 0xDD, 0xDD, - 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xE7, 0x00, 0x2D, 0x95, 0x88, - 0x00, 0xEB, 0x65, 0x4F, 0x00, 0xFF, 0x6C, 0x56, 0x00, 0xFF, 0x8E, 0x80, - 0x00, 0xFF, 0xD4, 0xD3, 0x03, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xA6, 0x9F, 0x00, 0x0E, 0x70, 0x5E, 0x00, 0x11, 0x57, 0x41, - 0x00, 0x09, 0x5B, 0x46, 0x00, 0x07, 0x5C, 0x46, 0x00, 0x07, 0x5E, 0x49, - 0x00, 0x0A, 0x63, 0x4C, 0x00, 0x12, 0xA5, 0x9B, 0x00, 0x22, 0xDE, 0xDE, - 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xEF, 0x00, 0x13, 0x9A, 0x8F, - 0x00, 0xCF, 0x67, 0x51, 0x00, 0xFF, 0x6A, 0x54, 0x00, 0xFF, 0x85, 0x75, - 0x00, 0xFF, 0xCB, 0xC9, 0x0C, 0xB5, 0xFF, 0xFF, 0x43, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x69, 0x4F, 0x00, 0x01, 0x5E, 0x47, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x41, 0x00, 0x02, 0xA2, 0x9A, 0x00, 0x07, 0xD1, 0xD0, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x06, 0xAE, 0xA7, - 0x00, 0xB4, 0x6D, 0x58, 0x00, 0xFF, 0x69, 0x53, 0x00, 0xFF, 0x7C, 0x6A, - 0x00, 0xFF, 0xC0, 0xBB, 0x09, 0xD9, 0xEE, 0xF0, 0x30, 0x1D, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE5, 0xE5, 0x7D, 0x08, 0xE3, 0xE3, 0x8B, 0x13, 0xE8, 0xE8, - 0x6A, 0x1B, 0xE7, 0xE7, 0x33, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x42, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xBC, - 0x00, 0x79, 0x79, 0x67, 0x00, 0xFF, 0x67, 0x50, 0x00, 0xFF, 0x73, 0x5F, - 0x00, 0xFF, 0xAA, 0xA2, 0x0D, 0xFA, 0xE0, 0xE1, 0x46, 0x57, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xE2, 0x12, 0x0C, 0xDE, 0xDF, - 0x30, 0x7A, 0xDA, 0xDB, 0x33, 0xBA, 0xD7, 0xD6, 0x30, 0xD2, 0xD4, 0xD3, - 0x24, 0xC1, 0xD9, 0xD9, 0x07, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xDD, - 0x00, 0x35, 0x91, 0x84, 0x00, 0xEB, 0x66, 0x4F, 0x00, 0xFF, 0x70, 0x5B, - 0x00, 0xFF, 0x94, 0x86, 0x03, 0xFF, 0xDB, 0xDA, 0x48, 0xBB, 0xF4, 0xF4, - 0xA3, 0x14, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xF5, 0xB0, 0x11, 0xF2, 0xF2, - 0xAB, 0x4A, 0xF2, 0xF2, 0xAD, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xE3, 0x01, 0x22, 0xC6, 0xC2, - 0x05, 0xE3, 0xAA, 0xA2, 0x03, 0xFF, 0x9C, 0x90, 0x00, 0xFF, 0xA4, 0x9B, - 0x00, 0xEE, 0xD5, 0xD5, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x07, 0xAE, 0xA6, 0x00, 0xAA, 0x6E, 0x59, 0x00, 0xFF, 0x6E, 0x58, - 0x00, 0xFF, 0x85, 0x74, 0x00, 0xFF, 0xC7, 0xC4, 0x26, 0xFD, 0xEA, 0xEA, - 0x7A, 0x8B, 0xE9, 0xE8, 0x8D, 0x3B, 0xED, 0xED, 0x88, 0xAC, 0xEC, 0xEC, - 0x68, 0xFA, 0xE8, 0xE8, 0x70, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xD3, 0x00, 0x2C, 0x99, 0x8E, - 0x00, 0xEB, 0x77, 0x63, 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x8B, 0x7C, - 0x00, 0xFD, 0xCD, 0xCC, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC8, 0xC5, 0x00, 0x48, 0x87, 0x78, 0x00, 0xF3, 0x6D, 0x58, - 0x00, 0xFF, 0x7A, 0x67, 0x00, 0xFF, 0xA3, 0x99, 0x03, 0xFF, 0xDD, 0xDD, - 0x4B, 0xF9, 0xE5, 0xE5, 0x6B, 0xF1, 0xD0, 0xCE, 0x29, 0xFF, 0xB3, 0xAC, - 0x03, 0xFF, 0xCB, 0xC9, 0x0C, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xD1, 0x00, 0x3A, 0x8E, 0x80, - 0x00, 0xF3, 0x6B, 0x55, 0x00, 0xFF, 0x68, 0x52, 0x00, 0xFF, 0x7A, 0x67, - 0x00, 0xFF, 0xBA, 0xB6, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFD, 0xFF, 0x00, 0x09, 0xB4, 0xAE, 0x00, 0xA9, 0x7D, 0x6B, - 0x00, 0xFF, 0x76, 0x62, 0x00, 0xFF, 0x83, 0x72, 0x00, 0xFF, 0xB2, 0xAB, - 0x06, 0xFF, 0xB7, 0xB1, 0x0B, 0xFF, 0x93, 0x87, 0x00, 0xFF, 0x88, 0x78, - 0x00, 0xFF, 0xB3, 0xAC, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xD1, 0x00, 0x4F, 0x89, 0x7A, - 0x00, 0xFB, 0x65, 0x4E, 0x00, 0xFF, 0x66, 0x4F, 0x00, 0xFF, 0x6D, 0x58, - 0x00, 0xFF, 0xB2, 0xAB, 0x00, 0xBB, 0xFF, 0xFF, 0x00, 0x09, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xD6, 0x00, 0x30, 0xA4, 0x9B, - 0x00, 0xE0, 0x7A, 0x67, 0x00, 0xFF, 0x75, 0x60, 0x00, 0xFF, 0x7B, 0x68, - 0x00, 0xFF, 0x7A, 0x67, 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x7B, 0x69, - 0x00, 0xFF, 0xB6, 0xAF, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xCF, 0x00, 0x64, 0x85, 0x75, - 0x00, 0xFF, 0x62, 0x4B, 0x00, 0xFF, 0x63, 0x4C, 0x00, 0xFF, 0x67, 0x51, - 0x00, 0xFF, 0xA1, 0x97, 0x00, 0xD5, 0xEB, 0xEF, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xF6, 0x93, 0x11, 0xD5, 0xD4, - 0x23, 0xC1, 0x92, 0x85, 0x00, 0xFF, 0x6D, 0x57, 0x00, 0xFF, 0x67, 0x50, - 0x00, 0xFF, 0x68, 0x51, 0x00, 0xFF, 0x67, 0x51, 0x00, 0xFF, 0x7A, 0x68, - 0x00, 0xFF, 0xC0, 0xBC, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0xBF, 0x00, 0x74, 0x7E, 0x6D, - 0x00, 0xFF, 0x64, 0x4D, 0x00, 0xFF, 0x63, 0x4C, 0x00, 0xFF, 0x65, 0x4F, - 0x00, 0xFF, 0x97, 0x8B, 0x00, 0xEE, 0xE0, 0xE1, 0x00, 0x35, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xE8, 0x64, 0x71, 0xD5, 0xD3, - 0x29, 0xFC, 0x90, 0x82, 0x00, 0xFF, 0x6A, 0x54, 0x00, 0xFF, 0x64, 0x4E, - 0x00, 0xFF, 0x65, 0x4E, 0x00, 0xFF, 0x65, 0x4E, 0x00, 0xFF, 0x7C, 0x6B, - 0x00, 0xFF, 0xC3, 0xC0, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xB8, 0x00, 0x83, 0x7C, 0x6B, - 0x00, 0xFF, 0x65, 0x4E, 0x00, 0xFF, 0x62, 0x4B, 0x00, 0xFF, 0x65, 0x4E, - 0x00, 0xFE, 0x88, 0x79, 0x00, 0xFB, 0xCC, 0xCB, 0x00, 0x5A, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xD3, 0x0B, 0x97, 0x99, 0x8D, - 0x02, 0xFF, 0x73, 0x5F, 0x00, 0xFF, 0x68, 0x52, 0x00, 0xFF, 0x64, 0x4E, - 0x00, 0xFF, 0x63, 0x4D, 0x00, 0xFF, 0x63, 0x4D, 0x00, 0xFF, 0x7D, 0x6D, - 0x00, 0xFD, 0xC4, 0xC2, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0xB8, 0x00, 0x99, 0x79, 0x67, - 0x00, 0xFF, 0x64, 0x4D, 0x00, 0xFF, 0x62, 0x4B, 0x00, 0xFF, 0x65, 0x4E, - 0x00, 0xFE, 0x77, 0x65, 0x00, 0xFF, 0xC1, 0xBD, 0x00, 0x89, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xBC, 0x00, 0x78, 0x82, 0x72, - 0x00, 0xFF, 0x6F, 0x5A, 0x00, 0xFF, 0x6A, 0x55, 0x00, 0xFF, 0x67, 0x51, - 0x00, 0xFF, 0x66, 0x50, 0x00, 0xFF, 0x66, 0x50, 0x00, 0xFF, 0x80, 0x71, - 0x00, 0xF9, 0xC6, 0xC4, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x04, 0xB8, 0xB3, 0x00, 0xB0, 0x74, 0x60, - 0x00, 0xFF, 0x64, 0x4E, 0x00, 0xFF, 0x62, 0x4B, 0x00, 0xFF, 0x63, 0x4D, - 0x00, 0xFE, 0x6F, 0x5A, 0x00, 0xFF, 0xAF, 0xA9, 0x00, 0xAA, 0xFF, 0xFF, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0xC8, 0x00, 0x41, 0xBB, 0xB6, - 0x00, 0xB6, 0xB4, 0xAE, 0x00, 0xBE, 0xAE, 0xA7, 0x00, 0xBE, 0x9F, 0x96, - 0x00, 0xBF, 0x9C, 0x92, 0x00, 0xBE, 0x9B, 0x90, 0x00, 0xBF, 0xA8, 0x9F, - 0x00, 0xB6, 0xD0, 0xCF, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x0A, 0xB4, 0xAE, 0x00, 0xC1, 0x71, 0x5D, - 0x00, 0xFF, 0x64, 0x4E, 0x00, 0xFF, 0x62, 0x4B, 0x00, 0xFF, 0x63, 0x4C, - 0x00, 0xFE, 0x69, 0x53, 0x00, 0xFF, 0xA4, 0x9B, 0x00, 0xCD, 0xE9, 0xED, - 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xD7, 0x00, 0x01, 0xFB, 0xFB, - 0x00, 0x06, 0xFF, 0xFF, 0x00, 0x09, 0xFF, 0xFF, 0x00, 0x09, 0xFE, 0xFF, - 0x00, 0x09, 0xFF, 0xFF, 0x00, 0x09, 0xFF, 0xFF, 0x00, 0x09, 0xF8, 0xF8, - 0x00, 0x08, 0xDB, 0xDB, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE2, 0xE7, 0x00, 0x11, 0xA9, 0xA2, 0x00, 0xCE, 0x6E, 0x59, - 0x00, 0xFF, 0x64, 0x4E, 0x00, 0xFF, 0x62, 0x4C, 0x00, 0xFF, 0x63, 0x4D, - 0x00, 0xFE, 0x67, 0x51, 0x00, 0xFE, 0x97, 0x8C, 0x00, 0xEA, 0xD7, 0xD8, - 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE3, 0xE6, 0x00, 0x1B, 0xA7, 0x9F, 0x00, 0xDC, 0x6E, 0x59, - 0x00, 0xFF, 0x66, 0x4F, 0x00, 0xFF, 0x63, 0x4D, 0x00, 0xFF, 0x65, 0x4E, - 0x00, 0xFF, 0x69, 0x52, 0x00, 0xFD, 0x8C, 0x7D, 0x00, 0xFA, 0xD2, 0xD1, - 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE1, 0xE2, 0x00, 0x28, 0xB0, 0xAA, 0x00, 0xE8, 0x81, 0x70, - 0x00, 0xFF, 0x7B, 0x68, 0x00, 0xFF, 0x7B, 0x68, 0x00, 0xFF, 0x7E, 0x6B, - 0x00, 0xFF, 0x80, 0x6E, 0x00, 0xFE, 0x97, 0x8B, 0x00, 0xFF, 0xC4, 0xC3, - 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xDC, 0xDD, 0x00, 0x38, 0xAC, 0xA4, 0x00, 0xF2, 0x83, 0x72, - 0x00, 0xFF, 0x7C, 0x69, 0x00, 0xFF, 0x79, 0x66, 0x00, 0xFF, 0x75, 0x61, - 0x00, 0xFF, 0x74, 0x60, 0x00, 0xFF, 0x82, 0x71, 0x00, 0xFF, 0xBA, 0xB6, - 0x00, 0xB8, 0xE1, 0xE6, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xCD, 0xCE, 0x00, 0x49, 0x91, 0x85, 0x00, 0xF9, 0x69, 0x53, - 0x00, 0xFF, 0x65, 0x4E, 0x00, 0xFF, 0x63, 0x4C, 0x00, 0xFF, 0x65, 0x4E, - 0x00, 0xFF, 0x64, 0x4E, 0x00, 0xFF, 0x6E, 0x59, 0x00, 0xFF, 0xA9, 0xA2, - 0x00, 0xD8, 0xD8, 0xDB, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC7, 0xC7, 0x00, 0x4C, 0xA2, 0x99, 0x00, 0xF7, 0x89, 0x7A, - 0x00, 0xFD, 0x8A, 0x7B, 0x00, 0xFD, 0x87, 0x78, 0x00, 0xFE, 0x84, 0x75, - 0x00, 0xFE, 0x83, 0x74, 0x00, 0xFE, 0x7E, 0x6E, 0x00, 0xFF, 0xA4, 0x9B, - 0x00, 0xEB, 0xDC, 0xDD, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD1, 0xD1, 0x00, 0x15, 0xD5, 0xD5, 0x00, 0x4D, 0xD6, 0xD5, - 0x00, 0x55, 0xD7, 0xD7, 0x00, 0x57, 0xD6, 0xD6, 0x00, 0x5C, 0xD4, 0xD3, - 0x00, 0x5C, 0xD3, 0xD2, 0x00, 0x5C, 0xC4, 0xC2, 0x00, 0x5E, 0xC4, 0xC1, - 0x00, 0x59, 0xCC, 0xCC, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFC, - 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x3F, 0xFF, - 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0xFF, 0xE0, - 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x03, 0xFF, - 0x00, 0x00, 0xFF, 0x80, 0x1F, 0xC0, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x00, - 0x7F, 0xF8, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x01, 0xFF, 0xFC, 0x00, 0xFF, - 0x00, 0x00, 0xFE, 0x03, 0xFF, 0xFE, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x07, - 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x0F, 0xFF, 0xFF, 0x80, 0x7F, - 0x00, 0x00, 0xFE, 0x0F, 0xFF, 0xFF, 0xC0, 0x7F, 0x00, 0x00, 0xFC, 0x1F, - 0xFF, 0xFF, 0xC0, 0x7F, 0x00, 0x00, 0xFC, 0x1F, 0xFF, 0xFF, 0xC0, 0x3F, - 0x00, 0x00, 0xFC, 0x1F, 0xFF, 0xFF, 0xC0, 0x3F, 0x00, 0x00, 0xFC, 0x3F, - 0xFF, 0xFF, 0xE0, 0x3F, 0x00, 0x00, 0xFC, 0x3F, 0xFF, 0xFF, 0xEF, 0x3F, - 0x00, 0x00, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0x1F, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0x1F, - 0xFC, 0x7F, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0x0F, 0xF8, 0x7F, 0xFF, 0xFF, - 0x00, 0x00, 0xFE, 0x04, 0x78, 0x7F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, - 0x78, 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xF8, 0x3F, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0x80, 0xF8, 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x80, - 0xF8, 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0xF0, 0x3F, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0x00, 0xF0, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x80, - 0xF0, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0xF0, 0x1F, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - 0xF0, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xBB, 0xB7, 0x30, 0x06, 0xEC, 0xEC, 0x93, 0x18, 0xF1, 0xF1, - 0x89, 0x38, 0xEA, 0xEB, 0x76, 0x5A, 0xE3, 0xE3, 0x71, 0x6D, 0xD3, 0xD0, - 0x51, 0x7E, 0xCB, 0xC7, 0x43, 0x6F, 0xC6, 0xC1, 0x48, 0x3C, 0xC4, 0xC0, - 0x38, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0xDE, 0x7B, 0x09, 0xDB, 0xD9, 0x60, 0x56, 0xE1, 0xE0, - 0x59, 0xAF, 0xE0, 0xE0, 0x4E, 0xD7, 0xD9, 0xD7, 0x3F, 0xF1, 0xCE, 0xCC, - 0x31, 0xFD, 0xC8, 0xC5, 0x2A, 0xFF, 0xCC, 0xC9, 0x28, 0xFF, 0xD2, 0xD1, - 0x36, 0xFF, 0xD9, 0xD8, 0x47, 0xF2, 0xE2, 0xE2, 0x56, 0xBD, 0xE6, 0xE7, - 0x70, 0x61, 0xDA, 0xD9, 0x6A, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF1, 0x81, 0x21, 0xE4, 0xE4, - 0x56, 0xA1, 0xD3, 0xD2, 0x31, 0xF6, 0xBC, 0xB8, 0x13, 0xFF, 0xA6, 0x9D, - 0x03, 0xFF, 0x94, 0x88, 0x00, 0xFF, 0x8A, 0x7A, 0x00, 0xFF, 0x87, 0x77, - 0x00, 0xFF, 0x89, 0x7A, 0x00, 0xFF, 0x92, 0x85, 0x00, 0xFF, 0x9F, 0x95, - 0x01, 0xFF, 0xB4, 0xAD, 0x0D, 0xFF, 0xC9, 0xC6, 0x29, 0xFB, 0xDC, 0xDC, - 0x44, 0xC7, 0xE6, 0xE7, 0x59, 0x4D, 0xF5, 0xF6, 0xA2, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xEB, - 0x67, 0x3A, 0xD5, 0xD3, 0x35, 0xCB, 0xB0, 0xA9, 0x0E, 0xFF, 0x91, 0x83, - 0x00, 0xFF, 0x83, 0x72, 0x00, 0xFF, 0x7C, 0x68, 0x00, 0xFF, 0x78, 0x64, - 0x00, 0xFF, 0x74, 0x60, 0x00, 0xFF, 0x72, 0x5D, 0x00, 0xFF, 0x72, 0x5D, - 0x00, 0xFF, 0x76, 0x61, 0x00, 0xFF, 0x7B, 0x67, 0x00, 0xFF, 0x7F, 0x6C, - 0x00, 0xFF, 0x8A, 0x7A, 0x00, 0xFF, 0xA3, 0x99, 0x06, 0xFF, 0xC8, 0xC5, - 0x22, 0xEF, 0xE4, 0xE4, 0x4A, 0x7B, 0xF1, 0xF2, 0x70, 0x0A, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE7, 0xE8, 0x47, 0x34, 0xCD, 0xCA, 0x21, 0xD6, 0x99, 0x8D, - 0x03, 0xFF, 0x7B, 0x67, 0x00, 0xFF, 0x76, 0x61, 0x00, 0xFF, 0x75, 0x60, - 0x00, 0xFF, 0x79, 0x65, 0x00, 0xFF, 0x7F, 0x6D, 0x00, 0xFF, 0x83, 0x71, - 0x00, 0xFD, 0x82, 0x70, 0x00, 0xFE, 0x7C, 0x69, 0x00, 0xFF, 0x76, 0x61, - 0x00, 0xFF, 0x73, 0x5E, 0x00, 0xFF, 0x74, 0x5F, 0x00, 0xFF, 0x76, 0x62, - 0x00, 0xFF, 0x79, 0x65, 0x00, 0xFF, 0x89, 0x79, 0x00, 0xFF, 0xB2, 0xAA, - 0x10, 0xF9, 0xD7, 0xD6, 0x21, 0x85, 0xF4, 0xF7, 0x24, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xEC, 0x3D, 0x17, 0xC8, 0xC5, - 0x18, 0xBF, 0x92, 0x84, 0x02, 0xFF, 0x74, 0x5F, 0x00, 0xFF, 0x70, 0x5B, - 0x00, 0xFF, 0x77, 0x63, 0x00, 0xFF, 0x8D, 0x7E, 0x00, 0xF3, 0xA7, 0x9D, - 0x00, 0xBF, 0xB6, 0xAF, 0x00, 0x7C, 0xBD, 0xB8, 0x00, 0x5A, 0xBC, 0xB7, - 0x00, 0x5E, 0xB1, 0xAA, 0x00, 0x7B, 0xA2, 0x98, 0x00, 0xAF, 0x90, 0x82, - 0x00, 0xE4, 0x7B, 0x68, 0x00, 0xFE, 0x71, 0x5B, 0x00, 0xFF, 0x70, 0x5A, - 0x00, 0xFF, 0x70, 0x5B, 0x00, 0xFF, 0x7A, 0x67, 0x00, 0xFF, 0xA7, 0x9D, - 0x05, 0xF8, 0xD2, 0xD1, 0x0E, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD0, 0xCE, 0x08, 0x78, 0x98, 0x8B, 0x03, 0xFE, 0x71, 0x5C, - 0x00, 0xFF, 0x6E, 0x59, 0x00, 0xFF, 0x80, 0x6E, 0x00, 0xF9, 0xA6, 0x9C, - 0x00, 0xB4, 0xC8, 0xC5, 0x00, 0x47, 0xE3, 0xE4, 0x00, 0x0D, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFA, 0xFE, 0x00, 0x06, 0xD3, 0xD2, 0x00, 0x29, 0xAC, 0xA4, - 0x00, 0x8B, 0x85, 0x74, 0x00, 0xED, 0x6F, 0x59, 0x00, 0xFF, 0x6B, 0x55, - 0x00, 0xFF, 0x6B, 0x55, 0x00, 0xFF, 0x76, 0x62, 0x00, 0xFF, 0xA3, 0x99, - 0x00, 0xDF, 0xD5, 0xD5, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xDC, 0x00, 0x20, 0xA7, 0x9E, - 0x00, 0xD9, 0x72, 0x5D, 0x00, 0xFF, 0x6C, 0x56, 0x00, 0xFF, 0x7D, 0x6A, - 0x00, 0xF4, 0xAA, 0xA1, 0x00, 0x78, 0xF2, 0xF5, 0x00, 0x0D, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x02, 0xB4, 0xAD, - 0x00, 0x55, 0x83, 0x72, 0x00, 0xE8, 0x69, 0x53, 0x00, 0xFF, 0x67, 0x50, - 0x00, 0xFF, 0x68, 0x52, 0x00, 0xFF, 0x79, 0x66, 0x00, 0xFF, 0xB2, 0xAB, - 0x00, 0x98, 0xFF, 0xFF, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC0, 0xBC, 0x00, 0x5C, 0x82, 0x71, 0x00, 0xFC, 0x67, 0x51, - 0x00, 0xFF, 0x72, 0x5D, 0x00, 0xFD, 0x98, 0x8D, 0x00, 0x85, 0xFF, 0xFF, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA0, - 0x00, 0x65, 0x78, 0x65, 0x00, 0xF7, 0x65, 0x4E, 0x00, 0xFF, 0x65, 0x4E, - 0x00, 0xFF, 0x68, 0x52, 0x00, 0xFF, 0x8C, 0x7E, 0x00, 0xE0, 0xD2, 0xD1, - 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x9D, - 0x00, 0x95, 0x6E, 0x59, 0x00, 0xFF, 0x67, 0x51, 0x00, 0xFF, 0x83, 0x73, - 0x00, 0xBF, 0xC2, 0xC0, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xF7, 0x00, 0x0B, 0x92, 0x84, - 0x00, 0xB2, 0x68, 0x52, 0x00, 0xFF, 0x64, 0x4D, 0x00, 0xFF, 0x65, 0x4F, - 0x00, 0xFF, 0x7A, 0x67, 0x00, 0xFD, 0xB6, 0xB0, 0x00, 0x61, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x0A, 0x95, 0x89, 0x00, 0xBF, 0x66, 0x50, - 0x00, 0xFF, 0x6E, 0x59, 0x00, 0xFD, 0x99, 0x8E, 0x00, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xA0, 0x00, 0x59, 0x75, 0x62, - 0x00, 0xFB, 0x68, 0x51, 0x00, 0xFE, 0x68, 0x52, 0x00, 0xFE, 0x6F, 0x5A, - 0x00, 0xFF, 0xA3, 0x99, 0x00, 0xA3, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xDA, - 0x00, 0x1B, 0x90, 0x82, 0x00, 0xDB, 0x6E, 0x58, 0x00, 0xFF, 0x85, 0x75, - 0x00, 0xE8, 0xBF, 0xBC, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC2, 0xBF, 0x00, 0x29, 0x91, 0x84, 0x00, 0xD9, 0x80, 0x6F, - 0x00, 0xE9, 0x7F, 0x6C, 0x00, 0xE6, 0x81, 0x6F, 0x00, 0xEE, 0xA5, 0x9C, - 0x00, 0xC1, 0xEA, 0xED, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xD6, 0x00, 0x2B, 0x9D, 0x91, - 0x00, 0xEA, 0x85, 0x74, 0x00, 0xFF, 0x9D, 0x91, 0x00, 0xD2, 0xE1, 0xE3, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xDD, - 0x00, 0x12, 0x8F, 0x82, 0x00, 0x98, 0x6A, 0x54, 0x00, 0xA5, 0x68, 0x52, - 0x00, 0xA0, 0x6A, 0x55, 0x00, 0xAC, 0x8D, 0x7F, 0x00, 0xAC, 0xD3, 0xD3, - 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD3, 0xD2, 0x00, 0x30, 0x85, 0x76, 0x00, 0xEE, 0x6E, 0x58, - 0x00, 0xFF, 0x9A, 0x8E, 0x00, 0xD8, 0xE5, 0xE8, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xDC, 0x00, 0x09, 0x8D, 0x80, - 0x00, 0x45, 0x5E, 0x47, 0x00, 0x3F, 0x5F, 0x48, 0x00, 0x39, 0x60, 0x49, - 0x00, 0x46, 0x8A, 0x7B, 0x00, 0x5F, 0xD1, 0xD0, 0x00, 0x1A, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xD4, - 0x00, 0x23, 0x84, 0x74, 0x00, 0xE3, 0x69, 0x53, 0x00, 0xFF, 0x9C, 0x91, - 0x02, 0xEC, 0xE2, 0xE3, 0x0B, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xAE, 0xA7, 0x00, 0x03, 0x83, 0x75, 0x00, 0x0C, 0x56, 0x40, - 0x00, 0x06, 0x5A, 0x45, 0x00, 0x05, 0x5B, 0x45, 0x00, 0x09, 0x97, 0x8B, - 0x00, 0x16, 0xD3, 0xD1, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xF1, 0x00, 0x0E, 0x8E, 0x80, - 0x00, 0xC8, 0x68, 0x52, 0x00, 0xFF, 0x91, 0x83, 0x02, 0xF9, 0xD4, 0xD3, - 0x15, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF1, 0xF3, 0x74, 0x06, 0xEB, 0xEE, 0x6C, 0x15, 0xEA, 0xEC, - 0x58, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x84, 0x00, 0x01, 0xAB, 0xA6, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0x97, 0x00, 0x93, 0x6C, 0x57, - 0x00, 0xFF, 0x80, 0x6F, 0x02, 0xFF, 0xC4, 0xC0, 0x28, 0x99, 0xFF, 0xFF, - 0xFF, 0x03, 0xFC, 0xFC, 0xE7, 0x02, 0xF7, 0xF7, 0xCC, 0x09, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xE1, 0x0F, 0x12, 0xD1, 0xD0, - 0x1C, 0x9F, 0xC4, 0xC0, 0x1D, 0xD8, 0xC5, 0xC1, 0x14, 0x92, 0xFF, 0xFF, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xBC, 0xB7, 0x00, 0x44, 0x7B, 0x69, 0x00, 0xF2, 0x73, 0x5F, - 0x00, 0xFF, 0xB6, 0xAF, 0x20, 0xED, 0xEB, 0xEC, 0x77, 0x5B, 0xED, 0xED, - 0x82, 0x69, 0xE9, 0xE9, 0x6D, 0xAA, 0xE7, 0xE7, 0x6B, 0x19, 0x00, 0x00, - 0x00, 0x00, 0xCD, 0xCC, 0x00, 0x26, 0x9B, 0x8F, 0x00, 0xE6, 0x80, 0x6E, - 0x00, 0xFF, 0x9A, 0x8E, 0x00, 0xC8, 0xEB, 0xEF, 0x00, 0x0F, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xFC, - 0x00, 0x09, 0x96, 0x8A, 0x00, 0xAF, 0x74, 0x60, 0x00, 0xFF, 0x93, 0x85, - 0x05, 0xFF, 0xD2, 0xD0, 0x3B, 0xF3, 0xC5, 0xC1, 0x2C, 0xFA, 0xB1, 0xA9, - 0x0A, 0xE4, 0xD1, 0xD0, 0x12, 0x23, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xC0, - 0x00, 0x33, 0x81, 0x70, 0x00, 0xEF, 0x67, 0x50, 0x00, 0xFF, 0x86, 0x76, - 0x00, 0xE7, 0xCE, 0xCC, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xBC, - 0x00, 0x3D, 0x8F, 0x80, 0x00, 0xEA, 0x78, 0x65, 0x00, 0xFF, 0x8A, 0x7B, - 0x01, 0xFF, 0x7F, 0x6D, 0x00, 0xFF, 0x89, 0x79, 0x00, 0xDD, 0xCB, 0xC8, - 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xC0, 0x00, 0x46, 0x7C, 0x6B, - 0x00, 0xF8, 0x62, 0x4A, 0x00, 0xFF, 0x7A, 0x67, 0x00, 0xFA, 0xBD, 0xB8, - 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xF4, 0x6B, 0x26, 0xBE, 0xB9, - 0x19, 0xDB, 0x76, 0x62, 0x00, 0xFF, 0x66, 0x4F, 0x00, 0xFF, 0x66, 0x50, - 0x00, 0xFF, 0x88, 0x78, 0x00, 0xD8, 0xDC, 0xDC, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x00, 0xB6, 0xB1, 0x00, 0x56, 0x78, 0x66, 0x00, 0xFD, 0x62, 0x4B, - 0x00, 0xFF, 0x72, 0x5E, 0x00, 0xFF, 0xB1, 0xAA, 0x00, 0x75, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD4, 0xD3, 0x20, 0x65, 0x9E, 0x92, 0x0A, 0xFF, 0x6B, 0x56, - 0x00, 0xFF, 0x63, 0x4C, 0x00, 0xFF, 0x63, 0x4D, 0x00, 0xFF, 0x88, 0x7A, - 0x00, 0xD0, 0xE2, 0xE6, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xAE, - 0x00, 0x67, 0x77, 0x64, 0x00, 0xFF, 0x62, 0x4B, 0x00, 0xFF, 0x6A, 0x55, - 0x00, 0xFF, 0xA0, 0x96, 0x00, 0xA1, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0xB6, - 0x00, 0x4E, 0x8E, 0x81, 0x00, 0xF0, 0x7D, 0x6C, 0x00, 0xF6, 0x75, 0x63, - 0x00, 0xF5, 0x74, 0x62, 0x00, 0xF9, 0x92, 0x86, 0x00, 0xBC, 0xEC, 0xF3, - 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xAA, 0x00, 0x7E, 0x73, 0x5F, - 0x00, 0xFF, 0x62, 0x4B, 0x00, 0xFF, 0x65, 0x4F, 0x00, 0xFF, 0x91, 0x85, - 0x00, 0xC3, 0xF1, 0xF7, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0x00, 0x0F, 0xCD, 0xCB, - 0x00, 0x39, 0xC6, 0xC3, 0x00, 0x3F, 0xB4, 0xAF, 0x00, 0x3F, 0xB1, 0xAB, - 0x00, 0x40, 0xBC, 0xB7, 0x00, 0x2E, 0xED, 0xF2, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0xA8, 0xA0, 0x00, 0x90, 0x6F, 0x5B, 0x00, 0xFF, 0x62, 0x4B, - 0x00, 0xFF, 0x63, 0x4C, 0x00, 0xFF, 0x88, 0x79, 0x00, 0xE2, 0xD0, 0xD0, - 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0xAA, 0xA2, - 0x00, 0xA3, 0x74, 0x61, 0x00, 0xFF, 0x6A, 0x55, 0x00, 0xFF, 0x6C, 0x57, - 0x00, 0xFF, 0x87, 0x78, 0x00, 0xF6, 0xC3, 0xC0, 0x00, 0x4B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x06, 0xAF, 0xA8, 0x00, 0xB7, 0x83, 0x71, - 0x00, 0xFF, 0x7A, 0x67, 0x00, 0xFF, 0x78, 0x64, 0x00, 0xFF, 0x87, 0x77, - 0x00, 0xFF, 0xB7, 0xB2, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xED, - 0x00, 0x0C, 0x9C, 0x92, 0x00, 0xC6, 0x73, 0x5F, 0x00, 0xFF, 0x6E, 0x59, - 0x00, 0xFF, 0x6C, 0x57, 0x00, 0xFF, 0x73, 0x60, 0x00, 0xFF, 0xA7, 0x9F, - 0x00, 0xA3, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xD6, 0x00, 0x06, 0xBA, 0xB6, - 0x00, 0x67, 0xAD, 0xA5, 0x00, 0x8A, 0xAD, 0xA5, 0x00, 0x8C, 0xAA, 0xA1, - 0x00, 0x8D, 0xA2, 0x99, 0x00, 0x90, 0xB4, 0xAE, 0x00, 0x66, 0xFB, 0xFF, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0x80, - 0x03, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xFC, 0x07, - 0x80, 0x7F, 0xFC, 0x1F, 0xE0, 0x3F, 0xF8, 0x7F, 0xF8, 0x1F, 0xF8, 0x7F, - 0xFC, 0x1F, 0xF0, 0xFF, 0xFC, 0x1F, 0xF1, 0xFF, 0xFE, 0x0F, 0xF1, 0xFF, - 0xFE, 0x0F, 0xF1, 0xFF, 0xFE, 0x0F, 0xF1, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, - 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xF0, 0xFC, 0x7F, 0xFF, 0xF8, 0xDC, - 0x7F, 0xFF, 0xF8, 0x1C, 0x7F, 0xFF, 0xFC, 0x1C, 0x7F, 0xFF, 0xFC, 0x1C, - 0x7F, 0xFF, 0xFC, 0x1C, 0x3F, 0xFF, 0xFC, 0x1C, 0x3F, 0xFF, 0xFF, 0xF8, - 0x3F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF8, - 0x1F, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xF4, - 0xD5, 0x03, 0xD1, 0xCB, 0x6B, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0xF1, 0x73, 0x09, 0xDE, 0xDD, 0x4D, 0x4A, 0xD5, 0xD3, - 0x43, 0x84, 0xCA, 0xC7, 0x38, 0xA7, 0xC8, 0xC5, 0x32, 0xAF, 0xD3, 0xD1, - 0x40, 0x7C, 0xE5, 0xE6, 0x5B, 0x2B, 0xFF, 0xFF, 0x8F, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE6, 0xE6, 0x4C, 0x19, 0xC2, 0xBD, 0x2A, 0x9B, 0xA7, 0x9D, - 0x14, 0xF6, 0x91, 0x83, 0x07, 0xFF, 0x85, 0x74, 0x03, 0xFF, 0x87, 0x77, - 0x03, 0xFF, 0x97, 0x8A, 0x0B, 0xFF, 0xAE, 0xA6, 0x19, 0xE2, 0xCB, 0xC7, - 0x2D, 0x70, 0xF3, 0xF6, 0x4E, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE7, 0xE8, 0x27, 0x0E, 0xAF, 0xA7, 0x13, 0xA7, 0x85, 0x74, - 0x04, 0xFF, 0x7E, 0x6C, 0x00, 0xF4, 0x8A, 0x7A, 0x00, 0xC3, 0x8D, 0x7D, - 0x00, 0xA6, 0x87, 0x76, 0x00, 0xBF, 0x7D, 0x6A, 0x00, 0xED, 0x77, 0x63, - 0x00, 0xFF, 0x8D, 0x7E, 0x06, 0xF8, 0xB3, 0xAC, 0x0D, 0x7B, 0xFF, 0xFF, - 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xA4, 0x03, 0x62, 0x7F, 0x6D, - 0x01, 0xFC, 0x7D, 0x6B, 0x00, 0xCE, 0xA3, 0x99, 0x00, 0x4D, 0xD3, 0xD2, - 0x00, 0x0D, 0xFF, 0xFF, 0x00, 0x01, 0xD9, 0xD9, 0x00, 0x0A, 0xA5, 0x9B, - 0x00, 0x3C, 0x80, 0x6E, 0x00, 0xC0, 0x6B, 0x55, 0x00, 0xFF, 0x80, 0x6E, - 0x01, 0xEC, 0xAC, 0xA3, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x06, 0x85, 0x75, - 0x00, 0xB2, 0x71, 0x5D, 0x00, 0xE7, 0x93, 0x86, 0x00, 0x37, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x94, 0x00, 0x2D, 0x73, 0x5F, - 0x00, 0xDD, 0x68, 0x51, 0x00, 0xFF, 0x8A, 0x7B, 0x00, 0x94, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xB6, - 0x00, 0x18, 0x7F, 0x6D, 0x00, 0xDB, 0x7F, 0x6D, 0x00, 0x9B, 0xFF, 0xFF, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x87, 0x78, 0x00, 0x91, 0x72, 0x5E, 0x00, 0xF7, 0x86, 0x76, - 0x00, 0xC4, 0xCA, 0xC8, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xB3, 0xAC, 0x00, 0x25, 0x86, 0x76, 0x00, 0xE9, 0x99, 0x8D, - 0x00, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x86, 0x00, 0x3E, 0x6F, 0x5A, - 0x00, 0x74, 0x7F, 0x6E, 0x00, 0x74, 0xB5, 0xAE, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xA8, 0x00, 0x1B, 0x7B, 0x69, - 0x00, 0xDF, 0x99, 0x8D, 0x05, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF7, 0xFB, 0x33, 0x01, 0xE8, 0xEB, 0x3C, 0x13, 0xE2, 0xE4, - 0x36, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x79, - 0x00, 0x05, 0x4E, 0x36, 0x00, 0x05, 0x80, 0x70, 0x00, 0x0A, 0xB7, 0xB1, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, - 0x00, 0x05, 0x81, 0x70, 0x00, 0xAB, 0x92, 0x84, 0x0E, 0xD8, 0xE6, 0xE6, - 0x5E, 0x4C, 0xE3, 0xE2, 0x61, 0x30, 0xBE, 0xB9, 0x03, 0x19, 0xA3, 0x99, - 0x0B, 0xBE, 0xA7, 0x9E, 0x09, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x8C, 0x02, 0x49, 0x8B, 0x7B, - 0x06, 0xF0, 0xA1, 0x96, 0x18, 0xF7, 0xA7, 0x9D, 0x10, 0x7C, 0xAA, 0xA2, - 0x00, 0x29, 0x76, 0x62, 0x00, 0xEF, 0x86, 0x77, 0x00, 0x93, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCA, - 0x21, 0x2F, 0x8A, 0x7B, 0x07, 0xEB, 0x69, 0x54, 0x00, 0xFF, 0x87, 0x78, - 0x00, 0x72, 0xA5, 0x9C, 0x00, 0x37, 0x6F, 0x5B, 0x00, 0xF7, 0x7D, 0x6B, - 0x00, 0xBB, 0xE9, 0xEE, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xB4, 0xAE, 0x03, 0x20, 0x91, 0x83, 0x00, 0x8D, 0x80, 0x6F, - 0x00, 0x97, 0x96, 0x8A, 0x00, 0x3B, 0x9E, 0x94, 0x00, 0x4A, 0x6D, 0x58, - 0x00, 0xFC, 0x75, 0x62, 0x00, 0xDA, 0xB5, 0xB0, 0x00, 0x1C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0x97, - 0x00, 0x60, 0x78, 0x64, 0x00, 0xFF, 0x7C, 0x69, 0x00, 0xF4, 0xA9, 0xA0, - 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xA4, 0x9B, 0x00, 0x4E, 0x88, 0x78, 0x00, 0xBA, 0x86, 0x76, - 0x00, 0xBA, 0xA4, 0x9C, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xE7, 0x00, 0x03, 0xF6, 0xFB, - 0x00, 0x08, 0xE7, 0xEA, 0x00, 0x09, 0xC9, 0xC7, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0xE0, 0x0F, - 0x00, 0x00, 0xE7, 0xC7, 0x00, 0x00, 0xCF, 0xE3, 0x00, 0x00, 0xCF, 0xE3, - 0x00, 0x00, 0xDF, 0xFF, 0x00, 0x00, 0xCF, 0xFF, 0x00, 0x00, 0xCE, 0xFF, - 0x00, 0x00, 0xE6, 0x7F, 0x00, 0x00, 0xE6, 0x7F, 0x00, 0x00, 0xE6, 0x7F, - 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x00 -}; diff --git a/dependencies/reboot/vendor/MinHook/MinHook.h b/dependencies/reboot/vendor/MinHook/MinHook.h deleted file mode 100644 index 15c0a87..0000000 --- a/dependencies/reboot/vendor/MinHook/MinHook.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) - #error MinHook supports only x86 and x64 systems. -#endif - -#include - -// MinHook Error Codes. -typedef enum MH_STATUS -{ - // Unknown error. Should not be returned. - MH_UNKNOWN = -1, - - // Successful. - MH_OK = 0, - - // MinHook is already initialized. - MH_ERROR_ALREADY_INITIALIZED, - - // MinHook is not initialized yet, or already uninitialized. - MH_ERROR_NOT_INITIALIZED, - - // The hook for the specified target function is already created. - MH_ERROR_ALREADY_CREATED, - - // The hook for the specified target function is not created yet. - MH_ERROR_NOT_CREATED, - - // The hook for the specified target function is already enabled. - MH_ERROR_ENABLED, - - // The hook for the specified target function is not enabled yet, or already - // disabled. - MH_ERROR_DISABLED, - - // The specified pointer is invalid. It points the address of non-allocated - // and/or non-executable region. - MH_ERROR_NOT_EXECUTABLE, - - // The specified target function cannot be hooked. - MH_ERROR_UNSUPPORTED_FUNCTION, - - // Failed to allocate memory. - MH_ERROR_MEMORY_ALLOC, - - // Failed to change the memory protection. - MH_ERROR_MEMORY_PROTECT, - - // The specified module is not loaded. - MH_ERROR_MODULE_NOT_FOUND, - - // The specified function is not found. - MH_ERROR_FUNCTION_NOT_FOUND -} -MH_STATUS; - -// Can be passed as a parameter to MH_EnableHook, MH_DisableHook, -// MH_QueueEnableHook or MH_QueueDisableHook. -#define MH_ALL_HOOKS NULL - -#ifdef __cplusplus -extern "C" { -#endif - - // Initialize the MinHook library. You must call this function EXACTLY ONCE - // at the beginning of your program. - MH_STATUS WINAPI MH_Initialize(VOID); - - // Uninitialize the MinHook library. You must call this function EXACTLY - // ONCE at the end of your program. - MH_STATUS WINAPI MH_Uninitialize(VOID); - - // Creates a Hook for the specified target function, in disabled state. - // Parameters: - // pTarget [in] A pointer to the target function, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); - - // Creates a Hook for the specified API function, in disabled state. - // Parameters: - // pszModule [in] A pointer to the loaded module name which contains the - // target function. - // pszTarget [in] A pointer to the target function name, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHookApi( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); - - // Creates a Hook for the specified API function, in disabled state. - // Parameters: - // pszModule [in] A pointer to the loaded module name which contains the - // target function. - // pszTarget [in] A pointer to the target function name, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - // ppTarget [out] A pointer to the target function, which will be used - // with other functions. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHookApiEx( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); - - // Removes an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); - - // Enables an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // enabled in one go. - MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); - - // Disables an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // disabled in one go. - MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); - - // Queues to enable an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // queued to be enabled. - MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); - - // Queues to disable an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // queued to be disabled. - MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); - - // Applies all queued changes in one go. - MH_STATUS WINAPI MH_ApplyQueued(VOID); - - // Translates the MH_STATUS to its name as a string. - const char * WINAPI MH_StatusToString(MH_STATUS status); - -#ifdef __cplusplus -} -#endif - diff --git a/dependencies/reboot/vendor/MinHook/minhook.x64.lib b/dependencies/reboot/vendor/MinHook/minhook.x64.lib deleted file mode 100644 index 09eb5f1eb9692b076cf19e47a745e17764e92819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292260 zcmeGF2Xs``7d8%`$)piV5_%^<=n~Qh9Wt4c88VHT384gslnI1XlL<|PAVrEGQUnET zh=7U|DGDe}iWHHeBB)4_UIY|Hf&8C+ZpkD@eSiPtTi^Gs^-k7g-@Es7+CKa2v(LGA z?rqsSr66r&-+(S5Wj_%yT_d8qM#Myfm*q>R5fRbd1j+CK##lSX0z!oE{kcqW?9l&L zzRKc`tb*^zbXQEYGd;5~r7(vHC+?KgY!_1(xKi9MM?p$XeqMHFu1i;xo952U%Vqug zIn}Yw@UHO|ojFdQ5EpCGJ1q&Z62C{hHD1+UZ`H*13soD6awVG0pI##W=s&z)Ip%kPs*vp}Gu?Z@x9$#xI%4~5s)i$ll z;h9~0tWKX`Qd!iNQlLp|ve*VYRYs#lU0SdqRrzagzQi$kk+cw#MPeS*=T z)s|wZc%T5RYOr&O4%8e^;_-l|qx%qA)!(VSqm zB$;Cwj#c^j+2aNjxr$urbSl`SJ})n;?3pS*^KT68SYl~l*sx|Pi8j~s%#fSu&P>V9 z9Pc71FQy!x^U5Z&xpMMG%Ng3;Dej^|N1okXkeNGzvPsO%EX{U=bEMvtlFvX<=|a%V zLStT97Mi2V&dy822#YJq$Z!=fU4ctFEUlI(GZbpay3&gHxKyR57q|)wnP)K~Y=kr4 zgvu3+i$l&R?0@%L;oW;ke#;wW-pq@6^S^(>d5h`2 znF4?R*O$nHAkGl`e|^c{Tw7K7l5(T%A1Al}br@p6|Npy>s?d}CquVO)Wd1RJ2VRBApF8R)|^vr_f!h*D96iDBg=&-b~ywp+bU!ZO| zc=>NEFXKOROy$m6%q^gc6!3}l{-+j3gonq(#Ds)&?Ge+XJI4+WNS_|e&a}--{pA8< zYWP+9gu%6^xktN%GscGDV277OOrth>V8uCeaWoLq_bx*ubso@LB`ioj_A5)xz`UcTIrnvC5Brq;^> zZV5XJh6k=s#0ev!cREsragUl8(0 z1}3{au7dn#0rN_EoM0~wUK#w`WWZO%NIY&YX(O`=W1=M%n}MT|7vxjn05JhfxQj-s zQzaT5MnhcBRz*db>0#NKsjdEx*hr!_Im%%zMvYlz(%M^vP~dSF-*@pH$rQmqkVw>&nO2Zjn3v%WX>aQgV##-B=46gXtQVrr%gKj_DnR|HzNWcy&QJ}V{jVimH)fM@^A|J~JRVmj`!aohrdB)E8m-#M zD@ZIaVwvn}tIDoc8Ch)+$=M>0nn+M3hpHqfse{l?d+ zH3zQ+&mz%g9AYtRomhOTj82nEtv8spytX7)Fi8#zu&K;i2QQsOUb4txOSEG}B_~qK z5^gq>s0qqz?OC2p8}AecFVB&La$zLIde+2RB3WCWOl_e>UYyFVb(%2X4GujmSy3pN zT}KYlXzgll?@*wYH5T~_CiAI3=!934(s-51pf4_xk||3?j=@%p6_b^Ph*^4<$_yr} z(V#Xsu=2OW^=GYt=*(LZhk>V8nKec&CAXukRxFOSX7yke1yHz9I>wGsH5gr@GsHV# zYi1*q@5H#IK8?pR8>7yMQKw;~SsiFT}%Z6;V3Rhz^LR!*!p~q+hk`NB4RA?{{gnQIr&q%H!98sxUIMk^O*rQ@kA&0&~BP^zPV;r`7 z)LJXwKhaod#|7zNe@>msf$};59mmoAEpbj5D|V2a7@AHSN^`;l9X5+m-2Y;cBG`-l z8`z{8AH_Zw(2qT^T(FNGx;}m{P`O<`m^{$71AdC&xmL9b;dIL%0bHLQ5j5 z#7&AoUd#i8o;9PZfkQ;$7ff=cr`(2NidcXH+K2#ePe7bD9_3&w%xJ*?f-T9F@$rO7 z2ozKX_v>v-Tp`-xJKIJ|o;_ya%#_h^*#`^eEc{ zN*_bJSr3`sl1V= zl(d67QK^FCwQ&zkxit2~k*kG0Q`~H^V;kLKRyiE7HQBzKc%sqYhyiR`+O(D$gdI?! zc1=BzYNOqN*w!orgV>(OBqEtxGf$vF+}bWRA)1S*p3OaBf?FU@B0G*2o^qQiNv@DI zKtenL=*mHZHJDNb=R(mF71GiZLk`qRfn~hbE*I0v6QQfSjY`m0Vs9>OtOhK6~W+V$oClEHQON1#!wvg`R2Neb%tk2rF_@is)xvbH;UVnrn)xYo(j z$x~$jQC6p(B5#}A8=XDnc4(EZ;E3HO_ePl5`(d77_$IpnO9wONKcSmtyfia(@x+(S zoX@+KB=n(VTH&5x?k>f+hDpUoltKJ$Bud_uNi#^KC!U+Tc8~)xyTNQS*iC%hEA>s3 zC)Ao4XEfOL@V&C@mkcf16GvVED}b^dUGmgjJ&|_1F>#R7tQr^xCzT+Ef7I78Wl&lh z+@Dh#n5Cstut?}`Wzc4WPKQfjf19SH@!Z`L9TOdgkOvkig#EN?r5wv(u;LdMmn7-o znHs~5>ZWmq%ZAmnLV1KN?^U5ZQkM6wP#z`A`&1~8mgRjbly{Zo{VJ5l$nw|<<=tet zszP~pSsquRyoW4TS14D>a!rNuI9aZ(P_CBcx(ekQSsq`Zyfn_#S18xXp2bk1JR)2M z^sg8YAp;UB21LpLW5s|dz5ukq2C;s_WqphZ?v+fc{&W_}cMWV1V^hyybz&4I;Ce8k zcv?pj9}7e9#qb`>c7zjrDNHhC37J`&gn=eytQ`bDW|tvY7XpIa#J@wN60j(wToB69 z;!B6Q%fTYV(y=CljBl$@35aHdumngk8pa5RpG5>jev&GMWg?Q`fvUM0syIX!d>e+O*w3PxX)#u9+Bl2F!Qhc61%t(AfEL6Z7z#HCg&ot1P~ys-Z)ZArF=mTKiya=m!j;(y z#@X13plt-c*-B_HfsH`XW{88v`7Q_vl!Cy4S&45q5YJoSscD4;Ye4jcy$A~NNa!OL zV8#|21xq@u4bilgZ*h{`*Hg|HHN^E3xafIW@51g-aXai&$eVhAQ2t`U789>L?aUFo zn!uL!M&x=1l;sOXKxX8z9 zl@Vb?@oZ^-jS?!$NaZ@yWJhA}vSNpZcM(Z^%1EpR-pmYM6=5~bcl3nN$<8Ad5=u*T zE)>E?K6%@@10#gASmy|IvrUEJX5>Se#L`loi;ak*6IJnASt_m2xs-+?`5Rd(EzP+U zyVv$4x*|ZDpq!;OxsX=nv>FC!jdnS)vX^qWMSVc+UBX?8;ke1h_06rKfEaDwT7-?-SR0S%f zD;p$`7Sdc`Flcy~P6BD=%muV3<)oe^2P$l*$*qtU&qDDIn}FjBKa5ivij z8XNX~4cKatZ9`f*bGfu_f@>{$?n)^KY30lj*fDj$Ub%Hh>XcT^93b8$g>55Y3qjVF zw0hXYCVR#@R_z#sxz}MBNXxH5-DBXzD6Hi(L=J$A*A}&Fk_V_ z;SPezrZl+5CrBvh7kiQTxWp&&F%!}NCa*$W{4B45Rb@l3V=Ka9M&Lqs3G(WZ5Z55M zP-in>GsrktPK7;BF2H<+XaZ9cIXNjyTzud{(Zu-{yPPF1J8+@wtH~0mEL?Kn0$dr> z!!?nW5*wEqIGei_7^fZGgo{EdL?ATz5X4`~k~VxeLdBikygKxWZ&llrP;;W|KJ=yP&vBs}(B@ie3m)!?SRXl8dfcnw$?6Eq4@@ zsFsHWaXq(p;s<(WrpKxPHyi8t(u8Y%Dj>L2jr){wMOwNpL}k+If(8TuaM4->@N310 zw&0qju#y0{bS(nNtc5F2lmXcX$#DVOQ*Nh?2a?l7MRIRhj;nl_>)-|9i?Jp`A$Gp~ zMJS(A6c#3GZ24IettOQjE{F$lw6-FguZ)YsUhF^w>UOy#KUoIfPJ8lB69x0auCrW{ zzl`G7#l_3wbdfxPW?~*BQAyQgoaDIZf*9XaByoT&mf9oCYgjG{8_sfp)n%k~1yHt0 z?ptV=iE^wV!S8KZY#T_c4B zPHFC^36fvfkTMOD6Y#|)1xOBy7#`7vKNTD-W9SA6y9&EP)CTxCbpn%0t}TP&agmZ- zDf|sxN<2??G*EpLciLa5#MG&H{jNqGTe7BVN^<=(e5~4ex zjZ9oy!!;7V&L(XAzhRBqcop`YX=#owp=}1aQya)&;hG`30s${VM&SY;AJmj-Lm7uP z4JleSphmJps+vP6fooo>Wl!nual9Zp;ZK(qb%Me2XM>MUFgt_vhhM@|%g35lXbC_WI}I%p2A z>BjR62}W@zP^GIdx!^<@7Ytkr0S8m#TMjM2qU{hT7GxTu)1b~vcNubVUsravGdw&z z0z=V1INz5sE9Nl@8~yoqs9X|VqUCC6O__+fVqb=7olo%>nUftSMU1~HhGz8_u z4aTHLHK>gfE|GePD+e|~`I3Q=rltFNL}!jIZij3_cEov32d>Td2h+xz&6S^>lIAK@ z=N0JF3(Q41u7b=ojVlAc;VI;GX@vrL&+{CrBMIMhDdeZ553)(z@IfXTO!c-SigUnu z_ypi5i!tU6Qm%cuF$5bwG?I}e&@HzNv-EKL+h#Z5R`7T za!rw#io&)SuDF=FB~e5S-3TEu?_EMr@!e56)wijDKpA`-kl`q)MFTAes(B5Nz*SI? zn}-A>eFo=A+^pz~$`^{K5lC}7^#u>8Ec|{C1bhB`4@|OE+S-DR(sD=WSzOSuwD0MSV&x7EOX#Q;VfB1O<>?w-xGNdJmS|f!s(CxA+Isx(v1QSdwwy z&=w-P*$M9J-)?n+5BBH#KF9)o-i)!vlQ#sL8wze0!c7+%yNO#ihB{XhDJDr+wE6S9 zX^>oqD!HPmDMe5vSrTp&qORyJR1^0O$%too_wsC{(MJim{~*^!H{c;(x_eAcL)|A_ z<%Q$*=eIwVz3~dOc%rtfqv4~AdWtqVr4A5#DuNpt4SdlzdU`URuo)84-9D%Ze%2I+ z+g7Yti0ZNML_v104!TKI7$nr~bx1js6rD((mR8uL9=^QhhC#h7HI&LDRgu|7MZyfp z)M#G|Nob=Dw?zpXbmS}Y0p!+6AX-asFHEZ{(GQc_=mt9^mhQfjb-_m#Z_=;GW^5yh zE*T3^?jAh&Mq0=9_nzx?xYx+SqwNbn{W@b_X6*6>xeph7zhO7--ZpXE7vr~WOfA%X zJ6-$6!BNBBedS^J!Q|AAV+%VzvvsZCyxre3wvgkdoj7IO9WwWi%On2iwSDLtpFLS0 zIDcco!dd4}FIZS@)`xc(yToy!&uZJMN53&9I9(Z^a(2RVw_3Ew8};+%`l(-9FMQVf zP8Y^Hqkn>NeyHk$*8S~mS#=hXV3t1=Y6)L~D_SMO^)pP2$ zc*DNctMm9>!Cnjc^uE_3>#t7`uXs_p-ydHcwE2tJ-tYaeyY8B-)lJ6M=~S~hI=?jhj9=@0w@x$G3^!+oC=)L{d3MS8DYrLx zXS{uXYVfbVdS&VdN6x?Scu%W!F|Oe$jE&&9haEGXJ@Vb`X%BMOy&b8!H@4r0b6z^> zSJ?N-_BY#{IQ{xV+=R|?(NR~Lhc39#aBuCx;Vt{c4~U6at2waeQDD9&xv~Xg7LGfo4EuIbr>Vi+ zliHi6Ux^u7@5OzS77a=EDgJrlEBnt4eVegm9Jgga#{6#@uKH{5!F3DX>wE4Szqq-h zly!nlabcau9e?n9GGiAxF4lE*ci}V1bAI2|*4$x*{{0$9KX@zl>(N0Eo5v^2A37t6 zu`U?#Ak#~q6r6)>)6 zm)BmeabeMS!`HQo+&8cA(mIDTd&!04>(wLRO!jcxi(Qv@E}3a^@Vbo-aEi66GaS_41S2vK&KnYp6pnuw2Tt$#FicCUdY2lHNkcG>8jnxC}m zl_Pe%I2#-G9JjJ&t>2Da%Sr36y8YT>_p-Xrxc+cupSv~ew_baUv(8e?xRT?xx-~gn zf@@rJ{1xy_pl-pwft}Bu{yOif%J<&w;x-fOY4#Rp8olRO6m)-m z&a%wL_@T*EjvJTr)sXp{-yhe)RD6Ha@q2T|%xat*oNY;5@i1!bCmr-p7(2mnV;2?Y z*1Fty#h@BLJ^fmZFB8XXhzmX6z+St~M@Nn+Tt9Q$P5OKNr}kUDVeYmc z+70WOcO?1X%TMBhZoJvE*Xs0_@gobj$z`K8|v6Bt{{aW>1FsnKT_r0%;Du%*t{WA(=!8PRw7)BV=2 zo^>W~$NT;mmlrth+^X5(r#^r8(@DF|PVD@vchf=3xBAXbwubB*(PV_C{yErHyXsWG zsFxx_b+4aqH|OhSegEn|=*+1u_v#({?(TcDAJ?zBI{f$FFcorK4S!v~9Yb2Lo*tHz z`FfY|AL<_Mv+12`%1e*d^yrwhu=9tE?c%sE{5r1ByT7pQq({lA&dz<_uHSig?aSX! zeDl$lh8hEB9K3-AFMin*qFi`qXu}4l4n44L-!bX*GcOb_`ubj0og;JZ+ZJ8*`)l~C zMnqm5*HE)R^Zn0`ZBw-U)pB&lb5S$=f8U()g3ft+!n{RahSn)&>wW7_k-hgqMv=UI{pt({xFF}AgNb zXFRxy_KxScDVt9gJiMeDo6=7kx^0VjbI&*4ozo=K=k|B&Qo4qHV7X?##H}B2dJL1Uh2~+>w9_BxQ_cbI3iR(Tps?(zSd8N8f)wiICSy@b~X*$@$f~^ z%Z}?q+=qT_*i(P^`qm~n4&PQiYmEpU|B1Qz2b#A66Q(hi%WTSPIdm$d; zxaC{+?``E=f7{n})cJ4+i#V>UwK>e$lUH zr=dgpj2=`s?CyZQan~nrZaee#T==z%9QXXW*yL|leLjDq|B_Hc!MvkypRe8F#H9&0 zrxksEYybX|#`w`2)`}s@aapa}7B8OXH*@MIjU1gPzj#G8??iC*;5QcRS+#dYr(r+C zPC4${Ywx`J?3ucoqxaX{d;0L$RZsOl^zvIRpPH?_Ieb{NqKmnV?dQ0S>&9eR+TG2* zyrgk(*X$h)(`HYfH*vyyN1E5z_+{Q2%bU1(gn%_f+3=9fyMEHkQ+C8G3z(ZYxbE5H zqA`9$7YuIDZ~qSM;KbpKWpUhaQ`2+WeQSn(ajePC9*2DHOi^@I1vQIa+%);yq=|iO z@r-@Karb_Dd1}+XPr5XmbVd2*Z>dKvI}Sa6`Nim%CF^tdPg?qB4~&nxRIcmDSD8bSQGGhev>;_@5T(LXo-rD2+X+*|EF`}AdRKj^P#J*wZQEB%gJ z!eYJpL>oU*AO3FEy_~D>OzIWr{2_aGo{{%kuPYfmdB5wgrmKC&?eYs;k>T5OWWS@>=-{}alh3)^ z4Y>K0>dckXk=Os+(|BT$+uv(Js+T7{&=Z?EJ|Bo*>PJZ@4(}+z|aeHh-D!1Ow$Y!UWf2XjZ*#w)j zb|Y8&v)@-AxbwHQFMl)ssnI9LVH}O-xZJ>*5zD)E8vb#Bs{5Pi&H8`ew)-24YWOx- z{8#;y;=7AqVeA`@%U>JZmi2PDdw+ad(m*;jiE`>4~E#|JJ|Yx{P=>kHejAN*k1!!FI1 zFgA&7hD zH>GV$|J~m_qw2fzo9iWmCn{3bW(_w-{e*iIn^3vK)-KrnSFNv;>Q~!&^SLjV-?;Z; zjkDR$6z^EPM{#VndHWEoD>&|A?c?o-ht16ypv|k@>W#_kTg^It@Ot)ZpLh4^k+JGT zjhFD?2#&jv6+7q964TA<`P2K2%)8OJ+YfbK+dpLIoL`%t8P()_{jccXrc`dfA=`b! zF1(~Va^{&6w;C5`hNX=W5QNH-EfSvjqE89G6-2YPDbMO=;UN(#(X-)ckuK|1edA~M&(aN4X_x(8Sz^d-=nHIEpJ=58C zP6%U7np3&!ZQc(io0>g4VO57s%~bQhx-_QM-PBzhPPTfuaOW%5b(k+_aNIjl)>jv| z+Iwl}!&!}bL=3JTayog$x7!TGF=N zM_-QXc&ShR?M{1pW!+XozX*O;?x z#%1>-V@go($bI>at+h9PutwYMH@)vP@= za%@R4n3+qKKWUp@KYJN2Qz ztXM$o`e-_eZ8sT{Yk2rnx|i|k3Vc!@OZ5Ev(AJKy?>nk@`Xs|j&rPp?O?{J6H!Oy)g&W?C(Img+rT0UO7@s52^Zry#m&+lsC z_)@p*Nu!tV46#4R%4(TYg1DXIZmajL=<-#yGfEc!=D9}i=6c;qd*QeKztj)=;?uk( zj;mV6qC%ikFbintg z&j$oQ>A0VJE=E?4OnxY zt?$p;xpU3*I;*Rv4R3dB!aI|uFs5ot^*gxmxBmNn8l*|OJNm)Mjn(TWJ?r~krveD3kw;lbCI*-ThRo#ME5 z^UU+Ab$2hT{m$_#s&!wdH=337c6{jWA5LbU3~v>Bjxg=0+#zS)**0RT)3mwN5kG5cVOk=B|Zzo&*^JT-)z{r#4Eo2 zoYij^H~s-Way`eHOU#s72k6Qu3zz*|2+H##}(&1 zY14D|gzQfrEt+v+eWTgbzkFa3Dh|NVt` zgFlWMR{ibAt#m8bzTflxr+!LQeuoDraNL3FzLtgxeM-Gyw(U>m7v4JYecLzdo%=R< z(ZZgG$7%2V&e(a58=;p<(9T$XS4<2(! zh%)5$agVouRP7met-%}5bk3fBVM49tUv;{@Y)8w&yiY^hu4U|Hj`Q~Ey5Y6qZOzWh zi(5?C(0ga-XAR!J{obsjEiYMyJ@;e|#^eti_teS!cP|BZI6mw4_xI0NuN~w1b6jN1 z=^s}#i8(lERHs4J7;D>+%3X8J|FfxnZ@m(v3jKQRh48r{=J=CsIvwqJqGn*rZd3cD zV(*#bzL|f-a&c3&?K>L``}K|~eMX&=8LWBy@}DvyTs0lD225mZFUQUD-afibHSZUG^mobaA?_*um5ov7SN?{-|X`oXUoF3-s;`u5lLrcO>ZkR=yW zx0IY6&@`&r`^$dKN?m{EOO(5s<6eC{`Jql_{Vg+X@Ah@?Eqd5%%7j);!*H0!qIFP*h*JeXTZ<#yw!;l}pI92%Ko@HMIZ9CQQWZ{dj1CH|^ z^lFpBuzAarL!JcIf9rbZ^LrO;dU?Q)nf}J`{6+@-dBzTMT+>Zojc+;k^WNjSZi?8D zqI(qBr^BgU$LHVeFxaPA>gRKk;3vCKx$8{{9WNH&Z@INW`uWV4cbvL(>)^@98_tG) zzkA!)8*Rs6Q^PnewykpByie{GPD?LuW+1GzxG0A(ET>y7hH~_YKIrz-8iM*Z}+2i-_RC!3YqGBf_*rS zyLvG_>)giHTV9#m|Cxs~#y0Np{Gx@Kx|cUB?VH+V>C%VqWB(MU+BpLM@L&^bLEZ>F zrznI!?I@)E*zPeMl9PmInS>-{x(kyd!jm&|)3S^3+@px_u<)>m9^uguVd2SzxQOja zPcFz$D@@4_8(FEmigJ?E(_J}LkWB_2iIS3^nNg6Jlailb`D%&zRWhSeUFEuQxwp!4 zODPtDd@V;t8|9213c@j${LzI-ZeHKcNbK$nW)v6yfHD+LOUy; zSs@-|S&-=-N4;4kc3L>nm7QJroJu`JdYY>W{1*B#*Ijva;R$z{>Dg6b`e_C3Po~Uy7=)9uJW>v&nmxssa6;w7Wu~zwc`S~enS%R|u_2FamP{Pp> zVNqdGon6t<-J|jF=a}@cG)#lJ@&gO`@7eIk!b;E5X?Zz0@XVFZs7iVe&LKA?$5jYT zRn1_Ach0XOdxtm8$t+BRXQ+Z%l^$a~CbyDWmn^GrBw1D!)C!TzNVd$*qcIR}Oz#dX=@3 zqBM75WdrU~b4MUrd9#2=7>!xAva1~!1s;6r8lRV2H5SI7NLzW$qgoi!x!IL9Dk&)D$W2#~WE6pL9xiGejl$^}$ah0uO4sFBc7FKqntF&gcLP#0ms;b(R1_xEJ z>=>1oTKQ2bHnlK4D?L4{N@B92g6y2Uiq>e!rH}9)m|0kqk{x1q7o}(BB}axwMkeDi z-Z@2hW6QYYf$C&OUS4)#vdNCai0H5=tm-2o!lUHGh(Rk8PmfJfNV_=l~cP3qyt~liWpL#=BlBcB0KXdC_V-y$Xy%Sk+hdb^x(b*l)ngJ1eOy_*M#}XjxbJobn3_M^>~V{9nvd zY+O~DI+ni9v>ZHzqSA9NS5$$k3a*u79bH)A&cgqqCv==JO;?qsP^)ZlI9HXEfjh0d zQDtPNx(W&_o`tF|ipBJlQcwkbi@`*bNEHNmk{iQ5Y^5&_3!^;WRZvA&nS~q6DqpYC zHWucjRmFTH-J?-SvlHvZuQ2jU9F_GRf6tJwmeMNgEzz-=bX~RbBesGX;-XWfElD+wlICPv+6R18nJDcoie&AqFwAQrDay^ul`2|pP5qydqJi9wpC&$P}QhB zTw=?_1%;}(FId{D;=9ZL;O74qwTT8N#*)#MbOdN^PT|-}-^eajN(f1-V!=n-ank)6 zQI&5a-F26qpP63;=3iF-5tXkS45Vsq+DBjV+uOuO;^z|hi7g%xOph5g2EP=<*hBnY z9zS!!WAq-2M*(c*dn-T2m;Up=UE=41T}O7kh0lhSE8pF<>)SIw?Ygw<`t_fFT5|CA z-IXU-u6*nI>$`UC*>zbtDR`1%lA@nN@&4?2=|kx=f9TNB^XB7!>1R~oyrDLHh%;uw zm}x_Y<_{geZuIC<#L(#qrNUeJHU5q$b|`;QD)BI7d`d#_QQ-5rS5QewiGnGEOO&7Q zKj;<2N{)by<}d}4mXz$;6BO*F1Pd@Q@x?(&5I(>%q`=1)4{-G=VY~JqiBfqe7Ehq@ zrW_`*D4rA2?BuEO&|S*G^TYW&CC((sWARZL=)W=^43M zv9Y6ckm5U36B|o;`QoGS_4V@gMK=WmfaB%o=j&Ay>{>oPUS4?QEIvLsg{T(wXAmC4 z8GFC2KEu#_Q!U%i|u9ycBYoFIVJ4#61J}ddbpt|sa4yb z)v3nn`?ChsSf^_2!xF!ZC2Ug(+g!r-D%gRNomc$XFJ4SP(-`WnpK?>LpP3vQYn+4M z72=maGu@%#dg*vVXnW)AJ;s^op&^kcw2_yLGbe=l8)ttp!x1_%YL^E5;fC3Ne1czJ zvit9;HUqBnT2UV_*y-^F)d%gb+Ur?X*K>=T>iuaThtq9z*XFGMI zer9%P_t}Rvfm=?fc3)^P^@I_OhDNj^C{TM)JJZ@SHgL;<&|iAT7L8B^ZoA%`PIp~Z zw%SWF)r?p_cRf^85&DNVaLc9MA8P_N7kRq`oL8&8!1&Y2S65?O{Y9r^1Hh^#wocBy z8mjPn;Fj-hxPYjRgV^Gdz@oYYgKGPus^HgvK5n#xOWxs#jd#7Vm}z<=((8(O$8|PfCi~s3sqRUEo19TMkV5 z=`n9-Q^*GRs7_;0tfz|8)H_@(X|WQ0!w(L zENYCzd-QYaex;w|LzPE^mw9=ksyFJ29Lk+@A49A|N>9YFsYP5Dz%q*Bd^d!*W=?5zlV zVHaw74ZlrfI9C<_=^gmOyL3|gry_9LJ0x3-f0M7{SBWfe>NNbH@~4-3Jg>i=@(nsUwRt~=#g zk-Ni`Yr*c|Dc2NkpD7PRidsF`TdkqY>Me=qXJaS%X9RNKfaYo}gvx1;{jM}vm&1A(7eFL?B+^8M6WkTr4;)gz}K+T^wyl3NtbmH!( z>UpTBr)rA6r56lk*HvE(L5yF(aiR?MQ_Zjj!!E(9gTuOLMo|sbgU=PP#}dlQQ1S&1 zk5TP(^sm*Fhh9Yn-mTE4YPLc%8(t7L(+sc!M&-d9{YhAinyCV}3epTuaVM%vESjZ2 znay}=DP<6uA|GKeLmE#;Gz0z?&dfL)ZcUHV_Iez3$IuIM55WIecZ&ym{n7s@(;w=f zGD-1NWW8&1Mdj9}GD8frN#t*UF5 zX2s9j0|U40QtfAf`YE65_oBqz{2;Ien)5Fonql$bGi?Qw3;*#Sf(uN||G)83`g+q7 zw|EHWjVHU~K`Z!rvoZJ|h_902H|Gcs=qMXjNTHrLs|QUBMhPn_afBy1fOil_ z)G8%Af};lfh(%1vG5|S^vuGP!W=xKwr{WkG6hS+ z)+oXzRd9bOMELaL=L2xwi!<7Y=L$BQpZg&Y(*(ob5GVHyuF10*S;#>NawZ-4xfSOf zc%mXdDl>#1=jG!`w)IhFGQ?4wmF4#nD`F!QjeP{Zf;Hz^rTC138e$b)l>u_{u{>*N zlx^i{z4^Hg_@8+iZ=N^(F5k}O34ZD5=I7WYA8O|?@UL-PL!NFJLSzNHo3RZZWu$Q# zb;WSfHCxN`#ABXVI-RnfeqRBxS+Uf+Hu9_kMYiSB=v+k(42;^)5WL|Wo8;roeo#D6 z^ih(&LePnLVg)^yR~2kPMV!1cz0k+i@CryTG*{>hE47eqL7=^wSH=!pKF1DkG=GFsr@;yqB09&XMXu0^`@oc9f0*6qzULgS^CO3TPj8Bxd+ zYmoQ^FYq0&>TIzW6-s9E6X$vHN|8DIz|WODa}6@Tz|Y_I#v6Coe5^32M|9u|X0lyb z2wtf*=NGs#xZ)|*9BMKmBrhmE0N>j9HpaIVzEnK*OSp)kY>}y`*x|t2Sx=6Uczyjk zBd4zT_Q6++uL<8o=%KHo1>30T!cx5A*&eS1R!13v=1Cos6@MHj9)8srPOJ$679l)PHxeV^v(YH+P5L%Vj~rQH+{fohEV6x?{45GgeqPK%n!bl`F`o!(OdCLpe;ccfVKi%1lk&O zF=!jmrJ!v=mxHzgeFGHFK`CAVif7#vuLQ+2Wr|mUhJoUlA$UIvE2etE9Tl$wjRgG& zGzxSxDAnsz(0-s4Ys7*+09Ap~h+`=7T1HJ_Bk8EdreeItFw(=vdHI zpyNTef#Uf@#pGKifF1xvj9E;6WfJIl(8-{`fldJ}0i6o!uVm~6(3+q#KJ!ilR)u2%3>ENY@#>^^exb_pl^e| z2#UThUJCjF=$oMLfUW?AjTCPMeHU~G=myZEpgTcNg6;-A4Z0VUT-E2GS3&oKl3Swk z{{lS->g_F@`+^?Ac_YwcpiMx(0u2E@4%!3sBxqmIA3$S4zXjET;<;JH@t_}rnm{jr z4h8)gG#&IZ=qS)Dp!uLzK}UmL1DybR9kdwq7U=7se}Ymd@fYa3pm-i#@du!PfNlZ3 z1G)s?YXamr}pjhu0r+^{`D0Yebv7j|@{v2pc&}kxn0cb;l{woK-|Df2LXMBI9rcUb1Z+QqaNWgaY5_up#G!9Q9(h`!9nhc1gQi3t`CB1B3c3YcmdwkOdGuln0XIqJEs%NSZH2U} zWZwHS?}*I%O6FaXc~@oLA2RQe%%d$9q1+ncQ2+~(d7&~-BlGk!Z@A1$mw9fPH&*5? zl6kMnyp=L-7=5-wNO8L1&7d==Vji{GOsiImVk>8j{=xc=2>N4 zw#*|BE9Cd0%$q0k*2_G41&4t9T;?5=d8cIFX_@zj%zGsBYQPT(^$QY@0$8-n>n`*3 zGS4XUGG$(l%o`{3$g>LdqkV6ojF)BJa+&v*%-bOIHp@KnuR>b#utI)6%e-qc@1e|l zEc58)9)a)#)mfBygw+a;f;cZuJPKe29MP^&b!HNe0@x57)#JRU#iIb0g(KQgs?PGn zqX0GmM|C)_SUd_~b8u9f^IjH@0@&*~3g*1G#iIbW4o6Kn?<4UjfYELg;!>1ByHRu$ zz`nx~VpQ;c5RU@bT^u#xyx+v509MP7$CAL+7LNj0dmJ_5xTnM;yiXcO4LMII9tE(W zIBLLoPVp#!y@?}1_wR^D0Zf5Ox7zan;!{l^{C^AlS2CCtMbS9&$NyIRsAaG>3r_cC zKGDQ0O;rQO0+#wiI3n!|sVMK3_)4FO@^25JlC|7fgYCTJ#kQSNvNaCu!u+aWH8CW7 zunh3bg)}YX5+Wak;z-N|M>NMvpNh&0gAnC0I4R`snK!jeNKv*`Lf(`w&8yOqi9_dq2zC9rn`UQO#1h<5s>fYS|h6~Y9dkvg*WIizTVl>M0 zBfeNJte+}TIE;-&x;Un+U9+B&g>Wbqncdl4Iv48A7oCjG5y|6&b1ZG?ytQ#U=){Q}|CoWdm58rDs-}>Gt-v{4BxaC&{}0+jW&4X|Q+)KU!c(W&u3YF@ z(y@Z&V}mK5*Chm4FPzizTB-~2l;9O&6G}?sjq{iopji}Wa`Cc{1zcEhB4))LO0w0kA- z0!1Ees!6;ciI-E_hG4w&E!89M+H~&3Go!Lya=JR4NB4A=*1az0(QQFOUStFH$WFz) zs9%~f>RUlhech4?`8irO^T zXp@6>HSprOAi<`vPm1%#Ou_9v5XWUMB|yL1V5eSWZOlRM)x-Oq6HTOd;^8&soF~2v zo%8SpbIvnaG>Jwn<2<~(ob&J+JFQKpQftw6N{=^}b3VOxP~}kTrF`+`a?V#<)OZE8 zoe|bo9wLlp8g`wq#A^A?^h3g&C8A22cvBm@bYU;p}wSO4+e() zU32NUugp)}q~}@Pr9PooW!1rVG&SXLo3L)?z>T5Km{7OBD1;xWSaUQPR5~&(E49R727y)x(

A1S6<9dRQDNFu(SxLtdgLF(fsW0lJ1|O%kc3YYvSY0^%7gCE8bsCe0p!MK`q-D=gB5U^~L1KZK9!2UjmT5(Okf7LSjhu zrFTnGA9g`~ZE}6_qEM$*Yvb>TrdPKLbx_btN~J1@`uE~Is01%!75a@Za+SCaF+cG- zH4*A0y@gb&l6a09Ay3jFy{(k$vHKmvl=bl z>5UgJoACO1v3{j;{vK_-hMHb1j!P2AQz56t=(VZvR%6K)r92(BM7sm8c$WG=;`7li z$x$g*SC#4hkNWt|OAnLKXphpoTcdd9X z=&_2%yZkT->KA%HaR|OGFp-;OTM>)Ji-n!gzlvV+Dz;D7FUj-?Mw6&VTnZBUOyH{% z!6(~AFLOI-g)%(fSIiB?gCW^&Yq35Bs81`oKBX^-b(&BagF|oAs^~r4cOy}TLM)>V z(!xcSf@L+9vZx%7c&Rdev&?T2Ntg6S+jjUSphENIx=ZgWrSUJ>sLZ3GODEiRy_n3$ z_~C4EK9cz~AJ9v|Io`VzZ!lSn2DQPVvRd(8bg@r-O64@Y@cuwR%=@E*pere3SyK{2 z>JNJ1DvjIEF)^jeZKBs+3va5W3fY|~R*gX@&YucaUarwvwPp?87(H0BBd@<<)OaVl z12$M{Gf$yh>6Nw>yi-^(A@N1pf0qkmhWe#5@*x|a(GENIlJEJimj^o&&35S8pfkw6 zLh+wz@B;OC{=W8sl7B^?{`*Uc;rb9|7!hS?N_F#pp2nGIg;Pf*jdnCu2V z^(NY31(NLuX>r}Vj9jZR$bIWuPDbGds>6MSUpX0awdlk${maQPv7&jxJXkWRY!b`ZNIHjyi zV^JrXv}Ot&<+TK2>C*J^TC>)M?iKw3V(L!hGcGDHC8imBA?cJ;d3iX=x@w zo;2@bPlxNPr=YJ=kUX1|vd9*w-+GBUTLSu8sm?5>cw?MXJ4mhN@1A#}JPnp(LffIY z@^X#EY;lMvEKMA;9sdVbw1a=oPh}p=bZDPs4}FC8RrH2*Dc-F>CfG?8#TsRvl}>u> zi#qkg*M==qY0ax({Vj1$%>P=o!-+`NX+sY?5yv}h79&=|syL`rvgeizoit?aFzcjjO?xI<_-Q} zL~g%vsG}O+30+FpF=g~_uvDma!T)$vyF3o7K(j`LSJ-Qv11(03Z9$i1^jVRg)XjlZWR|2v(7iaX2?xRbK_^A z+_o`KOL>`6#%AUeVIPh9%Y$#o9gT;!rL()_7o@i8Q7aAyXN)5ofZMY945rhv?YL`028#vV5W%Dl4wJw^4O*LTEt*@n=#%26Wih; z!|K_9%`Pq!(|Yr`TTC0LjYme7B(u?isR~|HXt$3iMiQd{ju7+l^~4~ymtdY4KTk}V zvS5U)!uPYkby4znxG?xjGo zw?I!E*Oz^;85PDn&S!bT1bJdm<+2E&PQjiSo=>7x?qRY2YI|Y?vDCx7&UHNHD90lQ zF0bn;N08~Ts4YfOM^c~G^Tc3OSV+O*oL=8kHW1rVw9fhm{Wb8!3T0qx3a*Z}e>~!! zhMqWVO?sBs$WunjKvk$XA<(e#vD4TSL(?Vpa4wlk7k}YL!vpsjA2=79$e?mJu$+_CL`x{Z{aDk zsgmSsi1~+j%F$ng25S(0mimpBo^qN@th9R;FUOy)JmqSOCBdL|V#vsAlGbJACM#T` z(`vz{#9${}kk&A;bbT9I7Axe1bu6u%f#Pj#QxOJUQHyms*Nv#(w*QC|8X@Vo-9O@N zT8ft>T>F2-L1`wdjO*}^IHOi&7hBbihy> zqCGLt zFn@IS#KuI&A(Vrm@l7PIk1}#xU6S?>dU&RzpaV71IB~N-+TF84Sp=8$s!%4Zk9$`r zi{k0}R49w)vc46{@KXWQrC)_IVSOH3p{yHEr>aoaoy+1Xl=a{;b%in&muV`L#c`Ro zLYc5HtE*5Z_}%ylWx}}DS18l*@(dNqBEqFH-@jscgd|U>SkAAvlirOL%cG?9W#nX6 zFgwFQnvjIGy;)q_Cm=?}UPx&$C9myESyDV}1eW$$Hz7dosFdPaL}mt)Dqbrr`J4tU zag2kx4zS-*Ru&Zr`?qNaBqC}R=K<_#l*Jf~PNN~trm_in_?MU4vDh`o^Q{v@JT4rG zJ}9U>4%0d2B&>=Zw!u~lHerQ%$Ge#B|0q``rb2asMjMwXgutXPuz*fEpMOF;+M!iB z`a2zZ1SU?dB+@nW=K7`k0eC-1c?*0*M+r0}s1NCSlwUpEfyVdJ%osm57hbf1H#w^F z3iRm(=As-|L1vo9m4Syr77D}f-w>tiW()G7y$b&Xy7O7uBUKx$bS*c*sY}FWfnXQJ z6L%1Bm4>c(5FhplzFCWl1F{8c2O(&%3%bYke8??ED5gR=#xA8NJ4HaCLo6sl*u$z-tFl#A(!_+u|v35f(*G2PR=lq8yiDuM${X zyHV-1PKU**ibG6ZIzFgAT1=ESZJfm-@o|4ZS-vyTK$psSC9u2NAN?ckfe(N_rE5}Z z+|y&oEp+4ApU&{`@Cb3yFJ6%mC8}cAO`8hKE&`au<#DYwk`cW?S5ma$@YywfV zYcue^V62QBUJmN{e`xy-_$Z6#?EbWQG`0 zXCm%0j`(o1E`m(cEMK0ExJWc42KRD=W4lINUz1t1S%>tn*M^U$%Q}a#L|S1qvtq`M z-hk)T$B~AkUJ(pJRBMi84O>JHmOnWL{Nr#0?PZ(@t=nmOS?C zjJAMXuuNB3RBeH3tY{k$P`m8M%d#JebvGQxmDg>EjulxTiEUT7R`6CW80PU9c<5cKRMqoA>S1xO;xSLPQ6KR z({blRr5u)6SWu&)LZRMiJjGg|HPRTtiWdWk7p}-z*KsKi0<@OWdeA%v_97<=u328^Wm^t5Yk|AB^v8>|xoa$aTNyD5^a+ zZWPtX7VXqPA=Aln`M06`wUjvwpX;zLm)l+xyEWg(BCB(5a$yTHL>iCIN?ax9jxd9VSvH!vX5ofh7=U>>x8QzH1 zJEJZNYdw5PKu%xS#~BSYR=@siF^Ne5={I2$SK$>&AiS`JGdwEIU`Brw2gNMUtA#zB z;hpj)?BEO+hv7Ty-!z10M#U&Y9|Po<*8gkCZOq2om|f5nm1PHs_LT}+8v72yk)Uv; zeZepuX6eT_!C*ryGq3Uf4s#F(oZ4QG`31-EZJ=^6UI&=>IfUa#enx@#gE=0@n+?$> zlun(dR^ZsCoG^Ktff<2$+&u(d*xlOjycRga<$1p3rliG^(YNLFlDiYUoecMo;V~v~ z9X+RzF*$w7+bLXoIh>y=9JZ`tG90Zl$3==gOp;c{^Q{1`@wG+w z0;xd8V*Wr@2CGgduNjg(1ao)JQ#pP@60ZrT)FYdN%bQA(14yRQ=7>(IQ?{f^_Wphy zLqzS!?Z-7895;~lRIW&ot|A9Yd?D>z(JAsEc!M<}?BR(JI)lYcVbBIhs}D0_DZ zuhhSi7C2zlVRKi!!iOTVfO9A!uZld_!<(Z~EVXQEkd9Idv2j*C=I|}h7ID&z^>;&g zTjUj?v_t+%ZLm)%oEdQCL6-KUq#^BL_@<)o3{l1oak!<`mZQtgPESit%uCD4WV~>b zqSBIb5_86=5vX6B()nBEhg` z3(KL>&-)R~$k#3WSs1*?^p*I#V(+fZ-`fd%6&9A4u`0)P6u4>(XU|V{jt793sRq6G zF`=vE?=|Ti3vzL)eeksihBZV#s?=+T^&oqdz^#~pn zON?ebtk2*35`e-5(7SwSiQXI2J1o}f^qUZj_Te%h&vy@k(YS(aWO7+_1cSXbRDKVo zcO+!c!JQN04&(18*l?6NnchwV)0yK~${^_N7*>XGf>Sz9^brIP<7*(1>^H56^Ku*M zy$?5)BRV-(yevm!j3(mgDFmBRT+q`fFj^nt~}3mY)0!dyVJFd2uv z*bFBR)!DvUfx|v*hEry#av1EvW^i3h7!0jkKCt(i!Pq%)**YZ6W8CGmCy2D; z;)|p#KqB3Va=NvU?tVosnYkG&6|qKnb%OP##0z(c<46@-P2pCyCX1Q3l?wK7 ztkOjOE2`k=Z5i);)p0~(ZOCNqAI_GgcwBz=Fg)*U)gYeFU`*jym;!rbIV4e{^S1@E zEU?m<*rs&59IAjq9wy83&;asqTp6ojIAEa}l)NXKQdi9>FkY1LWO^t2C>G#V_D!4{ zmGRWF`81S*lRV+&!>NiOgexl2+{d$zrC+m&haAluQ#wA=XUA6R*k_jf;9hWmZiz6%-omgvAyr6)Twj ztEk{bK^@EDtKcIou$c>somCiRXvvjr8gX1tQ!cxb#CA0Wy zC^WFr5=-U!uBpI9ek_J4I_n^+MW(Bz(1l~Ym*=sz0%IEv$lMgq0%AHP+C?3OhG{Wm zpH3y-W&6J2Yli8DDY9;0C-;!HEP>d9X0huC7f7Kirpmg)3Ikd<`+WSFzB@*Tv}=U} zY?y53w!(@tuDodlXO$B6-YdR8XjEp_O>C18Z43=+-yT2sCGfDl$H(B!`40HDZ6>ly z;1iP4G7}=Ra`TWz0)3Oy18t*i4&&Bm<}EiTIbkHC3T)fT)~;R0c5T{q2uTS{#=WGO z350`>2Kt7y3rxltQYF97jMH^_6T+eshugx_(rvj3xc6&lR@U&ql(Zb>cXkT-ytpf; z(aKm7k0`i2Ej>TQrY%`4D1XUgAns{fWoD&k4aw5B!l@iMM8%VixXraZDj(rDNWldVhlpz94-@UR4#rw#xABqGNyJ&^0)WiqbrZ=yEbFHYYpply-|5uwfHi=$3nN7zI(TDV9x^YR@wW0h?~+Y zp--^&;nMh|xPmg}KK|gFc|RFXl=Iltqigdw!`E+U?z?b7-_-cE!=5}&Z$F{odADi% zXASck`%dukoJWyAHXb)}_c!}PR=kvaG|PS3<}b5GfYt2N1D*h~1JhEbjPbyIM&xg( zN2)C`FEA)*o|_x&3k)(6mzrjzU>*SPoeUC~l4DEG!x1EWU@(Ob&q4Il;S-o*OUfS- z5Jx}?sd0N@B>!b63rtDOOO#)!_BC#FbqIYLwrU>Ef6;%OW@I0tahC$~Y@_o6GBOE7 z7>yhG$s+$|vm1|J%X6eo9eXE0qs21y68xeM{D<)$SWDp_4@rxd;jXz&`(XH1#Zhn; zGl#UrzECwJ7y$A+%V<1_CK$F9=~V|vd%P`nfWQBDHGz-)UcR2@Q*XEmzbmbFdw?V)x7 zLLWvWsneoVG;ZYQjza18K3QQ8^(`RuVKfeDk>@pgTK)Uwud#=^#KLe7b{dDYu+


#O!qm8j9+!)P4RVtjC`0vx5)ywmIZ?4jUU zmVG#{)I5Y}tI`^mzI(4d6#0^-52JBN3rD{Zidq1rb>L17xbqe5!Xk%aG!EtRWuZiU z&53!m*dA(_9E#C^PJ)YQ_F(_ea=A{h&?`&VZHv*4=f47zhYruhsdoC1PeqN}O!iy- z?-j(#y=O7^?~b0d0u-0y0c{XZfN*C{Zp;8_F9kTbF$XBbPQ<*S1Jr?0iJ$`7Q3_yg z@Ze@0G@YaX;dDKqO@|;U0ItPwD+u#;4nP|zAU~7Fy#YL{94iGd*>{2^55;xq0d1V1 zoYEP}X*;;2b%t`ibh=4a(xp>&e~{|Fh3cGomQ^Y#VsZdCZE6iqu$iNv z`Q_e&(coVX$uCshTM&FTgniZ+_-miQsYoMf{bC0@$5#NQlMb32Q#oBM9zFbu#z#IF z%R7mvtM~?^4B?=Ae-@9AS`dp*r9lZpdZylN(BexUDtZsUpdRY>PH+kz3z`I(j@mGz zQ?)UotApbZV`Un8rw`+cs+|#x%J(|z!QtZr-e|S0Oa0NzBO3O2;1bz~n$IkK&Y3 zSAS_R`B1M6&z@5t4dNM{mYkE7o0XcUZDww+HD%)_@3gUSzM>7oI05CEh&hX zKe_pFaMxE=20Hoc6JRHoeYhEgMN!miAFiulm?D1rs>ujv$9+{~xTEtv0d;iW=MP$P zB7;p2!Vw;2kU-e$p!S7VNezZQ2n!Z)smMv4T;dTsCe7x9CXAy~JE9L^DPTR! z!TlWNo-hs$=!jJWRC}PS2UsT-1uR_5P|COa2(NFHTf!@z$!KYmdw!$T38gqEiP_af8+Xm>w*c-PxFvvofkkJtGlbwzyBQ zS~48|rLa`OJjW=0!6>5?#)WS%5e%-LL@-(vAcLEvm4g-UBCHW8B3Mbt_QNPUpB{yeid^(XJgUQ4LVU z&v30obxR~Jy(@{ti*c_c5_j!ki6ocKbzsJz_#hH6+$Y3gn5+27bnXmBzKAGU+7%C_ zjan$;If!bK(9kn>w1e{?${0~V?bs<4_dx+N7MjKZD;6~QiUTo*;(+3@QwbMB)B*`v zoDU(9#p3-4y?_{K2R#b$FFg6Q1U2m~ckru1HeOf$Y=ULt|KiZ5l^n*wxk`})6sI;p zGP#%9CrS}=wNn(Va{CWBB7)liw)LA6C}keJ2h!06N??! zj96Z{LaHjt<}#(&f9;&Mid2+EY|Cb(&aO=w%JGT)*^J1^w+X2PDvH>j&1j08PZt~( zyR;dV*ePN^XiuU}k%`UPJTmgNLhDsDM77gm!wjPp8@L&*3r8m+gJMHBqbuU=gr7@N>08{M6zPXH=|U%p9q$V{oV}g!v6_rXv&`0`_0oU z;;TXSfg*DEd@m?X<#?a#2Ste6a~z=v#ZjCu6rnhZ^@k!F$g>=xP=`j$DBdZGNTyh~ zC_-KQE59hB?9XwGBDns1-zb9X&-IQX2%qa7MG!vMKZ+2z=Q&6bdgI?XNfF#G)=`R( ziWk(~MXcRZil~i$U|JG}Y=t2I4=M+&l&vTw4 z1nv0_RD`B}whI-ZT>hOC6+!*)+^C55?BFQH$&m`p+NeD{(69roLU4+6ry}shxl|GO z;@qkTd~vQ-1im=;Dgs}eixq({&drLz7w2k4;EQv&BJjnzToL%<+^z_GajsVczBuq*xsMIJA*d_z%7uNKaCx{*^li8r2Z7Ykv;Zpa~0m7AqeZDSLDvb&v%NtT$?( z1rGics78p!=}bQD+2SYu1%cC{dv=ME^>UEY#oG9pWh~<0>NCK;ii^J$TB=#?6z_|#7*`@!aE-1rlJ${*+;oW=A906 z6F(`i^LcKOPnT!9Nfszjv4^@zQpbY;x5BDULW@(pSWy-GP;+VmZkYYm4&VD+aXQm7hg_x4_lcmau zW-1M##e|%pl|#(}E9T)0D>g~8nG=N-6L5wVJ13cbB&?Wu^RUX%W)ZcRYYQ|#-Ar{( zfyMlqVR62h#E;-&GR;Gg2Hch{1Mof%VG>XJf z-$of0Q({KrcnDfF1~D&YB;p)2@%Lqf_b4EF=7%Tw_G8*#tU8cN{lIh(!s=V(lp`r2 z+KGi*W7Q`GD*{X#vcy3>@h%SQk%5@-_QQ9i2?^qO{EpV22&y`OM@uRMayWA*fDVW5 zM55w^op=|g=17}UOzM+o)RGA1Uf_6&ipu#K;8?=rr+xUzBNAQ$7dd=Hnu`!cPag?P z(ep=?HidCMfkd@PaF?f$2)U5ufFHYYI4(rlBP3QD*qI#VypRax^1zTlx;!x?qAYS` zh&V)PIh`3IDJAeTjtx<}B9dZH4w3RB0@p`}1lIN8A(9LV>u`KXq&>Je(uqEP6VJbT*~tV?X=ibUsIL z;#ntjX!Js{xHzRFk}i5sM=-$os1C_HMfQy2I>h;9Ai;vP>ytBrpxC1`RR0u1ac5@) zzPR%<)KO9RXP==VLkdwn?-UL74@Bpwl*fLOMx^xY(=;Nb=bfja(HW&w%$XXp=n(q( z$7)1^<&-SDK3F5@o_Dy0YMoMk#sM3WL?U_C8JpHJ&A&cpBO-m)K^rpbQ^Lzh(h{}52$s20a6lu}ZH$s4(fBr@k z&iMq6koRYw!YL(<1SxSjK!pQ&RAq3NQCDtTJf$4d%*+_yq+e-w~-(foMY)D3Atg zT9jW66^MD*pa6M@61#-4qd1Roa|GV|GD&4+BU+X`HEJ3_P-Uu);4;a58*sX^088-f zIB#{(l1)uC3E|O^6`90E`15E0LfQu<2#a1M$haVyDwsmerw2kH7xt}QiWo4-V=_y{ zB2HnmnKzpyB7l?68mS3Tw808yT{yY#4}BDFgj-ikRj3p=D@{&^(FUr5j;v6KLhTx` z2Ea`Aa06Tz{6xh?vuP^M%oAVz5uj%@Y{O8Ur1(7Xjva6ckBGY?h`Y?w2o)=yCt=?M z#L6!8F{F>`)69v)^=Kp`6iXD3MrZ{RSEknpPxT$eE1WVy`vg%Eac?c-9dV0GxCnra zNOT7nweM_>?1<%QZ?=KUaqAdHDDhl1P+Mj-z_bD7g_vL!Tp+0+yRE2fSt{DFVp3RH z-BUnO<1D7S0QBRzc5&4gD*)}g<*k@_UzzwyK_M`tv&fu40>d0+vD%^d1&=5_;xaWG zIDE=u{TCVW5Jc^zP+CZ;^gESfz>tb86;tmcLuUNPyt!XW<`?z!0QSeS9ilx zs|grqXc9K^?NRq8yZA_-r`}_{rks3q z=HPd&FMpDkc;xSpH>XL`B}R8)_=&2yny;>YdtznSoGSI-j@$0uYV7C!?h9V*dbj@Y ze|F%SMr2T{IeTo4-`1~sbY1t;o+@jHucQqru*Jc?^gcpJ*j?cK9r^(ICG^#(xQ`Ff6r}quY0M^xdH3nds+YM(H)0B z?kRn|H28O%uIbI_PNtsvsKH~uj17N(n)N7XVYArw71O@#ySQNV^b2i|OQs}ATE^)5 z&F^2~)3q7%st^Bu*N}x#iyls#JLLW9zb^mrpV3Dix4(!JCbt;fZ-2SpZMN#-hSQt9 z7e-(0+N<+#-sY&|Z zk@GVif6;J5h;4A9Bu!;>4_l;;JMv@Uv1uVEwV{fJ0!40}c^bTpWUVq?=N4|Ah&J2wiKKVx+E5n9!t>#LV^l^hD zf-4O62y)M;c07CIxD_}5&KYuQ^2)8lvfg{IJ~sX{x^tSq9~QNo>ff<%v*_uULk3oT zW#6Pl0}{#<{5J9R{pSX*l%ySuZd>ov`QO)A{m~M`J?}Pr^k0A{T|kf=rw=f%)U@GjP8fw zm&?1K`r6o};?(J_yDjhJezU<_Gpl{{%_}i|cRX$|YNHGRp2V;jSUpjDq^bg#5u*6Qi3XiHYNua7@jn0#*4%e|iNKX{MJuB_q&THFzRB_{@sfAtoJUy7TeB9EJo%O#MHfo0KdZmyb z1=DKYt5EU&H&-)~d+Khzxj1iWl@YeTZ0YB24!Ymvi>TRWDxvv)!Qv}i^3K9O%gu*o zG#Nf%&XDxO@8@^?dUWr;ews6{jvYL_0`}0C!yyZ;X53ejo!_^=65yR2 zSO0X)b(Teb_cmrMO{+By%8Aj%-F%~+v5_`$Y}3zvG(Ww3fBUL;zI`M4Wbc3o@79;M zH{AlA!05(gd^=$N)(^(ik1n{k<=EXhqh{Ai@J~0zzx%N5`W?+9pFmC--RMOHnH4Y9 zdbeNsUtW5%{MYfLHiZV9uO3&a@<&IGEPdP7SdzMUQ~tbSnrw-@+jDC7HJj${{Hf`n z&RIti4!-sz)bIL=&Ry1|ye3K08Qqq}w{E8#3wkSW;El|L_rDK(uQek30PBpu9qJ_^W+u27ht{N22PKrF0Et zDqpYh>H6c_>ug`!W!USw22Ee~{r-5kx&40kr^D-Py#+aCbe{!pIJlwbzVd3ZG3(yKCX*f|Bw1U%xUyQSJ(Vt< zow(xB*T(XFW*)qb~w4Lhw13932kS3|G71BM!5CX_<4)I4yarpNxK+b&vWJ~^G$oGm?u5d^1gv>MMYCk8#NGi_sY&z_&w{J#B< z(=Jx|D!1$4Td%D7dcpW5-+w1bCPufvV&#dG{+jmkpMkMY^5&WP=Ek;a`1a^VF>5-1 z(q!g?D=6<`MmJ^aiJXTQb)yrz8v=H2i`m-w?f2)@PAhZk#|???1OFF$Lz2!jx~Fg5 zn)}=Kb(63C`DVQjDlXU^G}7(Lgf0cEy9X?ZS-PkW^kfU@Uacnh$=PAsTKCv(F6_S4 zs$22KsHfd;+?};|$dNtcr~cg{`BzCA$>@$%%&NQQ_eS6J*>~#CLx1{R86VMDzo}2; zJM~_8u}<$})i$F2GP*1J13BrTxfy@z4Id@}&K=KventK8H^HPdbw< zNjjWF1YdSt8<2PC=Ng?O?_AqnJHz7Huye&B0b_T>)cc?Q9p7HlaO9lPHG1jJ&dqTL zq!H&k&B|@qDyY$p$QwU2y&mIxtYQBO|8!21q*ILU?$rDp-%UM!u;q&OwJyHZ{(NfP z4|A_1j+@r`@S15W3I?D)8bSwZHS=2>dS}43_uF0AufKh*`_%GYwhwggmQ78(dh>y9 zrPuB*+~uTJvuxY`y)|AL8`<#B$f)?p@G*m?y=^SaANrSD&z;{@4$DUOv6;nJ@#pNg ziD6aOcK)h+g_Z*czBsa9mB2f__l91ZytT=!TXUh;Fvvx^FQ4m?@Wbja=Wq625@5`k zcXZ|XO3ja79Die4{+BoR?|%x{9np+#%%T2jluefq8%$%WJBO&q`ONWJo#zs_1~S|Lf-7+sA+ zW{+xpUz@TkWU0^G`2JPSB;=3s8n~c;_3rz38T!W$mZYwjzGyXfe|c?coo-KB*O+u! zv*LczkxQ0CFJF44UC5G+nfoWbwW1UB2BWhb`8MrIyY@9#-|$>=WW#_g&CEL+YLr{_ z*2^R2wOrD5;~SFnBcr>2yxO4YWl!H5_-M?~@CV~xO>BN~T$C;3!++NLE}Uuh>VW#d zh*hiEA2a7+R+&jZ@AAmoJu=}|=kpVO?b)*aSH~9j&uwt`*u@A*8qVmpHQXGvdrjy& zxoI=*y|V0j?8x70{az#4JM^8VpYDFm!z&ZVuNmF$_q>jo0(-c>*e+^E*x?^%-_5wP zYEl

;KZCwT(yAx&wQ06-xJyg{kk>$Uo6DGr|3y+o{@PN8e4@5pnPPOV>uU_^8j8 z7v^Hh$mm|pyI`3$c;UMw?T-mfQqRR5y=M6Mnk21fbVK`8=oXl> z?TexJ8f|#mfAW6YKXul4j``fn_uW*_&O^H&m88EJ-N4D`@|yO(@vZLkgA6w_dtCxx|+2< z?iTFx(&9=_B7^%rIdnd1TBTtNh+&^S=nZC2yEbGv6@W(#7jw@2?_B`99$j#){pT> zEPueS*`c+Yayq@)cj;Q6N)>9?x&hg%RD-e%Sa4`U(#0#OJDybO*zWJ2zPb9w)&Ah$ z9!6Jfex)Vvx^EfxMyEj^wY>cJz{RpnR^}{U*lc6}2TLEeuDb*l>6(;o%f&y;%R5@3 zdfA$dYDS!l+t4~<=iM^V$!-PShwi-nZrxUrl+Ea-AM2RgVZ*2e`=&H$;JxSj5xQ>g zeShs~|A}si>xU1HY5NPVVPmIH_ByC?>;o^daVvWRep2-fY0XqQSbDy+GivGK>aeh?gKvY47~8F?#Ss8$8Xju zNDE9Jc6?aDMBPs(+ur#3b_KYcxX$R(^4}=?N7X4!x@!-eJHMjx?~QiOdVh6(t0Q}o zdThG7^-*oixA4_!8h1YZ!1uQIh^j`npj6|v1wGGyTJPx5b&D_Ucv}DBqps*v$1u8H z{dal!9W6h2OWA-Kb50!_JhxGq=Dlx*Zu;1(X3OyK_03TqjP5PdjkX?n!yA1V)#`Se zil3D8uCVrCw6xkg@=mVD=+p6c8}lev}k0eHJDq+YEpVYjz>x+czsbRHl!6?Y+w)F|<^s!Ipg-cdypS0|C z@hhWSJ7db}g6Tj1)#j_w1^Zc{ zx|qXhHQnn^y!H3-?D;c{2j6U=U3g^gy_wB7o!Ybb!Pj|Ht{ra{B}qdV-RyTNnKniF zg;}qk7~S?mZI@Fv%fV^zhgB#1(1BOVy#aaI$mq6xSSh9NxyYw&Ul}I2}E_giJW1O|urmjCvf9=8!xEX0k=}z?BUS>`}Y@NkjYs||V z=~4CCkGe=h>ve~lpYoqDV@w>zVQGvm?uzN-w>IC7>z7$&-=6cI*SCBfzVu1W*KQAp zdoX->gN&z=w3X4_3fuQ?>u<}R)<_X6&eeQB)BR@hjQc%*uNL^#?yM!2D+ai$VRV^a zgl}kJDZAHe;EkqN13I<3=~aJm^WKkM{&m>z-5%zw`56|~MwGvZdy89C^8fX{{{?S) z^}|{(M{k^QcEY}-W9F+zK6tD7qz`|`0eMCjAHO?x*~0A&d-!diIPs@dKfidtQ=B%&Y{O7xK7ymqH@3P<<%O2$QJ>dDvm%aU;wAc@q z+yRvC_{kl&baS5(@XO;WT`nx`@$Y0xiw8C|C4_vCGr=8jyjYxM)4vfDqH{n=-0 zr&nH6E_ra%Z^o~hGzI-fV@mhn!uvh<{nAh0_s+-%LpPVJ(s!Kax|Z*K9b7M^9lNaC@LfvH*?m_=1nl|gMEZ%Kh5_fAz?lN08*qBn&WWFVaIflvqf>HM{cq~~ z+E16aDC_q6+(pCx{JweEyOPunv|7#8H&?we?sS!{?evX8h?I~{Ub$)f*Ev}RBL*I!nnlY~Xn$ZPW zDtd&XVKUjFj|KqlU%B_6dF#NssA9ViUgTZpWMb7p=1-o?&%Js4Y?BpL&;5|FXkq8WV+?oygma!|l)piV-)_r|`F+X@ zL7tJ)m2YczuXKD_z`;$sy*|3}>-H84f+T4jqth-Q^Z1jG%8tmZ*njisR_W6(jIX%t z+m^SM?rM;mwL756dP(||(Rq|n^Tu-~wj{mQ~^7o%JIjrXTh zz214laYo4?yCa6W&&IWNjLx{J z*^(_Szlr1*o1=> zUm8DU(zx@@^#|_s^Yj~fYh@Sjr+?wP07f@#=g4cH+(?>u`pkPDG!Kei-ujR0%igg) zp1ihf!nFE52Do9q!049#dG-8PTNB2&uQ%iAfF-{sZF_pAcb&FnKUn(5@T85Wzec(h zU!Zi~cs%)GxGwg7TJqjcHmqCpu*;P34eNwNYk{R8OZSUP|H2Ly? z@NJdXwt97x`J1iA3hj;Wo!;Y)GK!05&{Zj;e_z&f<``l*wa96Nh4^1yLZ z$EgV|GqSt9a_74U$N{5U*s5H?^$9gHueN`5#WU*Y(QBQJAH8)%bKmT}eec9(i^pL8 zhB2j9({cW+&p(@R`aO@eZ#HsU)AO?q4{EL6a`RNfnKO><+-}?@cT`YzO=IMF=t+#BwVFCxz8%|O?w4K1wBOQZQ)2id-xr&o>~d`Wo#y?^ z)J^(wPG3nH&*(Nr_iFKL!Mz6CtEZe#du`Xri#HFRc)aOMz}Y=JzuRp71~Rah(e-Ge znKy68o#|Cy-PFD1>D`w%uW3JdV0ZoL@b6NdUX3t$!M@R&(w(wu@SKFRdpqbh{&b-E z;}zGx32)x>qn~%yZNBQ)r;Q&z?jT8n8C~ei3w@@K^lf*)>06V^?5w?~_UN-ahmX0q zt8K>a@W;c;jm4FTjPB{uhkR;LxTFsvR{jVpt*m!qB%fnrU<{oX9yZgJ; zd1*bCEy#Sh;OwS7-mn)ly06CW+?Y_W4r_7M7j;;cbkEB--iAKkoQ3 zx(r;t25vh6p zOz+gs^LVXtmR7P}6}llaF~gP%MwL!mhH}nMOGz&cafdR^NXt!zVkm`9H9vEB=BUgP zR-q8A+@T~`rI0HOWQIb)!|UCUQqzCQDJ35sK`gQoQH>?!7otf?k+oH6$$N5Xj3S4? zKVph4wS>i!#R0k$9M3B0kd(UVw9NcmTPZ}8m2NAQ+CzrYvXb*kDhD#7Fm^8?$2pI1 z-CwE1lWEHvRSMk$vXcXaUGgkp1e%MQE4d~Bn{vnGre&sPl{_xF?uOfPGHvO(*|y}8 zPANpI$t;a&SB5PkD`!lpm6E!xyxfuwxb5POfoRFa0vcf?y48}-b|4gRlxiEBm03Cx z#$4Ezob$X%XQr1_tav=O)KZ8iJ3VnsZdQI~N~x3%Ues;G_)>_BhRC^jIT$UJf>e#k z&9i0XWx?le){s(YLF)0ll{d?hW>PgHpcs?0$5>0DcG0KNEjK029P6!fvr0a{pi-g- z$;>Kgj@0ZLRT}d|p{dg{A-k!G8ENTbN}9)v1Tx^|meibN&lwHG;pM!va%b;?OJQ_B zEGwzxjb1KlZp!eKl;Nc^^2yIh&&YB$6)O2PJn{`W3AWM6E^P~?m%_;8ocv5ut0kAn zyrDU^#FXr;tn_r-ki=xtg%}06h`01|pPN`pLu&K}iRo!W{{Pk{8U-wVIkwE?F|IRS zdW;#Fh-q0#b+g=Ll1jtEg<%CZ9Ta2HD7~Vm!;5`hNsEr`W@KROkFMQ?0RP8@8?L`f zK@qYn!HQP$EXlV2QXIBq!04Ef9$a!o4c2ESwGAqH88JY~9a##~N#&0Dk}SKSRJ1@g zv{d+$kvzKO?7_7b=~++{Ij*x*dJR(PVyvY#=1wNNQ^`4yp_)vT$gGx>pPE`4wv?1o zSg(|o_VBz6THz?M9#jv8u}qbdJhY^ISI0Q2bR>eJ%*`tWOC(yUY zY`*f;v4o;4$2O`oG_4#LP3u!i!7R_s10`L(moo*!MM`O8ibiBKKP(~JnU>BS>S}8F zU&K=`Txp3q=FryU4BWd{;y#x(n;e^LoGj7E1ny1bE1lW;c8TN4hH{0zDR~9LRFLb^ zc=BIrkOtMvj9XfDh+L)1il(&G9~6Dbxs{rhWXs8Q-9MJzKpl0Pm{STSaWr%4-b!Kk zDHJSB%_UxChOi)G*|wZgTCV0h)JmQ&dl_>xl1rnf6uUi2D0Xtb*it2HWF^&WMI&Sr z!sJrWCTX-lTk;m`B8OPLDzW6r(Wd02!R}m&OTW1(Bdw(uDcT1tlj(^gOJf`k^I3A5 zYkl<}6+G^sEukQzV0P1VsmKXp9F_&+U>ep;O1vQ(kqK)YGoTlv=Kl-ZWPy`Mx$R2M zzl_|`86_RH$(iDV<i&zeA>`;i9>PqQmNZH(Vu`k8}1 zj+`|{J5T4k?a#wI^fFYo*E zmq<|WyKT_NQH3XT1^<-EsjmCDB4uvYp!-pC;%^(~483=C3JzZRZZn(=IMB6BeiVKk zh@3N_zOnEiDC$QR-YYzDZjvkGo#Y@8i2I{y?Pfr-rkUniB;NujhGC(8xLE-HnBwkzMwTsu4Nm^D>cL4(9qs zbvbYJ4LcH5c>d}hL}l!97O~w21F2v--v#@4QLnB7(sx__3EyqU3NHL!@OO4zQ{QcS z0v>h!C9hr&-);K?e(ze4SEb8R#VvBg3?tzEih8e)^Qe zAvfPx*lj0?D}?DDzK2_WAF26<3DUIB^ZSCvJ=bq1No~vTWoTY*s z&(!02J_Ucz%PUjx_mTYGJCJz^JbBd7FJJ$3Pvq0jr#vi^b60mDTuT^ZVT||3j06={ z82#s6Uq1s_zU>F2rjMU-R-YPoef`~M_4M}L9{o@1te)ksySM#3vM{=JWZNSw-KaTB z16Htj26i+S=Jqfaj*B!F{;IR;UeXQHB@Eh&Q=)JrOCFw=7fv z0oD>!%CwD&&B{d~bpBR^!*N7>+Gq??Rd_S{eMC>gI{lblsTOS5_juEtm7(f*1#~5ItF$ z$x$mPl9O4PhvGMdtHz)(IOT=rr!ve;U?`J~h+N7xrKcEyWo0uWN_b4c=MgKr5oIl4 z?|v)@`Nc$#u&nGcaXHB>h#5g}=oBBbJJqIH3DQ*4P+H|qDdjVKGKGSBVis&Df~{rX zP!?>ci(qmFV{D_84E9AZxN5=Y7dMiVz6d7df&`RY*?LPubHUOu=4H1WNZTTi1ZMif zEomg`dmYMB33&K>fhSC4pW&A>SQ>se0PKBy(Y?7>WAV5_`f*&K_(EVA8>j^Y;f)#wFBc4CoavEBG6G+6;4j)0Z(F{see^_h z2`uS`ZZ9Hf7g6*=@Jtp(Pq-Y_`S(JQ0*Vo-drK$X`nzXH=iF<$3L1@I_gTlLq*EfUYUxqd4i?0^d4PCBGFsDfYja{dbr@e8CU(r;HM{kJQ0fgEHwHT9| zXfYIf5TGPkCO1fyyJYge3xJkY34Y*1x|EK&>hQaY3^zgmNWb>NvooGZtU!-v8lIGu zVR$CuIUG;Y9ocvm;E5C01yk_^tY9Uc|cs9WE5}vK_yo_gOJa6G?z!P;)&(b}5*3(D zfsIgLq$(+d57Ul3?0N;ZTcO*dz>X@gV+!mi1$JJ6-Be(A6d1_`PotUq%SR%a;4qR3 zo)=P492TX(`YEsk1(vSBvK82?3T%M_+n~TmQg|BY71(bItR48z)9on#@{#lkEK-3D zQDDOr*eC@yPJvN<^Y~UOun!g3W(D@00{c;c{ieXKDlkvfGmno(U%VVm6j%!dMy_u; z9Z3$Si&0=^1(vG7hAFU#3XH~eJnUKpwqAklP++?i*jEbdr~U3;lCGq zr?CS3Mc~sG?NtnOcsEG2@GZmsQ@6%`7X8`1#(|{-ZSxBLH z63^(JG*=~jx#pr@K2m=LHc0;EBaK#I=%-i+ABj3q9u|F+3|pnZ(C^4F@K&aS&X!>{ zgDXe@d3B|LlsZyCyV}scRiqlfSNo;Px0OEki$zd;mf)+!mv{`p#fSP|@u`X*8j0kC z|03QJ7dWh<pImvNi83*YB{d3Zunn0VHbFoeU$4eWOmn7em^r80<;`V{p??V&!f zyDnb!-lGTN*HqPlyb-?0$({ElO{EG|HIh7%wqT*jmM7i4BVgWAw%(SPm7k-6`AOOK z`Irh`L&`SWaJEFc$HP-Ov{H6rUh+^~Qr1YDfKxdGq)cP19M%J6YbIeDWQ@%fGz1Hx zS(yx@vLe6kWdIkSjt<`Via5;ha0>NiAeD?~-qxkr#ZVO>t7I$YbdGf4A z<67cH7X*m;zvo>dnWOx8N{;zK+i~|(<)@9;p4)K>9WDjYm#9JCrLWEjPO(%Qr6I)=^4$Z}y&}yq9I~qm_3b_MW7?my>mYI#1;F$76c#a)Tst?*=!Zd1ZlW-!_x zV9$FM2BRe=9v8_#RgzmdE~=Nh64fooQ(ZTZQqvQM3*vy1D`2q^l{;qW!0Q^N>@V6t0mRPW0Ig@g9IL>3J@f z?owmCi$1#vezVxDC{to?2Gx=1AE>`o_YciLTTkvEn&Y=I*DxA>Xz~)1(rr3fJMTn0 zaVKe)EOZl))esXOO>q(o*Mu^d*?>#X^%8^OhEN8JHtFMW5e$RjZcqlp%_#nX!@QAS;y9NtTY#m5+Ndk&A&TZTpJ z`a$n_RmGUloyG($Q9dXf<+3oax^Fub0F`(r#;$i_bFzlO{HqOzpRL^gxOyeLJg`2S zE-7n;??`vD1_)k40f+12EYzpT`Noa#Vb(CcAuLMp5%1A)VYnX`R4SMZAfDhFc+lt^ zXmIsym^IF#XHm=bg!|r+UaXQL=O@wir^urO-*Im{;*0IevmyA&Vd{L8<>~gLaKvNS z1sRW9a~@Na?2FOh@!`8^J zS;;T%#iL)?S#_;!tt5KWVdp>bvIo-F;Y*hN`AXi!^;p#Yg^VgNYP$5oWY=9%;AlS#EcZtWoce<> zQ*5>kYAn7`-7TtiO;W_aZc5CbTrjpj~Fdk*>H! z&Bc{@T!hfX^ifu0Q9N%mR4);Thh%CdmSqPB-SfQb@T~DMap1Kv+^FaZx95hzJ@OG| zLtLD(j~FwcPM>}49#kJj8BrKz=q~o z^z-vF5^gf%PC)tE$Udk$Azw!D`#FKR%sq#QKn!@EYal^X<4jn6s$HyX1CpqFwmPmscxNfLZ z(MLstUyfA#Qbg7eT_8$P*J2YHxs=16D0w^)gS?pVeHjB0n)CC13j;)JUtm?gj4^@p#ArF0d`CMJfDP+S1j>}0YjWrw`h!P+BAy57B zHDeV;%z53Oc~P_>Mi&Z}%JSg;Oj=a3H566Q*QmEdGM;%nlU|RBpVgv^5IRV8J9Ci> ztJziWR(@^u-8%zRd>)AMJS!v*!&v@YGLpB_>o?e`Att{G$m1Y<$HVcrn8!Hq-T5|Z zneANvsIu)$N3$}$4!5QntbI&TXxp5Z4t#eGBlo^BMhmXw4a2y@O0#38YrNH*e114I zxj0j}1vg&D^6##`5>~3!7Ds)L@*Rz9Vo-YN@Cn`E4HfxkE zCmxQ`VquoIW#;jGyGaT>CM!>%gnm_U#>_f2bh>DVX}kM48Z4L5uQomr>IQ zG!kGGay*`D8jS4)nVQB+P2-RjO<^GEF_t({CT}$@vr$ChcIpTfA+N)-YC2WADneFw zK5Dx7IEsoUDEcr{tTG2Fr>2QRWS}w|aO<~h_b9K%Gt-_?kImM`D5gkxek!PGqK(l8 znh@EESY9fsX;?PG(YsRbZYQL=^HtL^e#P~VL59(fvtFKP{M0navLgl0lfRmV#S@Qf zqU9Qv>#vfUhNDFdvpiQ;3;WFCn+t*WNMvN zXY;IL_*Y#`%hMnuR#X(3e^le28frS2Ce`WHRO5&l$Oka2AQsonhrN}8)4~;;Wjvnkp^ILebiOc8RKJm z#h_W*#e?y@o|=ZYY-;Q*@AcIAYeYFcQOI3o<9G3fMp zbt>efXIiUi9ph!A3|I`5`V3OjGW|x4$7~XF%Qg=9BJD~jL&l3>H7yfjLqAJwl+G9v zZH$X%t1e7F+N$Yd<3pp2ahR~$8w{19otj3rGdOBpt}olG>Ehy|;`>?A^g^LsdMR_D z5C%H0AQq;xOI#a<>*5l}=f_=L;@YxsFS^9FW4LZEaqStdyGtCOpZ9Qy>%hY4T;e)1 zT&PQ2Cx#1iiPJHh-X$)S;S4Tu+%6mL636v!gi9Q6*O4x9;VeC)OI({E(dK))#mm$%%4aoViWAkJ@c{M?M_k)r$Ulw1Flv?i0oXJgX^c_UC}XHu zXXbHuJLBV^cw!=$>BJa;g(JD2@N=d^caA;@>%$gv|5y`@u)N>#D4;cPr!>(OhV{}L zLgV=mnD|F@uJey>ESv@dTt0}#Y=yR9iaA=>liq@PS}t&mFR<09!x&+QWN<1g*5R1p zNDmbiZLne(8G#u(*E<~F$3nx?2wkiL1?AaIk_$~^RIHlyvxbEVd3(y@Hbz0CMVj>J z+R=SO-$v2uT0bj|>f?+96#G7}P|8iTG1AJznEUADe7H-FctfNe=k0_GMZ955)pDK? z@4+Ef1}l>X2VQYF)01+2sp-SfMPqyrt&4%YasI1$Vs*r0Tw+1LLW>uAQ#5`FUXZLP zd7#B$YqSXs1YIs0#jyTIt15>$-ggNU2MF*@o+O@iu> z)}y?t)|A`ZP_!Sj4c@15y-`?JPGm|>On!zfCoNfT!_g#LE^mI%qOi}K(-0TgD!hB4 zT`D&2Fk>vO<@U0M$HQ2_<$_?c1p%uxwBkW<$S2@21}qLJ5^U&)K|>tpJ#3P|o1(xN zmw2>Y3Quy10YNy%f_yz0@(nm!Ri$tk`txBtsN`uO#0n!BOcofgVV?xOp&yMnqry>b z5j1e&lOn4Hovez&iw7tjuR{mCE*{O;Y_uqIU98WlIZ!!A9A-)O@|SnS#lcnpvE}WP@>IbQ&ld5G zG2te`gNiQjEVP`q6JD-AHlSnt_jL?Ue6o_77V$gb^~5Z>`dN5C$M7^0WxVuvg!6LA zysG4gqa7D4j1!!vC67Hjqb=YJ9vd5Es@eicNYOSRpmy2Ml4U;>>u$poTOQG|B8$l# zD--q_2)I5*);U~`8Lct4Pdk=hF1rH8$Cg}XIZPiT-JyI7yWNPQ`3`n$yK=sR?fK4; z^ZgR?{h^X?ODrs=QBk2#=QMs|EzTNgjNtP>>^F0TmzNc}ykh^ED;liG3LWbb@33D6 z`_){Y~sXrOlPu-uynDhq6{W}n1> zw^oIqJ}SssJj&N6y&E!)P4BC~RfnJRETrF|`2w-o?T~sLeX`G4h&>u)Q-}6s&9U7z4_(Ds1iyN4*Q{JUIV^t)1bNo|5B)jh%VJ~Mi zu$l_XlBhdjE4SlWDSytI_%vvWM_uiC_^6uNK?i$2Q@F$=eFd2+ZT|A@IV^)`sV`z!@&j>m@fOEtZVFEvJ{D;o8gL{8ZtvMHQ3ZXq`DOQtVlhv@)KrLA#E-hdmD3^ntz0 z*bc_m65R`=0vU_>0$CNTI-R^mNcIoR)j3b)_z6k8CY(}_Y|brjB1H}$nM#`@I;Bpr zUcl^6)_xsBMD57!$2DEsV66bQL*J;tOf#icXOS!5gdzVFz=B&^eT*Qt!0A z5jls6fbEGAX({!uqy-LGb=b@mukfLWEa2RW2(QS4J-j&@#Zt?r2Ki8GAvVsc$DF+d z+G1_FEl%cbkynJ$4*4s!LDl)b|MOl~SKiNP56a6(dkVhfVIV{qJH+9tGFy%=J3Bos zIgxpxq4K&(QE5pzi8*7`2-Gj_FLRg6GL4r-Md2_Wa)P6D2wzHLBITY0D%W)6V+Ov* zanLqUDVH%N-4-`AKMxm2W%4@2e*dhTWLt^?MSf^3BFZz1mq(x-3Zn*6JyE)|<#c~U zy7OgS3FkN#s{sp7{Y9F1k0Hwq*G<@~Z?PJ={T}=D@teLA>cb6k{7X?y?Lo4!iL5d~Pu zF|(7~bVY(;jTV+drJwgBn31nj__Hv0k?AY(cg4P4nZLIa_$n+cFJo1X>nL#57|x!b z>KqRMFH;SA?_)w&$=_?zI~L&LRQuj*5e#dhBF@_MPDUo3*{qZ6rVhcvIDq(Dm)>bC zC!b*uVe1h*DwY_{cvzpm_ay*@3!rzb#tC~!V|s^$TAh9qg3-QP2ITqvf3$rEKvc)` z|ARw7Kq)FV)Dsaa2x0*-3W9hj2r70IDTg3cI4rTDVm&q1sIkNvTdc8{*h_4&MUB11 z-di*l{-4=>?{OS=>h}l#r^oJ_oj2QNXLo0JXZ;99;|kJ=iFxrS81$S_N-L)fpZYIAq+Xll*EBmf7qH+E zQjv?}au$~e3H9$li+=2T2B$d?0a1RgXxj}$Sv3J|6>QFqm$CVU_(E;DDE9p2leyUT zO7dYM;+%w^57f(aCY^W%yDz)aK6R`w%H;~Z1BVeWP?-_Jbayb z2hO{3IIT#c(kMQhbrWG+g{`aO!kIT7##x57C+e%Dx!Gi-9rId_B==SPRg!^I#5_(! z*3OGMYwYR5um&Sie;lEJt~i8NBIG>ru%PzA*rkGnB@vE2UF;hyWI%-qbpg%7#4zl= zW?|w`o$aHQ!m#g}g~_v2@f+;9W^f#xf?}2P2liSs7@G%SsNDfV4re+1p|xZDgZfJtXrbQ!is>B0N}JjbObgm4&Im!$=fIg#|^iC04#2nzbW^ z7|uq-kmAx@TB;K>y>MM!a4|6qf)28c>l)2v7<4a~hDq|@LZai}7TWAi!L4-m99fEC z=%TPl)iMG)a5jBakRj`xK2=KbG?v-{H-(%3?+3p-}5KdyQPf7Cg9&=u2R&tn>cq~ZL3Vj!m&1C+P(#SR;(}pmKt(l0Yva%^ii+VzNR!ul1 zWE|{^#FiA`B1{}w zQF`p)d&5+yya+`FJaay&+;14|mgfAQLu^t2>miAbpp^0&plJT)@-U1`6 z7VX12vt?B-BTLKSY||5~qcSo~s%x=$!Kc_F-Vr-a8J=SSJQ`48vmdSDq6&4_2g}O1 ze8W0Q9I8cV>i9NfMz5TV11&8TsaW6TWw?}{h?XIAra-C|5wC)b7lid)p2mtYjBPL= zbyG+7A*NGOyKs_mm=r_u=@jBiw$B^3pqOl!E6N6TQV(&99EdGv5qUDgK%gWm=83W* z3JNq`J2=hq&hLNG_RfGt4cu^ejczPgZ2(7*UP|wKF;1(VY z8^TlHqkjEJ(!+Obi?>bzkrBAOCNna$1H7IMygY|`x_fzgM#dzjMyk>>HHagUezD2! z>H+F}dV?>f4VT_W_5&$*FE@3A2Hp)k8#Hbd=N^ljzfvP9Ovf%zEb(PbUYfs1*KnRA z145&d)Xd01B<`?CNJ~p{k4wyu{poRJbK|8Lhg)!AtQv{;*eVN01!Yip3Um#Q(k+#4 z=}uF+;Z#mruljK5s2hYDTbr;l;k=-9>+Gd;%hJTVc`MyQ!|{tyx`hEdEK%v!Y9PMC zIb3XHQo40(taQsvNQ0f$*yJo2HdVR>bx^udYMu2ji!A&#E&dT9p+NzWVwpPs|A|DT zF1!`%-(WO`jAKxn?$RN!O=JUiZz+wDSt;NAy{Cu#m8XZhhr6ebM*~lHk4U-?z0gGX zOz<1XVEk?7NHfAEkT*;5`vt$>Q5MVKD%;><*+`=aEqq=fpo$=~vFYg&p@;ybTNl`g zQ8*S879a-;@mqx7V*Hll_wvQzMt$ZDyJUN7)%9*E`+h0DW7?uB2QKf4`mtN7vMDPn z4|*2-zHeQp8&|UHHtOE=RoQB;_QHYEkK4UkwqR|LdeG-yH;1+T&$p@Xi+LzA_W0pM zf4X~O+{l4uCb=-jsu29*VOZPU!(+0E3G@aG(hpaFrNm);F9;ms4zpmf8XP6U14XEy zFd<8O`5*T#o| zrxSsbjmdR5eDu)lJU<xrJGwT zCx}9jAhksd@R*3xOoS8zgmMB~<{~5yC$Eg?E0>VAjeJBL`odgr9}pLNBjg1`B!8yPieXULXOep`l7QLQ?t zqEn%T&Im|Q!@^b+jB4Rd?nKSNs8|9-#iBb*R0}RysWe(}F&dW(D<$LMx`a8&dfttd zx{qh0hMo-?dN%U((1j|Mo*o{J8a0CJ>Cvb@`=pmu+~}FYCD*i=N+V2!n^b{#blVKQ z6F2;dZAJMWm;==1cM6Lbg!+Jqs~*!hCh@MHVAsMu28Q``9*BnmPqyHO$mwvoAknZEa`Bh{b4CDkqJH)HgW{JWQ{MOAxI%m-v=L5-xDggJt+X)ebjZZ<^E4=nBmIhL}3EPPrBd)JFO9yT)> zq_-9HMgXS?6%gUzXNVr`H4EP_2kr{OBFSNd9)#XT;3WUb(2UX}Iq@q@C%?mw9wftH z`UJ%5xCXzq42`v8L+OK^XCWRqbJlS@W965Q^p#qV)vVt*o)a8H^y&aUXCpK~_|ZeM z++ckm-b=u#Ac_@=*ATr>z^Cep9wYR~w)b`5d2Iy(9%J;#THh)WhauvRq4Z^gp7}OG z7`>fi5#Jk1-%{W??0_Bdog9zal_7dZP*I(C!HUpcj@Q5lJ(8t0_QPr^e)NF6L3+gQ zO@MP=#G`)5Q2G{vz-Qq6d=LnD$fU5L^zBr@THGP<=TU|ROR9$H<)A`m9D`N7lN_&- z5qhN|czpka1&Y5o9`$&J(g$%R?6`o{(Tf}p$uO9{<%l-|I3F)@JY(`@GzDKlz2QfX zF?t_CZwYV~T<3U|;TTFE^_s_T2*O$X=rL9wl>DnVAct-e79W)uqDTGU3*dYZ@xDZ_ z*e%e+j~*t+4an042rGXZcYEMRk0pMF>h}mDDt-qyg8akKjJ6NTZ}44=nDC>=So&@t ztQ&Be+#@XG>7)Gi15UPxXN(?I*LdK>-zRFu={cg_76E7LLykv$U?{&I(I9p{0^W0u zXN>>OA=u>=>y^V<1{SEB*|I5&@0%@3EwgBGxJ<9Drj%N$U5WOoXh?&62 z{K)Z)$(QB8%LUG|&m52Vz!1G9$nS07j8RYt3xYBE;)LKIikS$j%sC#_k0E-!&~R)m zU?bRy;~C2@jV>=(WA6ekB%sGw|3>*33LMvx9M2KBtbOQ=V(I(R_?hBT1Kr2Z&cjc4 z+)802-yMPHEaFl-XLy)>XkwBHg*^;(`}vcF7Cxk65|r@hR1tpNIo5e+<+c8%9b=C9Brxp59S&qcg1$&LSjV_u54O=Ini_`n4?-uie3 z>a7!SV)XI!%8&RU8#t5o@eI&g1Dx&pczX0GeHVfASRc;-J*(0tf+K$Pd?~*TfTI%e zzEpngfz$IF=nV$WWPLmX>01Mw?fQ6n`K9u^2%P)+cn0X1!@j2j+4%fIeu-Z^fD0x2(a z9%J?44!kBJu3Rp9^eDewzL8!6@HAhcN9mgioL}_u4CMC!a8Bvt8A#t#;C$A{GeFO& zoQY5qKYEPim-_u65r-k-kFoM=54@iG^z{03Oc#W~di2=%PY;h$HPjHEUVdpjG)xcA zSo&rHZ?T9g=T|RYg74L%XJ~v%@gC5_GZya^;NAa*c+GJ+S-ywH;~9B+X$rH(uectb zpPiqdJ|2ymN*BPxd_j*M=_x7{z$-`(n^lCy--s9f4R~chFYz1jNG~(=8}R4`q948i zkLqpVH{g-pW7{|2(R}T~H{emcPrd<<=IzCBIi2ofsD7#6s`3qZG>`Q)gvZyFBBXef zvA79JACL6oI%^e#yA|_k^^pAOqeTp8^XrLcHDF|;iE~y~Vw`(&VvO@Qf$>Q|XoMav z_GQr?(GJc^#L2GzS_n5*z|Ed`zP3RBzik7c4F_ybK&(49^yAKyruITFy4|o8G#?`e z((O~+4NZ*ANXtx%*C=bYucZu2*CeJSeh>4&$^fhY;tGWfO4|$k{&A;|EbLEGk0D;w z!1nx>5rKMlN=RV6YbDBw*adHvC@Y2(xLd+e4A8$^qO=Ilf5C(V&40y&J#fz;fzE8xVruUV$^>|{$YU0d09B3_=oY>M_@ z_GO+$XC3R-RFf18IfF_PjbG<8a7_s#42YdP4B5oBix~Q4BiB?gL<52+kA`ICnpz+Q z8nbgPCDFL8>$;%uAJ4=$Sevc`?9U8a$EGjsOTUYyLZr%w1=tQR*Far0$B-)b**bLv?z_7OkJmk0gN z3>z`_7e6h89b*zpX2_rc^S&flELh(8iDiSyUrp#$)*59(zCxyB7w3Z*%V+n z1#BovB`jGMU|7=WraWVi#Og#$GBCi2kv(AAV@<=;JX{>|Vz`pg0fuY97_XE-$p`_% zD`1dUDi6s7K^`?7gSylyQ1T=j1Pm#^O^v zl0c*rz)j_n%%Oxx#t2v_4(J&%&MR?{WSfAY^O*GP^GeZ5RtgxVY@t^wa>+&k3pHS) zmn1YLPqJ6Q<11iKRJ7A8rS9vNdTWSuziO*jVz;jt>y-qDF?+p|;4o^lS85<%GTKWW z8Wo0d!@W{8Mosrh;^LcZ_ey#Hit%2l)W2@OS1R?dTJV(+ziPr)Lj0-?Uy0$qX2e&L z8{cBcS1N6z#(X8NFlNnHs*P{5=!>hhSnYqSNneThH<|U7Sj)IwUn%-;wd^bPAm3o! zSE`$@8TgeL?dwK`8Gqp685*5`jy&qK4ZRm#(rtmM(sHt4l}wYF^(~l zzf!m{v%gZfG1I?NxH0p;Qn)b_z*4v|Gr&@~F;l=&xG{6UQn)dbz*4v|v%pfgG1I_O zxH0p~0F;l@(xG{6Vl4LPzGFU<|YBN|uFlsbdLNIDIm?nT$;7-in z$TX_HIa|^ilt3^Pda$I4lUky6QJO~+91}yp^II6DAq|CrB(uJ0z{;qE@&!YqQVf_B z5|wMm2=In6Sgy zX1diUEI^LQsz5l6^2y#AF&0s<*1=%+8bgN%%OG@m6I=T@j!hnplmb00N5%z)3_=2t z-Hb=oM_5J-P)bHBiKWT|4L6K3I|yx=8iMJU39M%>k~HE3E?_Z|R8P zlAx&s1T0$X7+;hOGZN!cr~%WA(ubz`KE!;To%yB)K_42i&qxA{f(x2xq$;A20!A7s zn@W}xu2*3eqIQ3{pRC@fSu zm(3==^sS^nVWHAtZ6+EhR8pMqZ)IzW5@|_QA_a4Uid5(Hv7{bhp)jdP>_>1(7s9_H z0nW`TmK93aJ0qMwy`vH{L(*cC)N!nd(ub0Mgnd}R=3;4lPB)}WpC_o)(dk&<;*m;v z6ZWmHEk=?NL|jstiP^G*u|bX_=}UOZVVgt>kdz}VfGjf7)QhM}+7K3C$Rs1R zE<%(PB0PG1n~an~aZ#agODHo`uCt=^}*lLs*Oj44ta7jVN?59YjBk4#OhOWg% zDS489gdr3#*(jBvq$gom5W>1f8zme`IiiCjvmNzoR2Y(4gyG~j-YB&wNjJh!B>Rn2 z>Mr=+ESnkyH~PlSCXfQGYD@+3BGZrRADp>}T-X&{a)FlulU5i=N90_Kc zo!|Ns<JaM*#(`CP^U$?Iuy&^o_pdB&tP%8?>H8fsI%S zxVfNwW{xO%6o}O(W=lx6b0mFb(9n?-XwcG;M6!UXBPt<^OV8F3aVdenVD5<86`>fl zctjGE5Dc3*j!@2(9HL8#V|e z;eE|05Y;-x`~|~6#EFFRCEGytM4WH74nXmn{~?R z=_upb1Mf0o0iL)^3$rClrlT`5`zB6U}rHA8iCg&O=lb%V!YfE0pP(*gJ6rD|Hyhp!8Bhr7ARFA&aGe@af*Hs0eI@ zuw-iHFWqm&^5~3j7^g7`tq=p+4UFEg1gP*DMNa!5GOq14jY8_JZjq-5c&5-FI{j|;7E^=Mnh_%zo* ziHnw2i4ADSA|QyAwRPfaQXYgev&Te20}|?tjMOx6D~0yOduPV=^hWW8v*<|r(CCP2 zRL3qNYXz+Vr+Z^1W-ANaQiKb&LSP8YqVr3F>a#K+PLqr*R|O(%^pg-qij*hU^k^Dn*t-*dWOVVYN#22g;+aq1uE?* zgpL{A*6fq91T}b>OGL9z{P?q*VJW;$mWLEo729#mS zq1YSgb`mUdDoFY;|5ud&r9FShV=LIM_78#O�Cv7%)c`Ixu!ZDg@rlsa`|z3O12j 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, et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -/* - * If you have libcurl problems, all docs and details are found here: - * https://curl.se/libcurl/ - */ - -#ifdef CURL_NO_OLDIES -#define CURL_STRICTER -#endif - -#include "curlver.h" /* libcurl version defines */ -#include "system.h" /* determine things run-time */ - -/* - * Define CURL_WIN32 when build target is Win32 API - */ - -#if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && \ - !defined(__SYMBIAN32__) -#define CURL_WIN32 -#endif - -#include -#include - -#if (defined(__FreeBSD__) && (__FreeBSD__ >= 2)) || defined(__MidnightBSD__) -/* Needed for __FreeBSD_version or __MidnightBSD_version symbol definition */ -#include -#endif - -/* The include stuff here below is mainly for time_t! */ -#include -#include - -#if defined(CURL_WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__) -#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \ - defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) -/* The check above prevents the winsock2 inclusion if winsock.h already was - included, since they can't co-exist without problems */ -#include -#include -#endif -#endif - -/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish - libc5-based Linux systems. Only include it on systems that are known to - require it! */ -#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ - defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ - defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ - defined(__CYGWIN__) || defined(AMIGA) || defined(__NuttX__) || \ - (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) || \ - (defined(__MidnightBSD_version) && (__MidnightBSD_version < 100000)) -#include -#endif - -#if !defined(CURL_WIN32) && !defined(_WIN32_WCE) -#include -#endif - -#if !defined(CURL_WIN32) -#include -#endif - -/* Compatibility for non-Clang compilers */ -#ifndef __has_declspec_attribute -# define __has_declspec_attribute(x) 0 -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) -typedef struct Curl_easy CURL; -typedef struct Curl_share CURLSH; -#else -typedef void CURL; -typedef void CURLSH; -#endif - -/* - * libcurl external API function linkage decorations. - */ - -#ifdef CURL_STATICLIB -# define CURL_EXTERN -#elif defined(CURL_WIN32) || defined(__SYMBIAN32__) || \ - (__has_declspec_attribute(dllexport) && \ - __has_declspec_attribute(dllimport)) -# if defined(BUILDING_LIBCURL) -# define CURL_EXTERN __declspec(dllexport) -# else -# define CURL_EXTERN __declspec(dllimport) -# endif -#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS) -# define CURL_EXTERN CURL_EXTERN_SYMBOL -#else -# define CURL_EXTERN -#endif - -#ifndef curl_socket_typedef -/* socket typedef */ -#if defined(CURL_WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H) -typedef SOCKET curl_socket_t; -#define CURL_SOCKET_BAD INVALID_SOCKET -#else -typedef int curl_socket_t; -#define CURL_SOCKET_BAD -1 -#endif -#define curl_socket_typedef -#endif /* curl_socket_typedef */ - -/* enum for the different supported SSL backends */ -typedef enum { - CURLSSLBACKEND_NONE = 0, - CURLSSLBACKEND_OPENSSL = 1, - CURLSSLBACKEND_GNUTLS = 2, - CURLSSLBACKEND_NSS = 3, - CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */ - CURLSSLBACKEND_GSKIT = 5, - CURLSSLBACKEND_POLARSSL = 6, - CURLSSLBACKEND_WOLFSSL = 7, - CURLSSLBACKEND_SCHANNEL = 8, - CURLSSLBACKEND_SECURETRANSPORT = 9, - CURLSSLBACKEND_AXTLS = 10, /* never used since 7.63.0 */ - CURLSSLBACKEND_MBEDTLS = 11, - CURLSSLBACKEND_MESALINK = 12, - CURLSSLBACKEND_BEARSSL = 13, - CURLSSLBACKEND_RUSTLS = 14 -} curl_sslbackend; - -/* aliases for library clones and renames */ -#define CURLSSLBACKEND_LIBRESSL CURLSSLBACKEND_OPENSSL -#define CURLSSLBACKEND_BORINGSSL CURLSSLBACKEND_OPENSSL - -/* deprecated names: */ -#define CURLSSLBACKEND_CYASSL CURLSSLBACKEND_WOLFSSL -#define CURLSSLBACKEND_DARWINSSL CURLSSLBACKEND_SECURETRANSPORT - -struct curl_httppost { - struct curl_httppost *next; /* next entry in the list */ - char *name; /* pointer to allocated name */ - long namelength; /* length of name length */ - char *contents; /* pointer to allocated data contents */ - long contentslength; /* length of contents field, see also - CURL_HTTPPOST_LARGE */ - char *buffer; /* pointer to allocated buffer contents */ - long bufferlength; /* length of buffer field */ - char *contenttype; /* Content-Type */ - struct curl_slist *contentheader; /* list of extra headers for this form */ - struct curl_httppost *more; /* if one field name has more than one - file, this link should link to following - files */ - long flags; /* as defined below */ - -/* specified content is a file name */ -#define CURL_HTTPPOST_FILENAME (1<<0) -/* specified content is a file name */ -#define CURL_HTTPPOST_READFILE (1<<1) -/* name is only stored pointer do not free in formfree */ -#define CURL_HTTPPOST_PTRNAME (1<<2) -/* contents is only stored pointer do not free in formfree */ -#define CURL_HTTPPOST_PTRCONTENTS (1<<3) -/* upload file from buffer */ -#define CURL_HTTPPOST_BUFFER (1<<4) -/* upload file from pointer contents */ -#define CURL_HTTPPOST_PTRBUFFER (1<<5) -/* upload file contents by using the regular read callback to get the data and - pass the given pointer as custom pointer */ -#define CURL_HTTPPOST_CALLBACK (1<<6) -/* use size in 'contentlen', added in 7.46.0 */ -#define CURL_HTTPPOST_LARGE (1<<7) - - char *showfilename; /* The file name to show. If not set, the - actual file name will be used (if this - is a file part) */ - void *userp; /* custom pointer used for - HTTPPOST_CALLBACK posts */ - curl_off_t contentlen; /* alternative length of contents - field. Used if CURL_HTTPPOST_LARGE is - set. Added in 7.46.0 */ -}; - - -/* This is a return code for the progress callback that, when returned, will - signal libcurl to continue executing the default progress function */ -#define CURL_PROGRESSFUNC_CONTINUE 0x10000001 - -/* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now - considered deprecated but was the only choice up until 7.31.0 */ -typedef int (*curl_progress_callback)(void *clientp, - double dltotal, - double dlnow, - double ultotal, - double ulnow); - -/* This is the CURLOPT_XFERINFOFUNCTION callback prototype. It was introduced - in 7.32.0, avoids the use of floating point numbers and provides more - detailed information. */ -typedef int (*curl_xferinfo_callback)(void *clientp, - curl_off_t dltotal, - curl_off_t dlnow, - curl_off_t ultotal, - curl_off_t ulnow); - -#ifndef CURL_MAX_READ_SIZE - /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */ -#define CURL_MAX_READ_SIZE 524288 -#endif - -#ifndef CURL_MAX_WRITE_SIZE - /* Tests have proven that 20K is a very bad buffer size for uploads on - Windows, while 16K for some odd reason performed a lot better. - We do the ifndef check to allow this value to easier be changed at build - time for those who feel adventurous. The practical minimum is about - 400 bytes since libcurl uses a buffer of this size as a scratch area - (unrelated to network send operations). */ -#define CURL_MAX_WRITE_SIZE 16384 -#endif - -#ifndef CURL_MAX_HTTP_HEADER -/* The only reason to have a max limit for this is to avoid the risk of a bad - server feeding libcurl with a never-ending header that will cause reallocs - infinitely */ -#define CURL_MAX_HTTP_HEADER (100*1024) -#endif - -/* This is a magic return code for the write callback that, when returned, - will signal libcurl to pause receiving on the current transfer. */ -#define CURL_WRITEFUNC_PAUSE 0x10000001 - -typedef size_t (*curl_write_callback)(char *buffer, - size_t size, - size_t nitems, - void *outstream); - -/* This callback will be called when a new resolver request is made */ -typedef int (*curl_resolver_start_callback)(void *resolver_state, - void *reserved, void *userdata); - -/* enumeration of file types */ -typedef enum { - CURLFILETYPE_FILE = 0, - CURLFILETYPE_DIRECTORY, - CURLFILETYPE_SYMLINK, - CURLFILETYPE_DEVICE_BLOCK, - CURLFILETYPE_DEVICE_CHAR, - CURLFILETYPE_NAMEDPIPE, - CURLFILETYPE_SOCKET, - CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ - - CURLFILETYPE_UNKNOWN /* should never occur */ -} curlfiletype; - -#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) -#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) -#define CURLFINFOFLAG_KNOWN_TIME (1<<2) -#define CURLFINFOFLAG_KNOWN_PERM (1<<3) -#define CURLFINFOFLAG_KNOWN_UID (1<<4) -#define CURLFINFOFLAG_KNOWN_GID (1<<5) -#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) -#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) - -/* Information about a single file, used when doing FTP wildcard matching */ -struct curl_fileinfo { - char *filename; - curlfiletype filetype; - time_t time; /* always zero! */ - unsigned int perm; - int uid; - int gid; - curl_off_t size; - long int hardlinks; - - struct { - /* If some of these fields is not NULL, it is a pointer to b_data. */ - char *time; - char *perm; - char *user; - char *group; - char *target; /* pointer to the target filename of a symlink */ - } strings; - - unsigned int flags; - - /* used internally */ - char *b_data; - size_t b_size; - size_t b_used; -}; - -/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ -#define CURL_CHUNK_BGN_FUNC_OK 0 -#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ -#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ - -/* if splitting of data transfer is enabled, this callback is called before - download of an individual chunk started. Note that parameter "remains" works - only for FTP wildcard downloading (for now), otherwise is not used */ -typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, - void *ptr, - int remains); - -/* return codes for CURLOPT_CHUNK_END_FUNCTION */ -#define CURL_CHUNK_END_FUNC_OK 0 -#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ - -/* If splitting of data transfer is enabled this callback is called after - download of an individual chunk finished. - Note! After this callback was set then it have to be called FOR ALL chunks. - Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. - This is the reason why we don't need "transfer_info" parameter in this - callback and we are not interested in "remains" parameter too. */ -typedef long (*curl_chunk_end_callback)(void *ptr); - -/* return codes for FNMATCHFUNCTION */ -#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ -#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ -#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ - -/* callback type for wildcard downloading pattern matching. If the - string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ -typedef int (*curl_fnmatch_callback)(void *ptr, - const char *pattern, - const char *string); - -/* These are the return codes for the seek callbacks */ -#define CURL_SEEKFUNC_OK 0 -#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ -#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so - libcurl might try other means instead */ -typedef int (*curl_seek_callback)(void *instream, - curl_off_t offset, - int origin); /* 'whence' */ - -/* This is a return code for the read callback that, when returned, will - signal libcurl to immediately abort the current transfer. */ -#define CURL_READFUNC_ABORT 0x10000000 -/* This is a return code for the read callback that, when returned, will - signal libcurl to pause sending data on the current transfer. */ -#define CURL_READFUNC_PAUSE 0x10000001 - -/* Return code for when the trailing headers' callback has terminated - without any errors*/ -#define CURL_TRAILERFUNC_OK 0 -/* Return code for when was an error in the trailing header's list and we - want to abort the request */ -#define CURL_TRAILERFUNC_ABORT 1 - -typedef size_t (*curl_read_callback)(char *buffer, - size_t size, - size_t nitems, - void *instream); - -typedef int (*curl_trailer_callback)(struct curl_slist **list, - void *userdata); - -typedef enum { - CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ - CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ - CURLSOCKTYPE_LAST /* never use */ -} curlsocktype; - -/* The return code from the sockopt_callback can signal information back - to libcurl: */ -#define CURL_SOCKOPT_OK 0 -#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return - CURLE_ABORTED_BY_CALLBACK */ -#define CURL_SOCKOPT_ALREADY_CONNECTED 2 - -typedef int (*curl_sockopt_callback)(void *clientp, - curl_socket_t curlfd, - curlsocktype purpose); - -struct curl_sockaddr { - int family; - int socktype; - int protocol; - unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it - turned really ugly and painful on the systems that - lack this type */ - struct sockaddr addr; -}; - -typedef curl_socket_t -(*curl_opensocket_callback)(void *clientp, - curlsocktype purpose, - struct curl_sockaddr *address); - -typedef int -(*curl_closesocket_callback)(void *clientp, curl_socket_t item); - -typedef enum { - CURLIOE_OK, /* I/O operation successful */ - CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ - CURLIOE_FAILRESTART, /* failed to restart the read */ - CURLIOE_LAST /* never use */ -} curlioerr; - -typedef enum { - CURLIOCMD_NOP, /* no operation */ - CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ - CURLIOCMD_LAST /* never use */ -} curliocmd; - -typedef curlioerr (*curl_ioctl_callback)(CURL *handle, - int cmd, - void *clientp); - -#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS -/* - * The following typedef's are signatures of malloc, free, realloc, strdup and - * calloc respectively. Function pointers of these types can be passed to the - * curl_global_init_mem() function to set user defined memory management - * callback routines. - */ -typedef void *(*curl_malloc_callback)(size_t size); -typedef void (*curl_free_callback)(void *ptr); -typedef void *(*curl_realloc_callback)(void *ptr, size_t size); -typedef char *(*curl_strdup_callback)(const char *str); -typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); - -#define CURL_DID_MEMORY_FUNC_TYPEDEFS -#endif - -/* the kind of data that is passed to information_callback*/ -typedef enum { - CURLINFO_TEXT = 0, - CURLINFO_HEADER_IN, /* 1 */ - CURLINFO_HEADER_OUT, /* 2 */ - CURLINFO_DATA_IN, /* 3 */ - CURLINFO_DATA_OUT, /* 4 */ - CURLINFO_SSL_DATA_IN, /* 5 */ - CURLINFO_SSL_DATA_OUT, /* 6 */ - CURLINFO_END -} curl_infotype; - -typedef int (*curl_debug_callback) - (CURL *handle, /* the handle/transfer this concerns */ - curl_infotype type, /* what kind of data */ - char *data, /* points to the data */ - size_t size, /* size of the data pointed to */ - void *userptr); /* whatever the user please */ - -/* This is the CURLOPT_PREREQFUNCTION callback prototype. */ -typedef int (*curl_prereq_callback)(void *clientp, - char *conn_primary_ip, - char *conn_local_ip, - int conn_primary_port, - int conn_local_port); - -/* Return code for when the pre-request callback has terminated without - any errors */ -#define CURL_PREREQFUNC_OK 0 -/* Return code for when the pre-request callback wants to abort the - request */ -#define CURL_PREREQFUNC_ABORT 1 - -/* All possible error codes from all sorts of curl functions. Future versions - may return other values, stay prepared. - - Always add new return codes last. Never *EVER* remove any. The return - codes must remain the same! - */ - -typedef enum { - CURLE_OK = 0, - CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ - CURLE_FAILED_INIT, /* 2 */ - CURLE_URL_MALFORMAT, /* 3 */ - CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for - 7.17.0, reused in April 2011 for 7.21.5] */ - CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ - CURLE_COULDNT_RESOLVE_HOST, /* 6 */ - CURLE_COULDNT_CONNECT, /* 7 */ - CURLE_WEIRD_SERVER_REPLY, /* 8 */ - CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server - due to lack of access - when login fails - this is not returned. */ - CURLE_FTP_ACCEPT_FAILED, /* 10 - [was obsoleted in April 2006 for - 7.15.4, reused in Dec 2011 for 7.24.0]*/ - CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ - CURLE_FTP_ACCEPT_TIMEOUT, /* 12 - timeout occurred accepting server - [was obsoleted in August 2007 for 7.17.0, - reused in Dec 2011 for 7.24.0]*/ - CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ - CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ - CURLE_FTP_CANT_GET_HOST, /* 15 */ - CURLE_HTTP2, /* 16 - A problem in the http2 framing layer. - [was obsoleted in August 2007 for 7.17.0, - reused in July 2014 for 7.38.0] */ - CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ - CURLE_PARTIAL_FILE, /* 18 */ - CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ - CURLE_OBSOLETE20, /* 20 - NOT USED */ - CURLE_QUOTE_ERROR, /* 21 - quote command failure */ - CURLE_HTTP_RETURNED_ERROR, /* 22 */ - CURLE_WRITE_ERROR, /* 23 */ - CURLE_OBSOLETE24, /* 24 - NOT USED */ - CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ - CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ - CURLE_OUT_OF_MEMORY, /* 27 */ - CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ - CURLE_OBSOLETE29, /* 29 - NOT USED */ - CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ - CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ - CURLE_OBSOLETE32, /* 32 - NOT USED */ - CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ - CURLE_HTTP_POST_ERROR, /* 34 */ - CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ - CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ - CURLE_FILE_COULDNT_READ_FILE, /* 37 */ - CURLE_LDAP_CANNOT_BIND, /* 38 */ - CURLE_LDAP_SEARCH_FAILED, /* 39 */ - CURLE_OBSOLETE40, /* 40 - NOT USED */ - CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */ - CURLE_ABORTED_BY_CALLBACK, /* 42 */ - CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ - CURLE_OBSOLETE44, /* 44 - NOT USED */ - CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ - CURLE_OBSOLETE46, /* 46 - NOT USED */ - CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */ - CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ - CURLE_SETOPT_OPTION_SYNTAX, /* 49 - Malformed setopt option */ - CURLE_OBSOLETE50, /* 50 - NOT USED */ - CURLE_OBSOLETE51, /* 51 - NOT USED */ - CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ - CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ - CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as - default */ - CURLE_SEND_ERROR, /* 55 - failed sending network data */ - CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ - CURLE_OBSOLETE57, /* 57 - NOT IN USE */ - CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ - CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ - CURLE_PEER_FAILED_VERIFICATION, /* 60 - peer's certificate or fingerprint - wasn't verified fine */ - CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ - CURLE_OBSOLETE62, /* 62 - NOT IN USE since 7.82.0 */ - CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ - CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ - CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind - that failed */ - CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ - CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not - accepted and we failed to login */ - CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ - CURLE_TFTP_PERM, /* 69 - permission problem on server */ - CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ - CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ - CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ - CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ - CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ - CURLE_OBSOLETE75, /* 75 - NOT IN USE since 7.82.0 */ - CURLE_OBSOLETE76, /* 76 - NOT IN USE since 7.82.0 */ - CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing - or wrong format */ - CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ - CURLE_SSH, /* 79 - error from the SSH layer, somewhat - generic so the error message will be of - interest when this has happened */ - - CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL - connection */ - CURLE_AGAIN, /* 81 - socket is not ready for send/recv, - wait till it's ready and try again (Added - in 7.18.2) */ - CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or - wrong format (Added in 7.19.0) */ - CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in - 7.19.0) */ - CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ - CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ - CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ - CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ - CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ - CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the - session will be queued */ - CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not - match */ - CURLE_SSL_INVALIDCERTSTATUS, /* 91 - invalid certificate status */ - CURLE_HTTP2_STREAM, /* 92 - stream error in HTTP/2 framing layer - */ - CURLE_RECURSIVE_API_CALL, /* 93 - an api function was called from - inside a callback */ - CURLE_AUTH_ERROR, /* 94 - an authentication function returned an - error */ - CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */ - CURLE_QUIC_CONNECT_ERROR, /* 96 - QUIC connection error */ - CURLE_PROXY, /* 97 - proxy handshake error */ - CURLE_SSL_CLIENTCERT, /* 98 - client-side certificate required */ - CURLE_UNRECOVERABLE_POLL, /* 99 - poll/select returned fatal error */ - CURL_LAST /* never use! */ -} CURLcode; - -#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all - the obsolete stuff removed! */ - -/* Previously obsolete error code re-used in 7.38.0 */ -#define CURLE_OBSOLETE16 CURLE_HTTP2 - -/* Previously obsolete error codes re-used in 7.24.0 */ -#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED -#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT - -/* compatibility with older names */ -#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING -#define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY - -/* The following were added in 7.62.0 */ -#define CURLE_SSL_CACERT CURLE_PEER_FAILED_VERIFICATION - -/* The following were added in 7.21.5, April 2011 */ -#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION - -/* Added for 7.78.0 */ -#define CURLE_TELNET_OPTION_SYNTAX CURLE_SETOPT_OPTION_SYNTAX - -/* The following were added in 7.17.1 */ -/* These are scheduled to disappear by 2009 */ -#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION - -/* The following were added in 7.17.0 */ -/* These are scheduled to disappear by 2009 */ -#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */ -#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 -#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 -#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 -#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 -#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 -#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 -#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 -#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 -#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 -#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 -#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 -#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN - -#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED -#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE -#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR -#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL -#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS -#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR -#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED - -/* The following were added earlier */ - -#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT -#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR -#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED -#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED -#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE -#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME -#define CURLE_LDAP_INVALID_URL CURLE_OBSOLETE62 -#define CURLE_CONV_REQD CURLE_OBSOLETE76 -#define CURLE_CONV_FAILED CURLE_OBSOLETE75 - -/* This was the error code 50 in 7.7.3 and a few earlier versions, this - is no longer used by libcurl but is instead #defined here only to not - make programs break */ -#define CURLE_ALREADY_COMPLETE 99999 - -/* Provide defines for really old option names */ -#define CURLOPT_FILE CURLOPT_WRITEDATA /* name changed in 7.9.7 */ -#define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */ -#define CURLOPT_WRITEHEADER CURLOPT_HEADERDATA - -/* Since long deprecated options with no code in the lib that does anything - with them. */ -#define CURLOPT_WRITEINFO CURLOPT_OBSOLETE40 -#define CURLOPT_CLOSEPOLICY CURLOPT_OBSOLETE72 - -#endif /*!CURL_NO_OLDIES*/ - -/* - * Proxy error codes. Returned in CURLINFO_PROXY_ERROR if CURLE_PROXY was - * return for the transfers. - */ -typedef enum { - CURLPX_OK, - CURLPX_BAD_ADDRESS_TYPE, - CURLPX_BAD_VERSION, - CURLPX_CLOSED, - CURLPX_GSSAPI, - CURLPX_GSSAPI_PERMSG, - CURLPX_GSSAPI_PROTECTION, - CURLPX_IDENTD, - CURLPX_IDENTD_DIFFER, - CURLPX_LONG_HOSTNAME, - CURLPX_LONG_PASSWD, - CURLPX_LONG_USER, - CURLPX_NO_AUTH, - CURLPX_RECV_ADDRESS, - CURLPX_RECV_AUTH, - CURLPX_RECV_CONNECT, - CURLPX_RECV_REQACK, - CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED, - CURLPX_REPLY_COMMAND_NOT_SUPPORTED, - CURLPX_REPLY_CONNECTION_REFUSED, - CURLPX_REPLY_GENERAL_SERVER_FAILURE, - CURLPX_REPLY_HOST_UNREACHABLE, - CURLPX_REPLY_NETWORK_UNREACHABLE, - CURLPX_REPLY_NOT_ALLOWED, - CURLPX_REPLY_TTL_EXPIRED, - CURLPX_REPLY_UNASSIGNED, - CURLPX_REQUEST_FAILED, - CURLPX_RESOLVE_HOST, - CURLPX_SEND_AUTH, - CURLPX_SEND_CONNECT, - CURLPX_SEND_REQUEST, - CURLPX_UNKNOWN_FAIL, - CURLPX_UNKNOWN_MODE, - CURLPX_USER_REJECTED, - CURLPX_LAST /* never use */ -} CURLproxycode; - -/* This prototype applies to all conversion callbacks */ -typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); - -typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ - void *ssl_ctx, /* actually an OpenSSL - or WolfSSL SSL_CTX, - or an mbedTLS - mbedtls_ssl_config */ - void *userptr); - -typedef enum { - CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use - CONNECT HTTP/1.1 */ - CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT - HTTP/1.0 */ - CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ - CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already - in 7.10 */ - CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ - CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ - CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the - host name rather than the IP address. added - in 7.18.0 */ -} curl_proxytype; /* this enum was added in 7.10 */ - -/* - * Bitmasks for CURLOPT_HTTPAUTH and CURLOPT_PROXYAUTH options: - * - * CURLAUTH_NONE - No HTTP authentication - * CURLAUTH_BASIC - HTTP Basic authentication (default) - * CURLAUTH_DIGEST - HTTP Digest authentication - * CURLAUTH_NEGOTIATE - HTTP Negotiate (SPNEGO) authentication - * CURLAUTH_GSSNEGOTIATE - Alias for CURLAUTH_NEGOTIATE (deprecated) - * CURLAUTH_NTLM - HTTP NTLM authentication - * CURLAUTH_DIGEST_IE - HTTP Digest authentication with IE flavour - * CURLAUTH_NTLM_WB - HTTP NTLM authentication delegated to winbind helper - * CURLAUTH_BEARER - HTTP Bearer token authentication - * CURLAUTH_ONLY - Use together with a single other type to force no - * authentication or just that single type - * CURLAUTH_ANY - All fine types set - * CURLAUTH_ANYSAFE - All fine types except Basic - */ - -#define CURLAUTH_NONE ((unsigned long)0) -#define CURLAUTH_BASIC (((unsigned long)1)<<0) -#define CURLAUTH_DIGEST (((unsigned long)1)<<1) -#define CURLAUTH_NEGOTIATE (((unsigned long)1)<<2) -/* Deprecated since the advent of CURLAUTH_NEGOTIATE */ -#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE -/* Used for CURLOPT_SOCKS5_AUTH to stay terminologically correct */ -#define CURLAUTH_GSSAPI CURLAUTH_NEGOTIATE -#define CURLAUTH_NTLM (((unsigned long)1)<<3) -#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4) -#define CURLAUTH_NTLM_WB (((unsigned long)1)<<5) -#define CURLAUTH_BEARER (((unsigned long)1)<<6) -#define CURLAUTH_AWS_SIGV4 (((unsigned long)1)<<7) -#define CURLAUTH_ONLY (((unsigned long)1)<<31) -#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) -#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) - -#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ -#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ -#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ -#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ -#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ -#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ -#define CURLSSH_AUTH_AGENT (1<<4) /* agent (ssh-agent, pageant...) */ -#define CURLSSH_AUTH_GSSAPI (1<<5) /* gssapi (kerberos, ...) */ -#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY - -#define CURLGSSAPI_DELEGATION_NONE 0 /* no delegation (default) */ -#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* if permitted by policy */ -#define CURLGSSAPI_DELEGATION_FLAG (1<<1) /* delegate always */ - -#define CURL_ERROR_SIZE 256 - -enum curl_khtype { - CURLKHTYPE_UNKNOWN, - CURLKHTYPE_RSA1, - CURLKHTYPE_RSA, - CURLKHTYPE_DSS, - CURLKHTYPE_ECDSA, - CURLKHTYPE_ED25519 -}; - -struct curl_khkey { - const char *key; /* points to a null-terminated string encoded with base64 - if len is zero, otherwise to the "raw" data */ - size_t len; - enum curl_khtype keytype; -}; - -/* this is the set of return values expected from the curl_sshkeycallback - callback */ -enum curl_khstat { - CURLKHSTAT_FINE_ADD_TO_FILE, - CURLKHSTAT_FINE, - CURLKHSTAT_REJECT, /* reject the connection, return an error */ - CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so - this causes a CURLE_DEFER error but otherwise the - connection will be left intact etc */ - CURLKHSTAT_FINE_REPLACE, /* accept and replace the wrong key*/ - CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ -}; - -/* this is the set of status codes pass in to the callback */ -enum curl_khmatch { - CURLKHMATCH_OK, /* match */ - CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ - CURLKHMATCH_MISSING, /* no matching host/key found */ - CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ -}; - -typedef int - (*curl_sshkeycallback) (CURL *easy, /* easy handle */ - const struct curl_khkey *knownkey, /* known */ - const struct curl_khkey *foundkey, /* found */ - enum curl_khmatch, /* libcurl's view on the keys */ - void *clientp); /* custom pointer passed with */ - /* CURLOPT_SSH_KEYDATA */ - -typedef int - (*curl_sshhostkeycallback) (void *clientp,/* custom pointer passed*/ - /* with CURLOPT_SSH_HOSTKEYDATA */ - int keytype, /* CURLKHTYPE */ - const char *key, /*hostkey to check*/ - size_t keylen); /*length of the key*/ - /*return CURLE_OK to accept*/ - /*or something else to refuse*/ - - -/* parameter for the CURLOPT_USE_SSL option */ -typedef enum { - CURLUSESSL_NONE, /* do not attempt to use SSL */ - CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ - CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ - CURLUSESSL_ALL, /* SSL for all communication or fail */ - CURLUSESSL_LAST /* not an option, never use */ -} curl_usessl; - -/* Definition of bits for the CURLOPT_SSL_OPTIONS argument: */ - -/* - ALLOW_BEAST tells libcurl to allow the BEAST SSL vulnerability in the - name of improving interoperability with older servers. Some SSL libraries - have introduced work-arounds for this flaw but those work-arounds sometimes - make the SSL communication fail. To regain functionality with those broken - servers, a user can this way allow the vulnerability back. */ -#define CURLSSLOPT_ALLOW_BEAST (1<<0) - -/* - NO_REVOKE tells libcurl to disable certificate revocation checks for those - SSL backends where such behavior is present. */ -#define CURLSSLOPT_NO_REVOKE (1<<1) - -/* - NO_PARTIALCHAIN tells libcurl to *NOT* accept a partial certificate chain - if possible. The OpenSSL backend has this ability. */ -#define CURLSSLOPT_NO_PARTIALCHAIN (1<<2) - -/* - REVOKE_BEST_EFFORT tells libcurl to ignore certificate revocation offline - checks and ignore missing revocation list for those SSL backends where such - behavior is present. */ -#define CURLSSLOPT_REVOKE_BEST_EFFORT (1<<3) - -/* - CURLSSLOPT_NATIVE_CA tells libcurl to use standard certificate store of - operating system. Currently implemented under MS-Windows. */ -#define CURLSSLOPT_NATIVE_CA (1<<4) - -/* - CURLSSLOPT_AUTO_CLIENT_CERT tells libcurl to automatically locate and use - a client certificate for authentication. (Schannel) */ -#define CURLSSLOPT_AUTO_CLIENT_CERT (1<<5) - -/* The default connection attempt delay in milliseconds for happy eyeballs. - CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 and happy-eyeballs-timeout-ms.d document - this value, keep them in sync. */ -#define CURL_HET_DEFAULT 200L - -/* The default connection upkeep interval in milliseconds. */ -#define CURL_UPKEEP_INTERVAL_DEFAULT 60000L - -#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all - the obsolete stuff removed! */ - -/* Backwards compatibility with older names */ -/* These are scheduled to disappear by 2009 */ - -#define CURLFTPSSL_NONE CURLUSESSL_NONE -#define CURLFTPSSL_TRY CURLUSESSL_TRY -#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL -#define CURLFTPSSL_ALL CURLUSESSL_ALL -#define CURLFTPSSL_LAST CURLUSESSL_LAST -#define curl_ftpssl curl_usessl -#endif /*!CURL_NO_OLDIES*/ - -/* parameter for the CURLOPT_FTP_SSL_CCC option */ -typedef enum { - CURLFTPSSL_CCC_NONE, /* do not send CCC */ - CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ - CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ - CURLFTPSSL_CCC_LAST /* not an option, never use */ -} curl_ftpccc; - -/* parameter for the CURLOPT_FTPSSLAUTH option */ -typedef enum { - CURLFTPAUTH_DEFAULT, /* let libcurl decide */ - CURLFTPAUTH_SSL, /* use "AUTH SSL" */ - CURLFTPAUTH_TLS, /* use "AUTH TLS" */ - CURLFTPAUTH_LAST /* not an option, never use */ -} curl_ftpauth; - -/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ -typedef enum { - CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ - CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD - again if MKD succeeded, for SFTP this does - similar magic */ - CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD - again even if MKD failed! */ - CURLFTP_CREATE_DIR_LAST /* not an option, never use */ -} curl_ftpcreatedir; - -/* parameter for the CURLOPT_FTP_FILEMETHOD option */ -typedef enum { - CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ - CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ - CURLFTPMETHOD_NOCWD, /* no CWD at all */ - CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ - CURLFTPMETHOD_LAST /* not an option, never use */ -} curl_ftpmethod; - -/* bitmask defines for CURLOPT_HEADEROPT */ -#define CURLHEADER_UNIFIED 0 -#define CURLHEADER_SEPARATE (1<<0) - -/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */ -#define CURLALTSVC_READONLYFILE (1<<2) -#define CURLALTSVC_H1 (1<<3) -#define CURLALTSVC_H2 (1<<4) -#define CURLALTSVC_H3 (1<<5) - - -struct curl_hstsentry { - char *name; - size_t namelen; - unsigned int includeSubDomains:1; - char expire[18]; /* YYYYMMDD HH:MM:SS [null-terminated] */ -}; - -struct curl_index { - size_t index; /* the provided entry's "index" or count */ - size_t total; /* total number of entries to save */ -}; - -typedef enum { - CURLSTS_OK, - CURLSTS_DONE, - CURLSTS_FAIL -} CURLSTScode; - -typedef CURLSTScode (*curl_hstsread_callback)(CURL *easy, - struct curl_hstsentry *e, - void *userp); -typedef CURLSTScode (*curl_hstswrite_callback)(CURL *easy, - struct curl_hstsentry *e, - struct curl_index *i, - void *userp); - -/* CURLHSTS_* are bits for the CURLOPT_HSTS option */ -#define CURLHSTS_ENABLE (long)(1<<0) -#define CURLHSTS_READONLYFILE (long)(1<<1) - -/* The CURLPROTO_ defines below are for the **deprecated** CURLOPT_*PROTOCOLS - options. Do not use. */ -#define CURLPROTO_HTTP (1<<0) -#define CURLPROTO_HTTPS (1<<1) -#define CURLPROTO_FTP (1<<2) -#define CURLPROTO_FTPS (1<<3) -#define CURLPROTO_SCP (1<<4) -#define CURLPROTO_SFTP (1<<5) -#define CURLPROTO_TELNET (1<<6) -#define CURLPROTO_LDAP (1<<7) -#define CURLPROTO_LDAPS (1<<8) -#define CURLPROTO_DICT (1<<9) -#define CURLPROTO_FILE (1<<10) -#define CURLPROTO_TFTP (1<<11) -#define CURLPROTO_IMAP (1<<12) -#define CURLPROTO_IMAPS (1<<13) -#define CURLPROTO_POP3 (1<<14) -#define CURLPROTO_POP3S (1<<15) -#define CURLPROTO_SMTP (1<<16) -#define CURLPROTO_SMTPS (1<<17) -#define CURLPROTO_RTSP (1<<18) -#define CURLPROTO_RTMP (1<<19) -#define CURLPROTO_RTMPT (1<<20) -#define CURLPROTO_RTMPE (1<<21) -#define CURLPROTO_RTMPTE (1<<22) -#define CURLPROTO_RTMPS (1<<23) -#define CURLPROTO_RTMPTS (1<<24) -#define CURLPROTO_GOPHER (1<<25) -#define CURLPROTO_SMB (1<<26) -#define CURLPROTO_SMBS (1<<27) -#define CURLPROTO_MQTT (1<<28) -#define CURLPROTO_GOPHERS (1<<29) -#define CURLPROTO_ALL (~0) /* enable everything */ - -/* long may be 32 or 64 bits, but we should never depend on anything else - but 32 */ -#define CURLOPTTYPE_LONG 0 -#define CURLOPTTYPE_OBJECTPOINT 10000 -#define CURLOPTTYPE_FUNCTIONPOINT 20000 -#define CURLOPTTYPE_OFF_T 30000 -#define CURLOPTTYPE_BLOB 40000 - -/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the - string options from the header file */ - - -#define CURLOPT(na,t,nu) na = t + nu - -/* CURLOPT aliases that make no run-time difference */ - -/* 'char *' argument to a string with a trailing zero */ -#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT - -/* 'struct curl_slist *' argument */ -#define CURLOPTTYPE_SLISTPOINT CURLOPTTYPE_OBJECTPOINT - -/* 'void *' argument passed untouched to callback */ -#define CURLOPTTYPE_CBPOINT CURLOPTTYPE_OBJECTPOINT - -/* 'long' argument with a set of values/bitmask */ -#define CURLOPTTYPE_VALUES CURLOPTTYPE_LONG - -/* - * All CURLOPT_* values. - */ - -typedef enum { - /* This is the FILE * or void * the regular output should be written to. */ - CURLOPT(CURLOPT_WRITEDATA, CURLOPTTYPE_CBPOINT, 1), - - /* The full URL to get/put */ - CURLOPT(CURLOPT_URL, CURLOPTTYPE_STRINGPOINT, 2), - - /* Port number to connect to, if other than default. */ - CURLOPT(CURLOPT_PORT, CURLOPTTYPE_LONG, 3), - - /* Name of proxy to use. */ - CURLOPT(CURLOPT_PROXY, CURLOPTTYPE_STRINGPOINT, 4), - - /* "user:password;options" to use when fetching. */ - CURLOPT(CURLOPT_USERPWD, CURLOPTTYPE_STRINGPOINT, 5), - - /* "user:password" to use with proxy. */ - CURLOPT(CURLOPT_PROXYUSERPWD, CURLOPTTYPE_STRINGPOINT, 6), - - /* Range to get, specified as an ASCII string. */ - CURLOPT(CURLOPT_RANGE, CURLOPTTYPE_STRINGPOINT, 7), - - /* not used */ - - /* Specified file stream to upload from (use as input): */ - CURLOPT(CURLOPT_READDATA, CURLOPTTYPE_CBPOINT, 9), - - /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE - * bytes big. */ - CURLOPT(CURLOPT_ERRORBUFFER, CURLOPTTYPE_OBJECTPOINT, 10), - - /* Function that will be called to store the output (instead of fwrite). The - * parameters will use fwrite() syntax, make sure to follow them. */ - CURLOPT(CURLOPT_WRITEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 11), - - /* Function that will be called to read the input (instead of fread). The - * parameters will use fread() syntax, make sure to follow them. */ - CURLOPT(CURLOPT_READFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 12), - - /* Time-out the read operation after this amount of seconds */ - CURLOPT(CURLOPT_TIMEOUT, CURLOPTTYPE_LONG, 13), - - /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about - * how large the file being sent really is. That allows better error - * checking and better verifies that the upload was successful. -1 means - * unknown size. - * - * For large file support, there is also a _LARGE version of the key - * which takes an off_t type, allowing platforms with larger off_t - * sizes to handle larger files. See below for INFILESIZE_LARGE. - */ - CURLOPT(CURLOPT_INFILESIZE, CURLOPTTYPE_LONG, 14), - - /* POST static input fields. */ - CURLOPT(CURLOPT_POSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 15), - - /* Set the referrer page (needed by some CGIs) */ - CURLOPT(CURLOPT_REFERER, CURLOPTTYPE_STRINGPOINT, 16), - - /* Set the FTP PORT string (interface name, named or numerical IP address) - Use i.e '-' to use default address. */ - CURLOPT(CURLOPT_FTPPORT, CURLOPTTYPE_STRINGPOINT, 17), - - /* Set the User-Agent string (examined by some CGIs) */ - CURLOPT(CURLOPT_USERAGENT, CURLOPTTYPE_STRINGPOINT, 18), - - /* If the download receives less than "low speed limit" bytes/second - * during "low speed time" seconds, the operations is aborted. - * You could i.e if you have a pretty high speed connection, abort if - * it is less than 2000 bytes/sec during 20 seconds. - */ - - /* Set the "low speed limit" */ - CURLOPT(CURLOPT_LOW_SPEED_LIMIT, CURLOPTTYPE_LONG, 19), - - /* Set the "low speed time" */ - CURLOPT(CURLOPT_LOW_SPEED_TIME, CURLOPTTYPE_LONG, 20), - - /* Set the continuation offset. - * - * Note there is also a _LARGE version of this key which uses - * off_t types, allowing for large file offsets on platforms which - * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. - */ - CURLOPT(CURLOPT_RESUME_FROM, CURLOPTTYPE_LONG, 21), - - /* Set cookie in request: */ - CURLOPT(CURLOPT_COOKIE, CURLOPTTYPE_STRINGPOINT, 22), - - /* This points to a linked list of headers, struct curl_slist kind. This - list is also used for RTSP (in spite of its name) */ - CURLOPT(CURLOPT_HTTPHEADER, CURLOPTTYPE_SLISTPOINT, 23), - - /* This points to a linked list of post entries, struct curl_httppost */ - CURLOPT(CURLOPT_HTTPPOST, CURLOPTTYPE_OBJECTPOINT, 24), - - /* name of the file keeping your private SSL-certificate */ - CURLOPT(CURLOPT_SSLCERT, CURLOPTTYPE_STRINGPOINT, 25), - - /* password for the SSL or SSH private key */ - CURLOPT(CURLOPT_KEYPASSWD, CURLOPTTYPE_STRINGPOINT, 26), - - /* send TYPE parameter? */ - CURLOPT(CURLOPT_CRLF, CURLOPTTYPE_LONG, 27), - - /* send linked-list of QUOTE commands */ - CURLOPT(CURLOPT_QUOTE, CURLOPTTYPE_SLISTPOINT, 28), - - /* send FILE * or void * to store headers to, if you use a callback it - is simply passed to the callback unmodified */ - CURLOPT(CURLOPT_HEADERDATA, CURLOPTTYPE_CBPOINT, 29), - - /* point to a file to read the initial cookies from, also enables - "cookie awareness" */ - CURLOPT(CURLOPT_COOKIEFILE, CURLOPTTYPE_STRINGPOINT, 31), - - /* What version to specifically try to use. - See CURL_SSLVERSION defines below. */ - CURLOPT(CURLOPT_SSLVERSION, CURLOPTTYPE_VALUES, 32), - - /* What kind of HTTP time condition to use, see defines */ - CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_VALUES, 33), - - /* Time to use with the above condition. Specified in number of seconds - since 1 Jan 1970 */ - CURLOPT(CURLOPT_TIMEVALUE, CURLOPTTYPE_LONG, 34), - - /* 35 = OBSOLETE */ - - /* Custom request, for customizing the get command like - HTTP: DELETE, TRACE and others - FTP: to use a different list command - */ - CURLOPT(CURLOPT_CUSTOMREQUEST, CURLOPTTYPE_STRINGPOINT, 36), - - /* FILE handle to use instead of stderr */ - CURLOPT(CURLOPT_STDERR, CURLOPTTYPE_OBJECTPOINT, 37), - - /* 38 is not used */ - - /* send linked-list of post-transfer QUOTE commands */ - CURLOPT(CURLOPT_POSTQUOTE, CURLOPTTYPE_SLISTPOINT, 39), - - /* OBSOLETE, do not use! */ - CURLOPT(CURLOPT_OBSOLETE40, CURLOPTTYPE_OBJECTPOINT, 40), - - /* talk a lot */ - CURLOPT(CURLOPT_VERBOSE, CURLOPTTYPE_LONG, 41), - - /* throw the header out too */ - CURLOPT(CURLOPT_HEADER, CURLOPTTYPE_LONG, 42), - - /* shut off the progress meter */ - CURLOPT(CURLOPT_NOPROGRESS, CURLOPTTYPE_LONG, 43), - - /* use HEAD to get http document */ - CURLOPT(CURLOPT_NOBODY, CURLOPTTYPE_LONG, 44), - - /* no output on http error codes >= 400 */ - CURLOPT(CURLOPT_FAILONERROR, CURLOPTTYPE_LONG, 45), - - /* this is an upload */ - CURLOPT(CURLOPT_UPLOAD, CURLOPTTYPE_LONG, 46), - - /* HTTP POST method */ - CURLOPT(CURLOPT_POST, CURLOPTTYPE_LONG, 47), - - /* bare names when listing directories */ - CURLOPT(CURLOPT_DIRLISTONLY, CURLOPTTYPE_LONG, 48), - - /* Append instead of overwrite on upload! */ - CURLOPT(CURLOPT_APPEND, CURLOPTTYPE_LONG, 50), - - /* Specify whether to read the user+password from the .netrc or the URL. - * This must be one of the CURL_NETRC_* enums below. */ - CURLOPT(CURLOPT_NETRC, CURLOPTTYPE_VALUES, 51), - - /* use Location: Luke! */ - CURLOPT(CURLOPT_FOLLOWLOCATION, CURLOPTTYPE_LONG, 52), - - /* transfer data in text/ASCII format */ - CURLOPT(CURLOPT_TRANSFERTEXT, CURLOPTTYPE_LONG, 53), - - /* HTTP PUT */ - CURLOPT(CURLOPT_PUT, CURLOPTTYPE_LONG, 54), - - /* 55 = OBSOLETE */ - - /* DEPRECATED - * Function that will be called instead of the internal progress display - * function. This function should be defined as the curl_progress_callback - * prototype defines. */ - CURLOPT(CURLOPT_PROGRESSFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 56), - - /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION - callbacks */ - CURLOPT(CURLOPT_XFERINFODATA, CURLOPTTYPE_CBPOINT, 57), -#define CURLOPT_PROGRESSDATA CURLOPT_XFERINFODATA - - /* We want the referrer field set automatically when following locations */ - CURLOPT(CURLOPT_AUTOREFERER, CURLOPTTYPE_LONG, 58), - - /* Port of the proxy, can be set in the proxy string as well with: - "[host]:[port]" */ - CURLOPT(CURLOPT_PROXYPORT, CURLOPTTYPE_LONG, 59), - - /* size of the POST input data, if strlen() is not good to use */ - CURLOPT(CURLOPT_POSTFIELDSIZE, CURLOPTTYPE_LONG, 60), - - /* tunnel non-http operations through a HTTP proxy */ - CURLOPT(CURLOPT_HTTPPROXYTUNNEL, CURLOPTTYPE_LONG, 61), - - /* Set the interface string to use as outgoing network interface */ - CURLOPT(CURLOPT_INTERFACE, CURLOPTTYPE_STRINGPOINT, 62), - - /* Set the krb4/5 security level, this also enables krb4/5 awareness. This - * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string - * is set but doesn't match one of these, 'private' will be used. */ - CURLOPT(CURLOPT_KRBLEVEL, CURLOPTTYPE_STRINGPOINT, 63), - - /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ - CURLOPT(CURLOPT_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 64), - - /* The CApath or CAfile used to validate the peer certificate - this option is used only if SSL_VERIFYPEER is true */ - CURLOPT(CURLOPT_CAINFO, CURLOPTTYPE_STRINGPOINT, 65), - - /* 66 = OBSOLETE */ - /* 67 = OBSOLETE */ - - /* Maximum number of http redirects to follow */ - CURLOPT(CURLOPT_MAXREDIRS, CURLOPTTYPE_LONG, 68), - - /* Pass a long set to 1 to get the date of the requested document (if - possible)! Pass a zero to shut it off. */ - CURLOPT(CURLOPT_FILETIME, CURLOPTTYPE_LONG, 69), - - /* This points to a linked list of telnet options */ - CURLOPT(CURLOPT_TELNETOPTIONS, CURLOPTTYPE_SLISTPOINT, 70), - - /* Max amount of cached alive connections */ - CURLOPT(CURLOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 71), - - /* OBSOLETE, do not use! */ - CURLOPT(CURLOPT_OBSOLETE72, CURLOPTTYPE_LONG, 72), - - /* 73 = OBSOLETE */ - - /* Set to explicitly use a new connection for the upcoming transfer. - Do not use this unless you're absolutely sure of this, as it makes the - operation slower and is less friendly for the network. */ - CURLOPT(CURLOPT_FRESH_CONNECT, CURLOPTTYPE_LONG, 74), - - /* Set to explicitly forbid the upcoming transfer's connection to be re-used - when done. Do not use this unless you're absolutely sure of this, as it - makes the operation slower and is less friendly for the network. */ - CURLOPT(CURLOPT_FORBID_REUSE, CURLOPTTYPE_LONG, 75), - - /* Set to a file name that contains random data for libcurl to use to - seed the random engine when doing SSL connects. */ - CURLOPT(CURLOPT_RANDOM_FILE, CURLOPTTYPE_STRINGPOINT, 76), - - /* Set to the Entropy Gathering Daemon socket pathname */ - CURLOPT(CURLOPT_EGDSOCKET, CURLOPTTYPE_STRINGPOINT, 77), - - /* Time-out connect operations after this amount of seconds, if connects are - OK within this time, then fine... This only aborts the connect phase. */ - CURLOPT(CURLOPT_CONNECTTIMEOUT, CURLOPTTYPE_LONG, 78), - - /* Function that will be called to store headers (instead of fwrite). The - * parameters will use fwrite() syntax, make sure to follow them. */ - CURLOPT(CURLOPT_HEADERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 79), - - /* Set this to force the HTTP request to get back to GET. Only really usable - if POST, PUT or a custom request have been used first. - */ - CURLOPT(CURLOPT_HTTPGET, CURLOPTTYPE_LONG, 80), - - /* Set if we should verify the Common name from the peer certificate in ssl - * handshake, set 1 to check existence, 2 to ensure that it matches the - * provided hostname. */ - CURLOPT(CURLOPT_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 81), - - /* Specify which file name to write all known cookies in after completed - operation. Set file name to "-" (dash) to make it go to stdout. */ - CURLOPT(CURLOPT_COOKIEJAR, CURLOPTTYPE_STRINGPOINT, 82), - - /* Specify which SSL ciphers to use */ - CURLOPT(CURLOPT_SSL_CIPHER_LIST, CURLOPTTYPE_STRINGPOINT, 83), - - /* Specify which HTTP version to use! This must be set to one of the - CURL_HTTP_VERSION* enums set below. */ - CURLOPT(CURLOPT_HTTP_VERSION, CURLOPTTYPE_VALUES, 84), - - /* Specifically switch on or off the FTP engine's use of the EPSV command. By - default, that one will always be attempted before the more traditional - PASV command. */ - CURLOPT(CURLOPT_FTP_USE_EPSV, CURLOPTTYPE_LONG, 85), - - /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ - CURLOPT(CURLOPT_SSLCERTTYPE, CURLOPTTYPE_STRINGPOINT, 86), - - /* name of the file keeping your private SSL-key */ - CURLOPT(CURLOPT_SSLKEY, CURLOPTTYPE_STRINGPOINT, 87), - - /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ - CURLOPT(CURLOPT_SSLKEYTYPE, CURLOPTTYPE_STRINGPOINT, 88), - - /* crypto engine for the SSL-sub system */ - CURLOPT(CURLOPT_SSLENGINE, CURLOPTTYPE_STRINGPOINT, 89), - - /* set the crypto engine for the SSL-sub system as default - the param has no meaning... - */ - CURLOPT(CURLOPT_SSLENGINE_DEFAULT, CURLOPTTYPE_LONG, 90), - - /* Non-zero value means to use the global dns cache */ - /* DEPRECATED, do not use! */ - CURLOPT(CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOPTTYPE_LONG, 91), - - /* DNS cache timeout */ - CURLOPT(CURLOPT_DNS_CACHE_TIMEOUT, CURLOPTTYPE_LONG, 92), - - /* send linked-list of pre-transfer QUOTE commands */ - CURLOPT(CURLOPT_PREQUOTE, CURLOPTTYPE_SLISTPOINT, 93), - - /* set the debug function */ - CURLOPT(CURLOPT_DEBUGFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 94), - - /* set the data for the debug function */ - CURLOPT(CURLOPT_DEBUGDATA, CURLOPTTYPE_CBPOINT, 95), - - /* mark this as start of a cookie session */ - CURLOPT(CURLOPT_COOKIESESSION, CURLOPTTYPE_LONG, 96), - - /* The CApath directory used to validate the peer certificate - this option is used only if SSL_VERIFYPEER is true */ - CURLOPT(CURLOPT_CAPATH, CURLOPTTYPE_STRINGPOINT, 97), - - /* Instruct libcurl to use a smaller receive buffer */ - CURLOPT(CURLOPT_BUFFERSIZE, CURLOPTTYPE_LONG, 98), - - /* Instruct libcurl to not use any signal/alarm handlers, even when using - timeouts. This option is useful for multi-threaded applications. - See libcurl-the-guide for more background information. */ - CURLOPT(CURLOPT_NOSIGNAL, CURLOPTTYPE_LONG, 99), - - /* Provide a CURLShare for mutexing non-ts data */ - CURLOPT(CURLOPT_SHARE, CURLOPTTYPE_OBJECTPOINT, 100), - - /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), - CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and - CURLPROXY_SOCKS5. */ - CURLOPT(CURLOPT_PROXYTYPE, CURLOPTTYPE_VALUES, 101), - - /* Set the Accept-Encoding string. Use this to tell a server you would like - the response to be compressed. Before 7.21.6, this was known as - CURLOPT_ENCODING */ - CURLOPT(CURLOPT_ACCEPT_ENCODING, CURLOPTTYPE_STRINGPOINT, 102), - - /* Set pointer to private data */ - CURLOPT(CURLOPT_PRIVATE, CURLOPTTYPE_OBJECTPOINT, 103), - - /* Set aliases for HTTP 200 in the HTTP Response header */ - CURLOPT(CURLOPT_HTTP200ALIASES, CURLOPTTYPE_SLISTPOINT, 104), - - /* Continue to send authentication (user+password) when following locations, - even when hostname changed. This can potentially send off the name - and password to whatever host the server decides. */ - CURLOPT(CURLOPT_UNRESTRICTED_AUTH, CURLOPTTYPE_LONG, 105), - - /* Specifically switch on or off the FTP engine's use of the EPRT command ( - it also disables the LPRT attempt). By default, those ones will always be - attempted before the good old traditional PORT command. */ - CURLOPT(CURLOPT_FTP_USE_EPRT, CURLOPTTYPE_LONG, 106), - - /* Set this to a bitmask value to enable the particular authentications - methods you like. Use this in combination with CURLOPT_USERPWD. - Note that setting multiple bits may cause extra network round-trips. */ - CURLOPT(CURLOPT_HTTPAUTH, CURLOPTTYPE_VALUES, 107), - - /* Set the ssl context callback function, currently only for OpenSSL or - WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument. - The function must match the curl_ssl_ctx_callback prototype. */ - CURLOPT(CURLOPT_SSL_CTX_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 108), - - /* Set the userdata for the ssl context callback function's third - argument */ - CURLOPT(CURLOPT_SSL_CTX_DATA, CURLOPTTYPE_CBPOINT, 109), - - /* FTP Option that causes missing dirs to be created on the remote server. - In 7.19.4 we introduced the convenience enums for this option using the - CURLFTP_CREATE_DIR prefix. - */ - CURLOPT(CURLOPT_FTP_CREATE_MISSING_DIRS, CURLOPTTYPE_LONG, 110), - - /* Set this to a bitmask value to enable the particular authentications - methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. - Note that setting multiple bits may cause extra network round-trips. */ - CURLOPT(CURLOPT_PROXYAUTH, CURLOPTTYPE_VALUES, 111), - - /* Option that changes the timeout, in seconds, associated with getting a - response. This is different from transfer timeout time and essentially - places a demand on the server to acknowledge commands in a timely - manner. For FTP, SMTP, IMAP and POP3. */ - CURLOPT(CURLOPT_SERVER_RESPONSE_TIMEOUT, CURLOPTTYPE_LONG, 112), - - /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to - tell libcurl to use those IP versions only. This only has effect on - systems with support for more than one, i.e IPv4 _and_ IPv6. */ - CURLOPT(CURLOPT_IPRESOLVE, CURLOPTTYPE_VALUES, 113), - - /* Set this option to limit the size of a file that will be downloaded from - an HTTP or FTP server. - - Note there is also _LARGE version which adds large file support for - platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ - CURLOPT(CURLOPT_MAXFILESIZE, CURLOPTTYPE_LONG, 114), - - /* See the comment for INFILESIZE above, but in short, specifies - * the size of the file being uploaded. -1 means unknown. - */ - CURLOPT(CURLOPT_INFILESIZE_LARGE, CURLOPTTYPE_OFF_T, 115), - - /* Sets the continuation offset. There is also a CURLOPTTYPE_LONG version - * of this; look above for RESUME_FROM. - */ - CURLOPT(CURLOPT_RESUME_FROM_LARGE, CURLOPTTYPE_OFF_T, 116), - - /* Sets the maximum size of data that will be downloaded from - * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. - */ - CURLOPT(CURLOPT_MAXFILESIZE_LARGE, CURLOPTTYPE_OFF_T, 117), - - /* Set this option to the file name of your .netrc file you want libcurl - to parse (using the CURLOPT_NETRC option). If not set, libcurl will do - a poor attempt to find the user's home directory and check for a .netrc - file in there. */ - CURLOPT(CURLOPT_NETRC_FILE, CURLOPTTYPE_STRINGPOINT, 118), - - /* Enable SSL/TLS for FTP, pick one of: - CURLUSESSL_TRY - try using SSL, proceed anyway otherwise - CURLUSESSL_CONTROL - SSL for the control connection or fail - CURLUSESSL_ALL - SSL for all communication or fail - */ - CURLOPT(CURLOPT_USE_SSL, CURLOPTTYPE_VALUES, 119), - - /* The _LARGE version of the standard POSTFIELDSIZE option */ - CURLOPT(CURLOPT_POSTFIELDSIZE_LARGE, CURLOPTTYPE_OFF_T, 120), - - /* Enable/disable the TCP Nagle algorithm */ - CURLOPT(CURLOPT_TCP_NODELAY, CURLOPTTYPE_LONG, 121), - - /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ - /* 123 OBSOLETE. Gone in 7.16.0 */ - /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ - /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ - /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ - /* 127 OBSOLETE. Gone in 7.16.0 */ - /* 128 OBSOLETE. Gone in 7.16.0 */ - - /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option - can be used to change libcurl's default action which is to first try - "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK - response has been received. - - Available parameters are: - CURLFTPAUTH_DEFAULT - let libcurl decide - CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS - CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL - */ - CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_VALUES, 129), - - CURLOPT(CURLOPT_IOCTLFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 130), - CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_CBPOINT, 131), - - /* 132 OBSOLETE. Gone in 7.16.0 */ - /* 133 OBSOLETE. Gone in 7.16.0 */ - - /* null-terminated string for pass on to the FTP server when asked for - "account" info */ - CURLOPT(CURLOPT_FTP_ACCOUNT, CURLOPTTYPE_STRINGPOINT, 134), - - /* feed cookie into cookie engine */ - CURLOPT(CURLOPT_COOKIELIST, CURLOPTTYPE_STRINGPOINT, 135), - - /* ignore Content-Length */ - CURLOPT(CURLOPT_IGNORE_CONTENT_LENGTH, CURLOPTTYPE_LONG, 136), - - /* Set to non-zero to skip the IP address received in a 227 PASV FTP server - response. Typically used for FTP-SSL purposes but is not restricted to - that. libcurl will then instead use the same IP address it used for the - control connection. */ - CURLOPT(CURLOPT_FTP_SKIP_PASV_IP, CURLOPTTYPE_LONG, 137), - - /* Select "file method" to use when doing FTP, see the curl_ftpmethod - above. */ - CURLOPT(CURLOPT_FTP_FILEMETHOD, CURLOPTTYPE_VALUES, 138), - - /* Local port number to bind the socket to */ - CURLOPT(CURLOPT_LOCALPORT, CURLOPTTYPE_LONG, 139), - - /* Number of ports to try, including the first one set with LOCALPORT. - Thus, setting it to 1 will make no additional attempts but the first. - */ - CURLOPT(CURLOPT_LOCALPORTRANGE, CURLOPTTYPE_LONG, 140), - - /* no transfer, set up connection and let application use the socket by - extracting it with CURLINFO_LASTSOCKET */ - CURLOPT(CURLOPT_CONNECT_ONLY, CURLOPTTYPE_LONG, 141), - - /* Function that will be called to convert from the - network encoding (instead of using the iconv calls in libcurl) */ - CURLOPT(CURLOPT_CONV_FROM_NETWORK_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 142), - - /* Function that will be called to convert to the - network encoding (instead of using the iconv calls in libcurl) */ - CURLOPT(CURLOPT_CONV_TO_NETWORK_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 143), - - /* Function that will be called to convert from UTF8 - (instead of using the iconv calls in libcurl) - Note that this is used only for SSL certificate processing */ - CURLOPT(CURLOPT_CONV_FROM_UTF8_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 144), - - /* if the connection proceeds too quickly then need to slow it down */ - /* limit-rate: maximum number of bytes per second to send or receive */ - CURLOPT(CURLOPT_MAX_SEND_SPEED_LARGE, CURLOPTTYPE_OFF_T, 145), - CURLOPT(CURLOPT_MAX_RECV_SPEED_LARGE, CURLOPTTYPE_OFF_T, 146), - - /* Pointer to command string to send if USER/PASS fails. */ - CURLOPT(CURLOPT_FTP_ALTERNATIVE_TO_USER, CURLOPTTYPE_STRINGPOINT, 147), - - /* callback function for setting socket options */ - CURLOPT(CURLOPT_SOCKOPTFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 148), - CURLOPT(CURLOPT_SOCKOPTDATA, CURLOPTTYPE_CBPOINT, 149), - - /* set to 0 to disable session ID re-use for this transfer, default is - enabled (== 1) */ - CURLOPT(CURLOPT_SSL_SESSIONID_CACHE, CURLOPTTYPE_LONG, 150), - - /* allowed SSH authentication methods */ - CURLOPT(CURLOPT_SSH_AUTH_TYPES, CURLOPTTYPE_VALUES, 151), - - /* Used by scp/sftp to do public/private key authentication */ - CURLOPT(CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPTTYPE_STRINGPOINT, 152), - CURLOPT(CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPTTYPE_STRINGPOINT, 153), - - /* Send CCC (Clear Command Channel) after authentication */ - CURLOPT(CURLOPT_FTP_SSL_CCC, CURLOPTTYPE_LONG, 154), - - /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ - CURLOPT(CURLOPT_TIMEOUT_MS, CURLOPTTYPE_LONG, 155), - CURLOPT(CURLOPT_CONNECTTIMEOUT_MS, CURLOPTTYPE_LONG, 156), - - /* set to zero to disable the libcurl's decoding and thus pass the raw body - data to the application even when it is encoded/compressed */ - CURLOPT(CURLOPT_HTTP_TRANSFER_DECODING, CURLOPTTYPE_LONG, 157), - CURLOPT(CURLOPT_HTTP_CONTENT_DECODING, CURLOPTTYPE_LONG, 158), - - /* Permission used when creating new files and directories on the remote - server for protocols that support it, SFTP/SCP/FILE */ - CURLOPT(CURLOPT_NEW_FILE_PERMS, CURLOPTTYPE_LONG, 159), - CURLOPT(CURLOPT_NEW_DIRECTORY_PERMS, CURLOPTTYPE_LONG, 160), - - /* Set the behavior of POST when redirecting. Values must be set to one - of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ - CURLOPT(CURLOPT_POSTREDIR, CURLOPTTYPE_VALUES, 161), - - /* used by scp/sftp to verify the host's public key */ - CURLOPT(CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, CURLOPTTYPE_STRINGPOINT, 162), - - /* Callback function for opening socket (instead of socket(2)). Optionally, - callback is able change the address or refuse to connect returning - CURL_SOCKET_BAD. The callback should have type - curl_opensocket_callback */ - CURLOPT(CURLOPT_OPENSOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 163), - CURLOPT(CURLOPT_OPENSOCKETDATA, CURLOPTTYPE_CBPOINT, 164), - - /* POST volatile input fields. */ - CURLOPT(CURLOPT_COPYPOSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 165), - - /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ - CURLOPT(CURLOPT_PROXY_TRANSFER_MODE, CURLOPTTYPE_LONG, 166), - - /* Callback function for seeking in the input stream */ - CURLOPT(CURLOPT_SEEKFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 167), - CURLOPT(CURLOPT_SEEKDATA, CURLOPTTYPE_CBPOINT, 168), - - /* CRL file */ - CURLOPT(CURLOPT_CRLFILE, CURLOPTTYPE_STRINGPOINT, 169), - - /* Issuer certificate */ - CURLOPT(CURLOPT_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 170), - - /* (IPv6) Address scope */ - CURLOPT(CURLOPT_ADDRESS_SCOPE, CURLOPTTYPE_LONG, 171), - - /* Collect certificate chain info and allow it to get retrievable with - CURLINFO_CERTINFO after the transfer is complete. */ - CURLOPT(CURLOPT_CERTINFO, CURLOPTTYPE_LONG, 172), - - /* "name" and "pwd" to use when fetching. */ - CURLOPT(CURLOPT_USERNAME, CURLOPTTYPE_STRINGPOINT, 173), - CURLOPT(CURLOPT_PASSWORD, CURLOPTTYPE_STRINGPOINT, 174), - - /* "name" and "pwd" to use with Proxy when fetching. */ - CURLOPT(CURLOPT_PROXYUSERNAME, CURLOPTTYPE_STRINGPOINT, 175), - CURLOPT(CURLOPT_PROXYPASSWORD, CURLOPTTYPE_STRINGPOINT, 176), - - /* Comma separated list of hostnames defining no-proxy zones. These should - match both hostnames directly, and hostnames within a domain. For - example, local.com will match local.com and www.local.com, but NOT - notlocal.com or www.notlocal.com. For compatibility with other - implementations of this, .local.com will be considered to be the same as - local.com. A single * is the only valid wildcard, and effectively - disables the use of proxy. */ - CURLOPT(CURLOPT_NOPROXY, CURLOPTTYPE_STRINGPOINT, 177), - - /* block size for TFTP transfers */ - CURLOPT(CURLOPT_TFTP_BLKSIZE, CURLOPTTYPE_LONG, 178), - - /* Socks Service */ - /* DEPRECATED, do not use! */ - CURLOPT(CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOPTTYPE_STRINGPOINT, 179), - - /* Socks Service */ - CURLOPT(CURLOPT_SOCKS5_GSSAPI_NEC, CURLOPTTYPE_LONG, 180), - - /* set the bitmask for the protocols that are allowed to be used for the - transfer, which thus helps the app which takes URLs from users or other - external inputs and want to restrict what protocol(s) to deal - with. Defaults to CURLPROTO_ALL. */ - CURLOPT(CURLOPT_PROTOCOLS, CURLOPTTYPE_LONG, 181), - - /* set the bitmask for the protocols that libcurl is allowed to follow to, - as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs - to be set in both bitmasks to be allowed to get redirected to. */ - CURLOPT(CURLOPT_REDIR_PROTOCOLS, CURLOPTTYPE_LONG, 182), - - /* set the SSH knownhost file name to use */ - CURLOPT(CURLOPT_SSH_KNOWNHOSTS, CURLOPTTYPE_STRINGPOINT, 183), - - /* set the SSH host key callback, must point to a curl_sshkeycallback - function */ - CURLOPT(CURLOPT_SSH_KEYFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 184), - - /* set the SSH host key callback custom pointer */ - CURLOPT(CURLOPT_SSH_KEYDATA, CURLOPTTYPE_CBPOINT, 185), - - /* set the SMTP mail originator */ - CURLOPT(CURLOPT_MAIL_FROM, CURLOPTTYPE_STRINGPOINT, 186), - - /* set the list of SMTP mail receiver(s) */ - CURLOPT(CURLOPT_MAIL_RCPT, CURLOPTTYPE_SLISTPOINT, 187), - - /* FTP: send PRET before PASV */ - CURLOPT(CURLOPT_FTP_USE_PRET, CURLOPTTYPE_LONG, 188), - - /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ - CURLOPT(CURLOPT_RTSP_REQUEST, CURLOPTTYPE_VALUES, 189), - - /* The RTSP session identifier */ - CURLOPT(CURLOPT_RTSP_SESSION_ID, CURLOPTTYPE_STRINGPOINT, 190), - - /* The RTSP stream URI */ - CURLOPT(CURLOPT_RTSP_STREAM_URI, CURLOPTTYPE_STRINGPOINT, 191), - - /* The Transport: header to use in RTSP requests */ - CURLOPT(CURLOPT_RTSP_TRANSPORT, CURLOPTTYPE_STRINGPOINT, 192), - - /* Manually initialize the client RTSP CSeq for this handle */ - CURLOPT(CURLOPT_RTSP_CLIENT_CSEQ, CURLOPTTYPE_LONG, 193), - - /* Manually initialize the server RTSP CSeq for this handle */ - CURLOPT(CURLOPT_RTSP_SERVER_CSEQ, CURLOPTTYPE_LONG, 194), - - /* The stream to pass to INTERLEAVEFUNCTION. */ - CURLOPT(CURLOPT_INTERLEAVEDATA, CURLOPTTYPE_CBPOINT, 195), - - /* Let the application define a custom write method for RTP data */ - CURLOPT(CURLOPT_INTERLEAVEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 196), - - /* Turn on wildcard matching */ - CURLOPT(CURLOPT_WILDCARDMATCH, CURLOPTTYPE_LONG, 197), - - /* Directory matching callback called before downloading of an - individual file (chunk) started */ - CURLOPT(CURLOPT_CHUNK_BGN_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 198), - - /* Directory matching callback called after the file (chunk) - was downloaded, or skipped */ - CURLOPT(CURLOPT_CHUNK_END_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 199), - - /* Change match (fnmatch-like) callback for wildcard matching */ - CURLOPT(CURLOPT_FNMATCH_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 200), - - /* Let the application define custom chunk data pointer */ - CURLOPT(CURLOPT_CHUNK_DATA, CURLOPTTYPE_CBPOINT, 201), - - /* FNMATCH_FUNCTION user pointer */ - CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_CBPOINT, 202), - - /* send linked-list of name:port:address sets */ - CURLOPT(CURLOPT_RESOLVE, CURLOPTTYPE_SLISTPOINT, 203), - - /* Set a username for authenticated TLS */ - CURLOPT(CURLOPT_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 204), - - /* Set a password for authenticated TLS */ - CURLOPT(CURLOPT_TLSAUTH_PASSWORD, CURLOPTTYPE_STRINGPOINT, 205), - - /* Set authentication type for authenticated TLS */ - CURLOPT(CURLOPT_TLSAUTH_TYPE, CURLOPTTYPE_STRINGPOINT, 206), - - /* Set to 1 to enable the "TE:" header in HTTP requests to ask for - compressed transfer-encoded responses. Set to 0 to disable the use of TE: - in outgoing requests. The current default is 0, but it might change in a - future libcurl release. - - libcurl will ask for the compressed methods it knows of, and if that - isn't any, it will not ask for transfer-encoding at all even if this - option is set to 1. - - */ - CURLOPT(CURLOPT_TRANSFER_ENCODING, CURLOPTTYPE_LONG, 207), - - /* Callback function for closing socket (instead of close(2)). The callback - should have type curl_closesocket_callback */ - CURLOPT(CURLOPT_CLOSESOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 208), - CURLOPT(CURLOPT_CLOSESOCKETDATA, CURLOPTTYPE_CBPOINT, 209), - - /* allow GSSAPI credential delegation */ - CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_VALUES, 210), - - /* Set the name servers to use for DNS resolution */ - CURLOPT(CURLOPT_DNS_SERVERS, CURLOPTTYPE_STRINGPOINT, 211), - - /* Time-out accept operations (currently for FTP only) after this amount - of milliseconds. */ - CURLOPT(CURLOPT_ACCEPTTIMEOUT_MS, CURLOPTTYPE_LONG, 212), - - /* Set TCP keepalive */ - CURLOPT(CURLOPT_TCP_KEEPALIVE, CURLOPTTYPE_LONG, 213), - - /* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */ - CURLOPT(CURLOPT_TCP_KEEPIDLE, CURLOPTTYPE_LONG, 214), - CURLOPT(CURLOPT_TCP_KEEPINTVL, CURLOPTTYPE_LONG, 215), - - /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ - CURLOPT(CURLOPT_SSL_OPTIONS, CURLOPTTYPE_VALUES, 216), - - /* Set the SMTP auth originator */ - CURLOPT(CURLOPT_MAIL_AUTH, CURLOPTTYPE_STRINGPOINT, 217), - - /* Enable/disable SASL initial response */ - CURLOPT(CURLOPT_SASL_IR, CURLOPTTYPE_LONG, 218), - - /* Function that will be called instead of the internal progress display - * function. This function should be defined as the curl_xferinfo_callback - * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ - CURLOPT(CURLOPT_XFERINFOFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 219), - - /* The XOAUTH2 bearer token */ - CURLOPT(CURLOPT_XOAUTH2_BEARER, CURLOPTTYPE_STRINGPOINT, 220), - - /* Set the interface string to use as outgoing network - * interface for DNS requests. - * Only supported by the c-ares DNS backend */ - CURLOPT(CURLOPT_DNS_INTERFACE, CURLOPTTYPE_STRINGPOINT, 221), - - /* Set the local IPv4 address to use for outgoing DNS requests. - * Only supported by the c-ares DNS backend */ - CURLOPT(CURLOPT_DNS_LOCAL_IP4, CURLOPTTYPE_STRINGPOINT, 222), - - /* Set the local IPv6 address to use for outgoing DNS requests. - * Only supported by the c-ares DNS backend */ - CURLOPT(CURLOPT_DNS_LOCAL_IP6, CURLOPTTYPE_STRINGPOINT, 223), - - /* Set authentication options directly */ - CURLOPT(CURLOPT_LOGIN_OPTIONS, CURLOPTTYPE_STRINGPOINT, 224), - - /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */ - CURLOPT(CURLOPT_SSL_ENABLE_NPN, CURLOPTTYPE_LONG, 225), - - /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */ - CURLOPT(CURLOPT_SSL_ENABLE_ALPN, CURLOPTTYPE_LONG, 226), - - /* Time to wait for a response to a HTTP request containing an - * Expect: 100-continue header before sending the data anyway. */ - CURLOPT(CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOPTTYPE_LONG, 227), - - /* This points to a linked list of headers used for proxy requests only, - struct curl_slist kind */ - CURLOPT(CURLOPT_PROXYHEADER, CURLOPTTYPE_SLISTPOINT, 228), - - /* Pass in a bitmask of "header options" */ - CURLOPT(CURLOPT_HEADEROPT, CURLOPTTYPE_VALUES, 229), - - /* The public key in DER form used to validate the peer public key - this option is used only if SSL_VERIFYPEER is true */ - CURLOPT(CURLOPT_PINNEDPUBLICKEY, CURLOPTTYPE_STRINGPOINT, 230), - - /* Path to Unix domain socket */ - CURLOPT(CURLOPT_UNIX_SOCKET_PATH, CURLOPTTYPE_STRINGPOINT, 231), - - /* Set if we should verify the certificate status. */ - CURLOPT(CURLOPT_SSL_VERIFYSTATUS, CURLOPTTYPE_LONG, 232), - - /* Set if we should enable TLS false start. */ - CURLOPT(CURLOPT_SSL_FALSESTART, CURLOPTTYPE_LONG, 233), - - /* Do not squash dot-dot sequences */ - CURLOPT(CURLOPT_PATH_AS_IS, CURLOPTTYPE_LONG, 234), - - /* Proxy Service Name */ - CURLOPT(CURLOPT_PROXY_SERVICE_NAME, CURLOPTTYPE_STRINGPOINT, 235), - - /* Service Name */ - CURLOPT(CURLOPT_SERVICE_NAME, CURLOPTTYPE_STRINGPOINT, 236), - - /* Wait/don't wait for pipe/mutex to clarify */ - CURLOPT(CURLOPT_PIPEWAIT, CURLOPTTYPE_LONG, 237), - - /* Set the protocol used when curl is given a URL without a protocol */ - CURLOPT(CURLOPT_DEFAULT_PROTOCOL, CURLOPTTYPE_STRINGPOINT, 238), - - /* Set stream weight, 1 - 256 (default is 16) */ - CURLOPT(CURLOPT_STREAM_WEIGHT, CURLOPTTYPE_LONG, 239), - - /* Set stream dependency on another CURL handle */ - CURLOPT(CURLOPT_STREAM_DEPENDS, CURLOPTTYPE_OBJECTPOINT, 240), - - /* Set E-xclusive stream dependency on another CURL handle */ - CURLOPT(CURLOPT_STREAM_DEPENDS_E, CURLOPTTYPE_OBJECTPOINT, 241), - - /* Do not send any tftp option requests to the server */ - CURLOPT(CURLOPT_TFTP_NO_OPTIONS, CURLOPTTYPE_LONG, 242), - - /* Linked-list of host:port:connect-to-host:connect-to-port, - overrides the URL's host:port (only for the network layer) */ - CURLOPT(CURLOPT_CONNECT_TO, CURLOPTTYPE_SLISTPOINT, 243), - - /* Set TCP Fast Open */ - CURLOPT(CURLOPT_TCP_FASTOPEN, CURLOPTTYPE_LONG, 244), - - /* Continue to send data if the server responds early with an - * HTTP status code >= 300 */ - CURLOPT(CURLOPT_KEEP_SENDING_ON_ERROR, CURLOPTTYPE_LONG, 245), - - /* The CApath or CAfile used to validate the proxy certificate - this option is used only if PROXY_SSL_VERIFYPEER is true */ - CURLOPT(CURLOPT_PROXY_CAINFO, CURLOPTTYPE_STRINGPOINT, 246), - - /* The CApath directory used to validate the proxy certificate - this option is used only if PROXY_SSL_VERIFYPEER is true */ - CURLOPT(CURLOPT_PROXY_CAPATH, CURLOPTTYPE_STRINGPOINT, 247), - - /* Set if we should verify the proxy in ssl handshake, - set 1 to verify. */ - CURLOPT(CURLOPT_PROXY_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 248), - - /* Set if we should verify the Common name from the proxy certificate in ssl - * handshake, set 1 to check existence, 2 to ensure that it matches - * the provided hostname. */ - CURLOPT(CURLOPT_PROXY_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 249), - - /* What version to specifically try to use for proxy. - See CURL_SSLVERSION defines below. */ - CURLOPT(CURLOPT_PROXY_SSLVERSION, CURLOPTTYPE_VALUES, 250), - - /* Set a username for authenticated TLS for proxy */ - CURLOPT(CURLOPT_PROXY_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 251), - - /* Set a password for authenticated TLS for proxy */ - CURLOPT(CURLOPT_PROXY_TLSAUTH_PASSWORD, CURLOPTTYPE_STRINGPOINT, 252), - - /* Set authentication type for authenticated TLS for proxy */ - CURLOPT(CURLOPT_PROXY_TLSAUTH_TYPE, CURLOPTTYPE_STRINGPOINT, 253), - - /* name of the file keeping your private SSL-certificate for proxy */ - CURLOPT(CURLOPT_PROXY_SSLCERT, CURLOPTTYPE_STRINGPOINT, 254), - - /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for - proxy */ - CURLOPT(CURLOPT_PROXY_SSLCERTTYPE, CURLOPTTYPE_STRINGPOINT, 255), - - /* name of the file keeping your private SSL-key for proxy */ - CURLOPT(CURLOPT_PROXY_SSLKEY, CURLOPTTYPE_STRINGPOINT, 256), - - /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for - proxy */ - CURLOPT(CURLOPT_PROXY_SSLKEYTYPE, CURLOPTTYPE_STRINGPOINT, 257), - - /* password for the SSL private key for proxy */ - CURLOPT(CURLOPT_PROXY_KEYPASSWD, CURLOPTTYPE_STRINGPOINT, 258), - - /* Specify which SSL ciphers to use for proxy */ - CURLOPT(CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOPTTYPE_STRINGPOINT, 259), - - /* CRL file for proxy */ - CURLOPT(CURLOPT_PROXY_CRLFILE, CURLOPTTYPE_STRINGPOINT, 260), - - /* Enable/disable specific SSL features with a bitmask for proxy, see - CURLSSLOPT_* */ - CURLOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLOPTTYPE_LONG, 261), - - /* Name of pre proxy to use. */ - CURLOPT(CURLOPT_PRE_PROXY, CURLOPTTYPE_STRINGPOINT, 262), - - /* The public key in DER form used to validate the proxy public key - this option is used only if PROXY_SSL_VERIFYPEER is true */ - CURLOPT(CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOPTTYPE_STRINGPOINT, 263), - - /* Path to an abstract Unix domain socket */ - CURLOPT(CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOPTTYPE_STRINGPOINT, 264), - - /* Suppress proxy CONNECT response headers from user callbacks */ - CURLOPT(CURLOPT_SUPPRESS_CONNECT_HEADERS, CURLOPTTYPE_LONG, 265), - - /* The request target, instead of extracted from the URL */ - CURLOPT(CURLOPT_REQUEST_TARGET, CURLOPTTYPE_STRINGPOINT, 266), - - /* bitmask of allowed auth methods for connections to SOCKS5 proxies */ - CURLOPT(CURLOPT_SOCKS5_AUTH, CURLOPTTYPE_LONG, 267), - - /* Enable/disable SSH compression */ - CURLOPT(CURLOPT_SSH_COMPRESSION, CURLOPTTYPE_LONG, 268), - - /* Post MIME data. */ - CURLOPT(CURLOPT_MIMEPOST, CURLOPTTYPE_OBJECTPOINT, 269), - - /* Time to use with the CURLOPT_TIMECONDITION. Specified in number of - seconds since 1 Jan 1970. */ - CURLOPT(CURLOPT_TIMEVALUE_LARGE, CURLOPTTYPE_OFF_T, 270), - - /* Head start in milliseconds to give happy eyeballs. */ - CURLOPT(CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, CURLOPTTYPE_LONG, 271), - - /* Function that will be called before a resolver request is made */ - CURLOPT(CURLOPT_RESOLVER_START_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 272), - - /* User data to pass to the resolver start callback. */ - CURLOPT(CURLOPT_RESOLVER_START_DATA, CURLOPTTYPE_CBPOINT, 273), - - /* send HAProxy PROXY protocol header? */ - CURLOPT(CURLOPT_HAPROXYPROTOCOL, CURLOPTTYPE_LONG, 274), - - /* shuffle addresses before use when DNS returns multiple */ - CURLOPT(CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOPTTYPE_LONG, 275), - - /* Specify which TLS 1.3 ciphers suites to use */ - CURLOPT(CURLOPT_TLS13_CIPHERS, CURLOPTTYPE_STRINGPOINT, 276), - CURLOPT(CURLOPT_PROXY_TLS13_CIPHERS, CURLOPTTYPE_STRINGPOINT, 277), - - /* Disallow specifying username/login in URL. */ - CURLOPT(CURLOPT_DISALLOW_USERNAME_IN_URL, CURLOPTTYPE_LONG, 278), - - /* DNS-over-HTTPS URL */ - CURLOPT(CURLOPT_DOH_URL, CURLOPTTYPE_STRINGPOINT, 279), - - /* Preferred buffer size to use for uploads */ - CURLOPT(CURLOPT_UPLOAD_BUFFERSIZE, CURLOPTTYPE_LONG, 280), - - /* Time in ms between connection upkeep calls for long-lived connections. */ - CURLOPT(CURLOPT_UPKEEP_INTERVAL_MS, CURLOPTTYPE_LONG, 281), - - /* Specify URL using CURL URL API. */ - CURLOPT(CURLOPT_CURLU, CURLOPTTYPE_OBJECTPOINT, 282), - - /* add trailing data just after no more data is available */ - CURLOPT(CURLOPT_TRAILERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 283), - - /* pointer to be passed to HTTP_TRAILER_FUNCTION */ - CURLOPT(CURLOPT_TRAILERDATA, CURLOPTTYPE_CBPOINT, 284), - - /* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */ - CURLOPT(CURLOPT_HTTP09_ALLOWED, CURLOPTTYPE_LONG, 285), - - /* alt-svc control bitmask */ - CURLOPT(CURLOPT_ALTSVC_CTRL, CURLOPTTYPE_LONG, 286), - - /* alt-svc cache file name to possibly read from/write to */ - CURLOPT(CURLOPT_ALTSVC, CURLOPTTYPE_STRINGPOINT, 287), - - /* maximum age (idle time) of a connection to consider it for reuse - * (in seconds) */ - CURLOPT(CURLOPT_MAXAGE_CONN, CURLOPTTYPE_LONG, 288), - - /* SASL authorization identity */ - CURLOPT(CURLOPT_SASL_AUTHZID, CURLOPTTYPE_STRINGPOINT, 289), - - /* allow RCPT TO command to fail for some recipients */ - CURLOPT(CURLOPT_MAIL_RCPT_ALLLOWFAILS, CURLOPTTYPE_LONG, 290), - - /* the private SSL-certificate as a "blob" */ - CURLOPT(CURLOPT_SSLCERT_BLOB, CURLOPTTYPE_BLOB, 291), - CURLOPT(CURLOPT_SSLKEY_BLOB, CURLOPTTYPE_BLOB, 292), - CURLOPT(CURLOPT_PROXY_SSLCERT_BLOB, CURLOPTTYPE_BLOB, 293), - CURLOPT(CURLOPT_PROXY_SSLKEY_BLOB, CURLOPTTYPE_BLOB, 294), - CURLOPT(CURLOPT_ISSUERCERT_BLOB, CURLOPTTYPE_BLOB, 295), - - /* Issuer certificate for proxy */ - CURLOPT(CURLOPT_PROXY_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 296), - CURLOPT(CURLOPT_PROXY_ISSUERCERT_BLOB, CURLOPTTYPE_BLOB, 297), - - /* the EC curves requested by the TLS client (RFC 8422, 5.1); - * OpenSSL support via 'set_groups'/'set_curves': - * https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set1_groups.html - */ - CURLOPT(CURLOPT_SSL_EC_CURVES, CURLOPTTYPE_STRINGPOINT, 298), - - /* HSTS bitmask */ - CURLOPT(CURLOPT_HSTS_CTRL, CURLOPTTYPE_LONG, 299), - /* HSTS file name */ - CURLOPT(CURLOPT_HSTS, CURLOPTTYPE_STRINGPOINT, 300), - - /* HSTS read callback */ - CURLOPT(CURLOPT_HSTSREADFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 301), - CURLOPT(CURLOPT_HSTSREADDATA, CURLOPTTYPE_CBPOINT, 302), - - /* HSTS write callback */ - CURLOPT(CURLOPT_HSTSWRITEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 303), - CURLOPT(CURLOPT_HSTSWRITEDATA, CURLOPTTYPE_CBPOINT, 304), - - /* Parameters for V4 signature */ - CURLOPT(CURLOPT_AWS_SIGV4, CURLOPTTYPE_STRINGPOINT, 305), - - /* Same as CURLOPT_SSL_VERIFYPEER but for DoH (DNS-over-HTTPS) servers. */ - CURLOPT(CURLOPT_DOH_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 306), - - /* Same as CURLOPT_SSL_VERIFYHOST but for DoH (DNS-over-HTTPS) servers. */ - CURLOPT(CURLOPT_DOH_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 307), - - /* Same as CURLOPT_SSL_VERIFYSTATUS but for DoH (DNS-over-HTTPS) servers. */ - CURLOPT(CURLOPT_DOH_SSL_VERIFYSTATUS, CURLOPTTYPE_LONG, 308), - - /* The CA certificates as "blob" used to validate the peer certificate - this option is used only if SSL_VERIFYPEER is true */ - CURLOPT(CURLOPT_CAINFO_BLOB, CURLOPTTYPE_BLOB, 309), - - /* The CA certificates as "blob" used to validate the proxy certificate - this option is used only if PROXY_SSL_VERIFYPEER is true */ - CURLOPT(CURLOPT_PROXY_CAINFO_BLOB, CURLOPTTYPE_BLOB, 310), - - /* used by scp/sftp to verify the host's public key */ - CURLOPT(CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256, CURLOPTTYPE_STRINGPOINT, 311), - - /* Function that will be called immediately before the initial request - is made on a connection (after any protocol negotiation step). */ - CURLOPT(CURLOPT_PREREQFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 312), - - /* Data passed to the CURLOPT_PREREQFUNCTION callback */ - CURLOPT(CURLOPT_PREREQDATA, CURLOPTTYPE_CBPOINT, 313), - - /* maximum age (since creation) of a connection to consider it for reuse - * (in seconds) */ - CURLOPT(CURLOPT_MAXLIFETIME_CONN, CURLOPTTYPE_LONG, 314), - - /* Set MIME option flags. */ - CURLOPT(CURLOPT_MIME_OPTIONS, CURLOPTTYPE_LONG, 315), - - /* set the SSH host key callback, must point to a curl_sshkeycallback - function */ - CURLOPT(CURLOPT_SSH_HOSTKEYFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 316), - - /* set the SSH host key callback custom pointer */ - CURLOPT(CURLOPT_SSH_HOSTKEYDATA, CURLOPTTYPE_CBPOINT, 317), - - /* specify which protocols that are allowed to be used for the transfer, - which thus helps the app which takes URLs from users or other external - inputs and want to restrict what protocol(s) to deal with. Defaults to - all built-in protocols. */ - CURLOPT(CURLOPT_PROTOCOLS_STR, CURLOPTTYPE_STRINGPOINT, 318), - - /* specify which protocols that libcurl is allowed to follow directs to */ - CURLOPT(CURLOPT_REDIR_PROTOCOLS_STR, CURLOPTTYPE_STRINGPOINT, 319), - - CURLOPT_LASTENTRY /* the last unused */ -} CURLoption; - -#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all - the obsolete stuff removed! */ - -/* Backwards compatibility with older names */ -/* These are scheduled to disappear by 2011 */ - -/* This was added in version 7.19.1 */ -#define CURLOPT_POST301 CURLOPT_POSTREDIR - -/* These are scheduled to disappear by 2009 */ - -/* The following were added in 7.17.0 */ -#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD -#define CURLOPT_FTPAPPEND CURLOPT_APPEND -#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY -#define CURLOPT_FTP_SSL CURLOPT_USE_SSL - -/* The following were added earlier */ - -#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD -#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL - -/* */ -#define CURLOPT_FTP_RESPONSE_TIMEOUT CURLOPT_SERVER_RESPONSE_TIMEOUT - -#else -/* This is set if CURL_NO_OLDIES is defined at compile-time */ -#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ -#endif - - - /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host - name resolves addresses using more than one IP protocol version, this - option might be handy to force libcurl to use a specific IP version. */ -#define CURL_IPRESOLVE_WHATEVER 0 /* default, uses addresses to all IP - versions that your system allows */ -#define CURL_IPRESOLVE_V4 1 /* uses only IPv4 addresses/connections */ -#define CURL_IPRESOLVE_V6 2 /* uses only IPv6 addresses/connections */ - - /* Convenient "aliases" */ -#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER - - /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ -enum { - CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd - like the library to choose the best possible - for us! */ - CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ - CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ - CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */ - CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */ - CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1 - Upgrade */ - CURL_HTTP_VERSION_3 = 30, /* Makes use of explicit HTTP/3 without fallback. - Use CURLOPT_ALTSVC to enable HTTP/3 upgrade */ - CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ -}; - -/* Convenience definition simple because the name of the version is HTTP/2 and - not 2.0. The 2_0 version of the enum name was set while the version was - still planned to be 2.0 and we stick to it for compatibility. */ -#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0 - -/* - * Public API enums for RTSP requests - */ -enum { - CURL_RTSPREQ_NONE, /* first in list */ - CURL_RTSPREQ_OPTIONS, - CURL_RTSPREQ_DESCRIBE, - CURL_RTSPREQ_ANNOUNCE, - CURL_RTSPREQ_SETUP, - CURL_RTSPREQ_PLAY, - CURL_RTSPREQ_PAUSE, - CURL_RTSPREQ_TEARDOWN, - CURL_RTSPREQ_GET_PARAMETER, - CURL_RTSPREQ_SET_PARAMETER, - CURL_RTSPREQ_RECORD, - CURL_RTSPREQ_RECEIVE, - CURL_RTSPREQ_LAST /* last in list */ -}; - - /* These enums are for use with the CURLOPT_NETRC option. */ -enum CURL_NETRC_OPTION { - CURL_NETRC_IGNORED, /* The .netrc will never be read. - * This is the default. */ - CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred - * to one in the .netrc. */ - CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. - * Unless one is set programmatically, the .netrc - * will be queried. */ - CURL_NETRC_LAST -}; - -enum { - CURL_SSLVERSION_DEFAULT, - CURL_SSLVERSION_TLSv1, /* TLS 1.x */ - CURL_SSLVERSION_SSLv2, - CURL_SSLVERSION_SSLv3, - CURL_SSLVERSION_TLSv1_0, - CURL_SSLVERSION_TLSv1_1, - CURL_SSLVERSION_TLSv1_2, - CURL_SSLVERSION_TLSv1_3, - - CURL_SSLVERSION_LAST /* never use, keep last */ -}; - -enum { - CURL_SSLVERSION_MAX_NONE = 0, - CURL_SSLVERSION_MAX_DEFAULT = (CURL_SSLVERSION_TLSv1 << 16), - CURL_SSLVERSION_MAX_TLSv1_0 = (CURL_SSLVERSION_TLSv1_0 << 16), - CURL_SSLVERSION_MAX_TLSv1_1 = (CURL_SSLVERSION_TLSv1_1 << 16), - CURL_SSLVERSION_MAX_TLSv1_2 = (CURL_SSLVERSION_TLSv1_2 << 16), - CURL_SSLVERSION_MAX_TLSv1_3 = (CURL_SSLVERSION_TLSv1_3 << 16), - - /* never use, keep last */ - CURL_SSLVERSION_MAX_LAST = (CURL_SSLVERSION_LAST << 16) -}; - -enum CURL_TLSAUTH { - CURL_TLSAUTH_NONE, - CURL_TLSAUTH_SRP, - CURL_TLSAUTH_LAST /* never use, keep last */ -}; - -/* symbols to use with CURLOPT_POSTREDIR. - CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303 - can be bitwise ORed so that CURL_REDIR_POST_301 | CURL_REDIR_POST_302 - | CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */ - -#define CURL_REDIR_GET_ALL 0 -#define CURL_REDIR_POST_301 1 -#define CURL_REDIR_POST_302 2 -#define CURL_REDIR_POST_303 4 -#define CURL_REDIR_POST_ALL \ - (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303) - -typedef enum { - CURL_TIMECOND_NONE, - - CURL_TIMECOND_IFMODSINCE, - CURL_TIMECOND_IFUNMODSINCE, - CURL_TIMECOND_LASTMOD, - - CURL_TIMECOND_LAST -} curl_TimeCond; - -/* Special size_t value signaling a null-terminated string. */ -#define CURL_ZERO_TERMINATED ((size_t) -1) - -/* curl_strequal() and curl_strnequal() are subject for removal in a future - release */ -CURL_EXTERN int curl_strequal(const char *s1, const char *s2); -CURL_EXTERN int curl_strnequal(const char *s1, const char *s2, size_t n); - -/* Mime/form handling support. */ -typedef struct curl_mime curl_mime; /* Mime context. */ -typedef struct curl_mimepart curl_mimepart; /* Mime part context. */ - -/* CURLMIMEOPT_ defines are for the CURLOPT_MIME_OPTIONS option. */ -#define CURLMIMEOPT_FORMESCAPE (1<<0) /* Use backslash-escaping for forms. */ - -/* - * NAME curl_mime_init() - * - * DESCRIPTION - * - * Create a mime context and return its handle. The easy parameter is the - * target handle. - */ -CURL_EXTERN curl_mime *curl_mime_init(CURL *easy); - -/* - * NAME curl_mime_free() - * - * DESCRIPTION - * - * release a mime handle and its substructures. - */ -CURL_EXTERN void curl_mime_free(curl_mime *mime); - -/* - * NAME curl_mime_addpart() - * - * DESCRIPTION - * - * Append a new empty part to the given mime context and return a handle to - * the created part. - */ -CURL_EXTERN curl_mimepart *curl_mime_addpart(curl_mime *mime); - -/* - * NAME curl_mime_name() - * - * DESCRIPTION - * - * Set mime/form part name. - */ -CURL_EXTERN CURLcode curl_mime_name(curl_mimepart *part, const char *name); - -/* - * NAME curl_mime_filename() - * - * DESCRIPTION - * - * Set mime part remote file name. - */ -CURL_EXTERN CURLcode curl_mime_filename(curl_mimepart *part, - const char *filename); - -/* - * NAME curl_mime_type() - * - * DESCRIPTION - * - * Set mime part type. - */ -CURL_EXTERN CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype); - -/* - * NAME curl_mime_encoder() - * - * DESCRIPTION - * - * Set mime data transfer encoder. - */ -CURL_EXTERN CURLcode curl_mime_encoder(curl_mimepart *part, - const char *encoding); - -/* - * NAME curl_mime_data() - * - * DESCRIPTION - * - * Set mime part data source from memory data, - */ -CURL_EXTERN CURLcode curl_mime_data(curl_mimepart *part, - const char *data, size_t datasize); - -/* - * NAME curl_mime_filedata() - * - * DESCRIPTION - * - * Set mime part data source from named file. - */ -CURL_EXTERN CURLcode curl_mime_filedata(curl_mimepart *part, - const char *filename); - -/* - * NAME curl_mime_data_cb() - * - * DESCRIPTION - * - * Set mime part data source from callback function. - */ -CURL_EXTERN CURLcode curl_mime_data_cb(curl_mimepart *part, - curl_off_t datasize, - curl_read_callback readfunc, - curl_seek_callback seekfunc, - curl_free_callback freefunc, - void *arg); - -/* - * NAME curl_mime_subparts() - * - * DESCRIPTION - * - * Set mime part data source from subparts. - */ -CURL_EXTERN CURLcode curl_mime_subparts(curl_mimepart *part, - curl_mime *subparts); -/* - * NAME curl_mime_headers() - * - * DESCRIPTION - * - * Set mime part headers. - */ -CURL_EXTERN CURLcode curl_mime_headers(curl_mimepart *part, - struct curl_slist *headers, - int take_ownership); - -typedef enum { - CURLFORM_NOTHING, /********* the first one is unused ************/ - CURLFORM_COPYNAME, - CURLFORM_PTRNAME, - CURLFORM_NAMELENGTH, - CURLFORM_COPYCONTENTS, - CURLFORM_PTRCONTENTS, - CURLFORM_CONTENTSLENGTH, - CURLFORM_FILECONTENT, - CURLFORM_ARRAY, - CURLFORM_OBSOLETE, - CURLFORM_FILE, - - CURLFORM_BUFFER, - CURLFORM_BUFFERPTR, - CURLFORM_BUFFERLENGTH, - - CURLFORM_CONTENTTYPE, - CURLFORM_CONTENTHEADER, - CURLFORM_FILENAME, - CURLFORM_END, - CURLFORM_OBSOLETE2, - - CURLFORM_STREAM, - CURLFORM_CONTENTLEN, /* added in 7.46.0, provide a curl_off_t length */ - - CURLFORM_LASTENTRY /* the last unused */ -} CURLformoption; - -/* structure to be used as parameter for CURLFORM_ARRAY */ -struct curl_forms { - CURLformoption option; - const char *value; -}; - -/* use this for multipart formpost building */ -/* Returns code for curl_formadd() - * - * Returns: - * CURL_FORMADD_OK on success - * CURL_FORMADD_MEMORY if the FormInfo allocation fails - * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form - * CURL_FORMADD_NULL if a null pointer was given for a char - * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed - * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used - * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) - * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated - * CURL_FORMADD_MEMORY if some allocation for string copying failed. - * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array - * - ***************************************************************************/ -typedef enum { - CURL_FORMADD_OK, /* first, no error */ - - CURL_FORMADD_MEMORY, - CURL_FORMADD_OPTION_TWICE, - CURL_FORMADD_NULL, - CURL_FORMADD_UNKNOWN_OPTION, - CURL_FORMADD_INCOMPLETE, - CURL_FORMADD_ILLEGAL_ARRAY, - CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ - - CURL_FORMADD_LAST /* last */ -} CURLFORMcode; - -/* - * NAME curl_formadd() - * - * DESCRIPTION - * - * Pretty advanced function for building multi-part formposts. Each invoke - * adds one part that together construct a full post. Then use - * CURLOPT_HTTPPOST to send it off to libcurl. - */ -CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, - struct curl_httppost **last_post, - ...); - -/* - * callback function for curl_formget() - * The void *arg pointer will be the one passed as second argument to - * curl_formget(). - * The character buffer passed to it must not be freed. - * Should return the buffer length passed to it as the argument "len" on - * success. - */ -typedef size_t (*curl_formget_callback)(void *arg, const char *buf, - size_t len); - -/* - * NAME curl_formget() - * - * DESCRIPTION - * - * Serialize a curl_httppost struct built with curl_formadd(). - * Accepts a void pointer as second argument which will be passed to - * the curl_formget_callback function. - * Returns 0 on success. - */ -CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, - curl_formget_callback append); -/* - * NAME curl_formfree() - * - * DESCRIPTION - * - * Free a multipart formpost previously built with curl_formadd(). - */ -CURL_EXTERN void curl_formfree(struct curl_httppost *form); - -/* - * NAME curl_getenv() - * - * DESCRIPTION - * - * Returns a malloc()'ed string that MUST be curl_free()ed after usage is - * complete. DEPRECATED - see lib/README.curlx - */ -CURL_EXTERN char *curl_getenv(const char *variable); - -/* - * NAME curl_version() - * - * DESCRIPTION - * - * Returns a static ascii string of the libcurl version. - */ -CURL_EXTERN char *curl_version(void); - -/* - * NAME curl_easy_escape() - * - * DESCRIPTION - * - * Escapes URL strings (converts all letters consider illegal in URLs to their - * %XX versions). This function returns a new allocated string or NULL if an - * error occurred. - */ -CURL_EXTERN char *curl_easy_escape(CURL *handle, - const char *string, - int length); - -/* the previous version: */ -CURL_EXTERN char *curl_escape(const char *string, - int length); - - -/* - * NAME curl_easy_unescape() - * - * DESCRIPTION - * - * Unescapes URL encoding in strings (converts all %XX codes to their 8bit - * versions). This function returns a new allocated string or NULL if an error - * occurred. - * Conversion Note: On non-ASCII platforms the ASCII %XX codes are - * converted into the host encoding. - */ -CURL_EXTERN char *curl_easy_unescape(CURL *handle, - const char *string, - int length, - int *outlength); - -/* the previous version */ -CURL_EXTERN char *curl_unescape(const char *string, - int length); - -/* - * NAME curl_free() - * - * DESCRIPTION - * - * Provided for de-allocation in the same translation unit that did the - * allocation. Added in libcurl 7.10 - */ -CURL_EXTERN void curl_free(void *p); - -/* - * NAME curl_global_init() - * - * DESCRIPTION - * - * curl_global_init() should be invoked exactly once for each application that - * uses libcurl and before any call of other libcurl functions. - - * This function is thread-safe if CURL_VERSION_THREADSAFE is set in the - * curl_version_info_data.features flag (fetch by curl_version_info()). - - */ -CURL_EXTERN CURLcode curl_global_init(long flags); - -/* - * NAME curl_global_init_mem() - * - * DESCRIPTION - * - * curl_global_init() or curl_global_init_mem() should be invoked exactly once - * for each application that uses libcurl. This function can be used to - * initialize libcurl and set user defined memory management callback - * functions. Users can implement memory management routines to check for - * memory leaks, check for mis-use of the curl library etc. User registered - * callback routines will be invoked by this library instead of the system - * memory management routines like malloc, free etc. - */ -CURL_EXTERN CURLcode curl_global_init_mem(long flags, - curl_malloc_callback m, - curl_free_callback f, - curl_realloc_callback r, - curl_strdup_callback s, - curl_calloc_callback c); - -/* - * NAME curl_global_cleanup() - * - * DESCRIPTION - * - * curl_global_cleanup() should be invoked exactly once for each application - * that uses libcurl - */ -CURL_EXTERN void curl_global_cleanup(void); - -/* linked-list structure for the CURLOPT_QUOTE option (and other) */ -struct curl_slist { - char *data; - struct curl_slist *next; -}; - -/* - * NAME curl_global_sslset() - * - * DESCRIPTION - * - * When built with multiple SSL backends, curl_global_sslset() allows to - * choose one. This function can only be called once, and it must be called - * *before* curl_global_init(). - * - * The backend can be identified by the id (e.g. CURLSSLBACKEND_OPENSSL). The - * backend can also be specified via the name parameter (passing -1 as id). - * If both id and name are specified, the name will be ignored. If neither id - * nor name are specified, the function will fail with - * CURLSSLSET_UNKNOWN_BACKEND and set the "avail" pointer to the - * NULL-terminated list of available backends. - * - * Upon success, the function returns CURLSSLSET_OK. - * - * If the specified SSL backend is not available, the function returns - * CURLSSLSET_UNKNOWN_BACKEND and sets the "avail" pointer to a NULL-terminated - * list of available SSL backends. - * - * The SSL backend can be set only once. If it has already been set, a - * subsequent attempt to change it will result in a CURLSSLSET_TOO_LATE. - */ - -struct curl_ssl_backend { - curl_sslbackend id; - const char *name; -}; -typedef struct curl_ssl_backend curl_ssl_backend; - -typedef enum { - CURLSSLSET_OK = 0, - CURLSSLSET_UNKNOWN_BACKEND, - CURLSSLSET_TOO_LATE, - CURLSSLSET_NO_BACKENDS /* libcurl was built without any SSL support */ -} CURLsslset; - -CURL_EXTERN CURLsslset curl_global_sslset(curl_sslbackend id, const char *name, - const curl_ssl_backend ***avail); - -/* - * NAME curl_slist_append() - * - * DESCRIPTION - * - * Appends a string to a linked list. If no list exists, it will be created - * first. Returns the new list, after appending. - */ -CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, - const char *); - -/* - * NAME curl_slist_free_all() - * - * DESCRIPTION - * - * free a previously built curl_slist. - */ -CURL_EXTERN void curl_slist_free_all(struct curl_slist *); - -/* - * NAME curl_getdate() - * - * DESCRIPTION - * - * Returns the time, in seconds since 1 Jan 1970 of the time string given in - * the first argument. The time argument in the second parameter is unused - * and should be set to NULL. - */ -CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); - -/* info about the certificate chain, only for OpenSSL, GnuTLS, Schannel, NSS - and GSKit builds. Asked for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ -struct curl_certinfo { - int num_of_certs; /* number of certificates with information */ - struct curl_slist **certinfo; /* for each index in this array, there's a - linked list with textual information in the - format "name: value" */ -}; - -/* Information about the SSL library used and the respective internal SSL - handle, which can be used to obtain further information regarding the - connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */ -struct curl_tlssessioninfo { - curl_sslbackend backend; - void *internals; -}; - -#define CURLINFO_STRING 0x100000 -#define CURLINFO_LONG 0x200000 -#define CURLINFO_DOUBLE 0x300000 -#define CURLINFO_SLIST 0x400000 -#define CURLINFO_PTR 0x400000 /* same as SLIST */ -#define CURLINFO_SOCKET 0x500000 -#define CURLINFO_OFF_T 0x600000 -#define CURLINFO_MASK 0x0fffff -#define CURLINFO_TYPEMASK 0xf00000 - -typedef enum { - CURLINFO_NONE, /* first, never use this */ - CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, - CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, - CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, - CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, - CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, - CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, - CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, - CURLINFO_SIZE_UPLOAD_T = CURLINFO_OFF_T + 7, - CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, - CURLINFO_SIZE_DOWNLOAD_T = CURLINFO_OFF_T + 8, - CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, - CURLINFO_SPEED_DOWNLOAD_T = CURLINFO_OFF_T + 9, - CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, - CURLINFO_SPEED_UPLOAD_T = CURLINFO_OFF_T + 10, - CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, - CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, - CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, - CURLINFO_FILETIME = CURLINFO_LONG + 14, - CURLINFO_FILETIME_T = CURLINFO_OFF_T + 14, - CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, - CURLINFO_CONTENT_LENGTH_DOWNLOAD_T = CURLINFO_OFF_T + 15, - CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, - CURLINFO_CONTENT_LENGTH_UPLOAD_T = CURLINFO_OFF_T + 16, - CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, - CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, - CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, - CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, - CURLINFO_PRIVATE = CURLINFO_STRING + 21, - CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, - CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, - CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, - CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, - CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, - CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, - CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, - CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, - CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, - CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, - CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, - CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, - CURLINFO_CERTINFO = CURLINFO_PTR + 34, - CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, - CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, - CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, - CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, - CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, - CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, - CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, - CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, - CURLINFO_TLS_SESSION = CURLINFO_PTR + 43, - CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, - CURLINFO_TLS_SSL_PTR = CURLINFO_PTR + 45, - CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, - CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, - CURLINFO_PROTOCOL = CURLINFO_LONG + 48, - CURLINFO_SCHEME = CURLINFO_STRING + 49, - CURLINFO_TOTAL_TIME_T = CURLINFO_OFF_T + 50, - CURLINFO_NAMELOOKUP_TIME_T = CURLINFO_OFF_T + 51, - CURLINFO_CONNECT_TIME_T = CURLINFO_OFF_T + 52, - CURLINFO_PRETRANSFER_TIME_T = CURLINFO_OFF_T + 53, - CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54, - CURLINFO_REDIRECT_TIME_T = CURLINFO_OFF_T + 55, - CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56, - CURLINFO_RETRY_AFTER = CURLINFO_OFF_T + 57, - CURLINFO_EFFECTIVE_METHOD = CURLINFO_STRING + 58, - CURLINFO_PROXY_ERROR = CURLINFO_LONG + 59, - CURLINFO_REFERER = CURLINFO_STRING + 60, - CURLINFO_CAINFO = CURLINFO_STRING + 61, - CURLINFO_CAPATH = CURLINFO_STRING + 62, - CURLINFO_LASTONE = 62 -} CURLINFO; - -/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as - CURLINFO_HTTP_CODE */ -#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE - -typedef enum { - CURLCLOSEPOLICY_NONE, /* first, never use this */ - - CURLCLOSEPOLICY_OLDEST, - CURLCLOSEPOLICY_LEAST_RECENTLY_USED, - CURLCLOSEPOLICY_LEAST_TRAFFIC, - CURLCLOSEPOLICY_SLOWEST, - CURLCLOSEPOLICY_CALLBACK, - - CURLCLOSEPOLICY_LAST /* last, never use this */ -} curl_closepolicy; - -#define CURL_GLOBAL_SSL (1<<0) /* no purpose since 7.57.0 */ -#define CURL_GLOBAL_WIN32 (1<<1) -#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) -#define CURL_GLOBAL_NOTHING 0 -#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL -#define CURL_GLOBAL_ACK_EINTR (1<<2) - - -/***************************************************************************** - * Setup defines, protos etc for the sharing stuff. - */ - -/* Different data locks for a single share */ -typedef enum { - CURL_LOCK_DATA_NONE = 0, - /* CURL_LOCK_DATA_SHARE is used internally to say that - * the locking is just made to change the internal state of the share - * itself. - */ - CURL_LOCK_DATA_SHARE, - CURL_LOCK_DATA_COOKIE, - CURL_LOCK_DATA_DNS, - CURL_LOCK_DATA_SSL_SESSION, - CURL_LOCK_DATA_CONNECT, - CURL_LOCK_DATA_PSL, - CURL_LOCK_DATA_LAST -} curl_lock_data; - -/* Different lock access types */ -typedef enum { - CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ - CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ - CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ - CURL_LOCK_ACCESS_LAST /* never use */ -} curl_lock_access; - -typedef void (*curl_lock_function)(CURL *handle, - curl_lock_data data, - curl_lock_access locktype, - void *userptr); -typedef void (*curl_unlock_function)(CURL *handle, - curl_lock_data data, - void *userptr); - - -typedef enum { - CURLSHE_OK, /* all is fine */ - CURLSHE_BAD_OPTION, /* 1 */ - CURLSHE_IN_USE, /* 2 */ - CURLSHE_INVALID, /* 3 */ - CURLSHE_NOMEM, /* 4 out of memory */ - CURLSHE_NOT_BUILT_IN, /* 5 feature not present in lib */ - CURLSHE_LAST /* never use */ -} CURLSHcode; - -typedef enum { - CURLSHOPT_NONE, /* don't use */ - CURLSHOPT_SHARE, /* specify a data type to share */ - CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ - CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ - CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ - CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock - callback functions */ - CURLSHOPT_LAST /* never use */ -} CURLSHoption; - -CURL_EXTERN CURLSH *curl_share_init(void); -CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); -CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); - -/**************************************************************************** - * Structures for querying information about the curl library at runtime. - */ - -typedef enum { - CURLVERSION_FIRST, - CURLVERSION_SECOND, - CURLVERSION_THIRD, - CURLVERSION_FOURTH, - CURLVERSION_FIFTH, - CURLVERSION_SIXTH, - CURLVERSION_SEVENTH, - CURLVERSION_EIGHTH, - CURLVERSION_NINTH, - CURLVERSION_TENTH, - CURLVERSION_LAST /* never actually use this */ -} CURLversion; - -/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by - basically all programs ever that want to get version information. It is - meant to be a built-in version number for what kind of struct the caller - expects. If the struct ever changes, we redefine the NOW to another enum - from above. */ -#define CURLVERSION_NOW CURLVERSION_TENTH - -struct curl_version_info_data { - CURLversion age; /* age of the returned struct */ - const char *version; /* LIBCURL_VERSION */ - unsigned int version_num; /* LIBCURL_VERSION_NUM */ - const char *host; /* OS/host/cpu/machine when configured */ - int features; /* bitmask, see defines below */ - const char *ssl_version; /* human readable string */ - long ssl_version_num; /* not used anymore, always 0 */ - const char *libz_version; /* human readable string */ - /* protocols is terminated by an entry with a NULL protoname */ - const char * const *protocols; - - /* The fields below this were added in CURLVERSION_SECOND */ - const char *ares; - int ares_num; - - /* This field was added in CURLVERSION_THIRD */ - const char *libidn; - - /* These field were added in CURLVERSION_FOURTH */ - - /* Same as '_libiconv_version' if built with HAVE_ICONV */ - int iconv_ver_num; - - const char *libssh_version; /* human readable string */ - - /* These fields were added in CURLVERSION_FIFTH */ - unsigned int brotli_ver_num; /* Numeric Brotli version - (MAJOR << 24) | (MINOR << 12) | PATCH */ - const char *brotli_version; /* human readable string. */ - - /* These fields were added in CURLVERSION_SIXTH */ - unsigned int nghttp2_ver_num; /* Numeric nghttp2 version - (MAJOR << 16) | (MINOR << 8) | PATCH */ - const char *nghttp2_version; /* human readable string. */ - const char *quic_version; /* human readable quic (+ HTTP/3) library + - version or NULL */ - - /* These fields were added in CURLVERSION_SEVENTH */ - const char *cainfo; /* the built-in default CURLOPT_CAINFO, might - be NULL */ - const char *capath; /* the built-in default CURLOPT_CAPATH, might - be NULL */ - - /* These fields were added in CURLVERSION_EIGHTH */ - unsigned int zstd_ver_num; /* Numeric Zstd version - (MAJOR << 24) | (MINOR << 12) | PATCH */ - const char *zstd_version; /* human readable string. */ - - /* These fields were added in CURLVERSION_NINTH */ - const char *hyper_version; /* human readable string. */ - - /* These fields were added in CURLVERSION_TENTH */ - const char *gsasl_version; /* human readable string. */ -}; -typedef struct curl_version_info_data curl_version_info_data; - -#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ -#define CURL_VERSION_KERBEROS4 (1<<1) /* Kerberos V4 auth is supported - (deprecated) */ -#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ -#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ -#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ -#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth is supported - (deprecated) */ -#define CURL_VERSION_DEBUG (1<<6) /* Built with debug capabilities */ -#define CURL_VERSION_ASYNCHDNS (1<<7) /* Asynchronous DNS resolves */ -#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth is supported */ -#define CURL_VERSION_LARGEFILE (1<<9) /* Supports files larger than 2GB */ -#define CURL_VERSION_IDN (1<<10) /* Internationized Domain Names are - supported */ -#define CURL_VERSION_SSPI (1<<11) /* Built against Windows SSPI */ -#define CURL_VERSION_CONV (1<<12) /* Character conversions supported */ -#define CURL_VERSION_CURLDEBUG (1<<13) /* Debug memory tracking supported */ -#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ -#define CURL_VERSION_NTLM_WB (1<<15) /* NTLM delegation to winbind helper - is supported */ -#define CURL_VERSION_HTTP2 (1<<16) /* HTTP2 support built-in */ -#define CURL_VERSION_GSSAPI (1<<17) /* Built against a GSS-API library */ -#define CURL_VERSION_KERBEROS5 (1<<18) /* Kerberos V5 auth is supported */ -#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */ -#define CURL_VERSION_PSL (1<<20) /* Mozilla's Public Suffix List, used - for cookie domain verification */ -#define CURL_VERSION_HTTPS_PROXY (1<<21) /* HTTPS-proxy support built-in */ -#define CURL_VERSION_MULTI_SSL (1<<22) /* Multiple SSL backends available */ -#define CURL_VERSION_BROTLI (1<<23) /* Brotli features are present. */ -#define CURL_VERSION_ALTSVC (1<<24) /* Alt-Svc handling built-in */ -#define CURL_VERSION_HTTP3 (1<<25) /* HTTP3 support built-in */ -#define CURL_VERSION_ZSTD (1<<26) /* zstd features are present */ -#define CURL_VERSION_UNICODE (1<<27) /* Unicode support on Windows */ -#define CURL_VERSION_HSTS (1<<28) /* HSTS is supported */ -#define CURL_VERSION_GSASL (1<<29) /* libgsasl is supported */ -#define CURL_VERSION_THREADSAFE (1<<30) /* libcurl API is thread-safe */ - - /* - * NAME curl_version_info() - * - * DESCRIPTION - * - * This function returns a pointer to a static copy of the version info - * struct. See above. - */ -CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); - -/* - * NAME curl_easy_strerror() - * - * DESCRIPTION - * - * The curl_easy_strerror function may be used to turn a CURLcode value - * into the equivalent human readable error string. This is useful - * for printing meaningful error messages. - */ -CURL_EXTERN const char *curl_easy_strerror(CURLcode); - -/* - * NAME curl_share_strerror() - * - * DESCRIPTION - * - * The curl_share_strerror function may be used to turn a CURLSHcode value - * into the equivalent human readable error string. This is useful - * for printing meaningful error messages. - */ -CURL_EXTERN const char *curl_share_strerror(CURLSHcode); - -/* - * NAME curl_easy_pause() - * - * DESCRIPTION - * - * The curl_easy_pause function pauses or unpauses transfers. Select the new - * state by setting the bitmask, use the convenience defines below. - * - */ -CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); - -#define CURLPAUSE_RECV (1<<0) -#define CURLPAUSE_RECV_CONT (0) - -#define CURLPAUSE_SEND (1<<2) -#define CURLPAUSE_SEND_CONT (0) - -#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) -#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) - -#ifdef __cplusplus -} -#endif - -/* unfortunately, the easy.h and multi.h include files need options and info - stuff before they can be included! */ -#include "easy.h" /* nothing in curl is fun without the easy stuff */ -#include "multi.h" -#include "urlapi.h" -#include "options.h" -#include "header.h" - -/* the typechecker doesn't work in C++ (yet) */ -#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ - ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ - !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) -#include "typecheck-gcc.h" -#else -#if defined(__STDC__) && (__STDC__ >= 1) -/* This preprocessor magic that replaces a call with the exact same call is - only done to make sure application authors pass exactly three arguments - to these functions. */ -#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) -#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) -#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) -#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) -#endif /* __STDC__ >= 1 */ -#endif /* gcc >= 4.3 && !__cplusplus */ - -#endif /* CURLINC_CURL_H */ diff --git a/dependencies/reboot/vendor/curl/curlver.h b/dependencies/reboot/vendor/curl/curlver.h deleted file mode 100644 index 3a3d16e..0000000 --- a/dependencies/reboot/vendor/curl/curlver.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef CURLINC_CURLVER_H -#define CURLINC_CURLVER_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -/* This header file contains nothing but libcurl version info, generated by - a script at release-time. This was made its own header file in 7.11.2 */ - -/* This is the global package copyright */ -#define LIBCURL_COPYRIGHT "1996 - 2022 Daniel Stenberg, ." - -/* This is the version number of the libcurl package from which this header - file origins: */ -#define LIBCURL_VERSION "7.85.0-DEV" - -/* The numeric version number is also available "in parts" by using these - defines: */ -#define LIBCURL_VERSION_MAJOR 7 -#define LIBCURL_VERSION_MINOR 85 -#define LIBCURL_VERSION_PATCH 0 - -/* This is the numeric version of the libcurl version number, meant for easier - parsing and comparisons by programs. The LIBCURL_VERSION_NUM define will - always follow this syntax: - - 0xXXYYZZ - - Where XX, YY and ZZ are the main version, release and patch numbers in - hexadecimal (using 8 bits each). All three numbers are always represented - using two digits. 1.2 would appear as "0x010200" while version 9.11.7 - appears as "0x090b07". - - This 6-digit (24 bits) hexadecimal number does not show pre-release number, - and it is always a greater number in a more recent release. It makes - comparisons with greater than and less than work. - - Note: This define is the full hex number and _does not_ use the - CURL_VERSION_BITS() macro since curl's own configure script greps for it - and needs it to contain the full number. -*/ -#define LIBCURL_VERSION_NUM 0x075500 - -/* - * This is the date and time when the full source package was created. The - * timestamp is not stored in git, as the timestamp is properly set in the - * tarballs by the maketgz script. - * - * The format of the date follows this template: - * - * "2007-11-23" - */ -#define LIBCURL_TIMESTAMP "[unreleased]" - -#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z)) -#define CURL_AT_LEAST_VERSION(x,y,z) \ - (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) - -#endif /* CURLINC_CURLVER_H */ diff --git a/dependencies/reboot/vendor/curl/easy.h b/dependencies/reboot/vendor/curl/easy.h deleted file mode 100644 index 9c7e63a..0000000 --- a/dependencies/reboot/vendor/curl/easy.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef CURLINC_EASY_H -#define CURLINC_EASY_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ -#ifdef __cplusplus -extern "C" { -#endif - -/* Flag bits in the curl_blob struct: */ -#define CURL_BLOB_COPY 1 /* tell libcurl to copy the data */ -#define CURL_BLOB_NOCOPY 0 /* tell libcurl to NOT copy the data */ - -struct curl_blob { - void *data; - size_t len; - unsigned int flags; /* bit 0 is defined, the rest are reserved and should be - left zeroes */ -}; - -CURL_EXTERN CURL *curl_easy_init(void); -CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); -CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); -CURL_EXTERN void curl_easy_cleanup(CURL *curl); - -/* - * NAME curl_easy_getinfo() - * - * DESCRIPTION - * - * Request internal information from the curl session with this function. The - * third argument MUST be a pointer to a long, a pointer to a char * or a - * pointer to a double (as the documentation describes elsewhere). The data - * pointed to will be filled in accordingly and can be relied upon only if the - * function returns CURLE_OK. This function is intended to get used *AFTER* a - * performed transfer, all results from this function are undefined until the - * transfer is completed. - */ -CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); - - -/* - * NAME curl_easy_duphandle() - * - * DESCRIPTION - * - * Creates a new curl session handle with the same options set for the handle - * passed in. Duplicating a handle could only be a matter of cloning data and - * options, internal state info and things like persistent connections cannot - * be transferred. It is useful in multithreaded applications when you can run - * curl_easy_duphandle() for each new thread to avoid a series of identical - * curl_easy_setopt() invokes in every thread. - */ -CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl); - -/* - * NAME curl_easy_reset() - * - * DESCRIPTION - * - * Re-initializes a CURL handle to the default values. This puts back the - * handle to the same state as it was in when it was just created. - * - * It does keep: live connections, the Session ID cache, the DNS cache and the - * cookies. - */ -CURL_EXTERN void curl_easy_reset(CURL *curl); - -/* - * NAME curl_easy_recv() - * - * DESCRIPTION - * - * Receives data from the connected socket. Use after successful - * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. - */ -CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, - size_t *n); - -/* - * NAME curl_easy_send() - * - * DESCRIPTION - * - * Sends data over the connected socket. Use after successful - * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. - */ -CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, - size_t buflen, size_t *n); - - -/* - * NAME curl_easy_upkeep() - * - * DESCRIPTION - * - * Performs connection upkeep for the given session handle. - */ -CURL_EXTERN CURLcode curl_easy_upkeep(CURL *curl); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/dependencies/reboot/vendor/curl/header.h b/dependencies/reboot/vendor/curl/header.h deleted file mode 100644 index 6af29c0..0000000 --- a/dependencies/reboot/vendor/curl/header.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef CURLINC_HEADER_H -#define CURLINC_HEADER_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 2018 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -struct curl_header { - char *name; /* this might not use the same case */ - char *value; - size_t amount; /* number of headers using this name */ - size_t index; /* ... of this instance, 0 or higher */ - unsigned int origin; /* see bits below */ - void *anchor; /* handle privately used by libcurl */ -}; - -/* 'origin' bits */ -#define CURLH_HEADER (1<<0) /* plain server header */ -#define CURLH_TRAILER (1<<1) /* trailers */ -#define CURLH_CONNECT (1<<2) /* CONNECT headers */ -#define CURLH_1XX (1<<3) /* 1xx headers */ -#define CURLH_PSEUDO (1<<4) /* pseudo headers */ - -typedef enum { - CURLHE_OK, - CURLHE_BADINDEX, /* header exists but not with this index */ - CURLHE_MISSING, /* no such header exists */ - CURLHE_NOHEADERS, /* no headers at all exist (yet) */ - CURLHE_NOREQUEST, /* no request with this number was used */ - CURLHE_OUT_OF_MEMORY, /* out of memory while processing */ - CURLHE_BAD_ARGUMENT, /* a function argument was not okay */ - CURLHE_NOT_BUILT_IN /* if API was disabled in the build */ -} CURLHcode; - -CURL_EXTERN CURLHcode curl_easy_header(CURL *easy, - const char *name, - size_t index, - unsigned int origin, - int request, - struct curl_header **hout); - -CURL_EXTERN struct curl_header *curl_easy_nextheader(CURL *easy, - unsigned int origin, - int request, - struct curl_header *prev); - -#endif /* CURLINC_HEADER_H */ diff --git a/dependencies/reboot/vendor/curl/libcurl.lib b/dependencies/reboot/vendor/curl/libcurl.lib deleted file mode 100644 index 67de41856581de8f5e689c714d2e56251bdeba6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12379478 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

oB0(tfA%KSf8%e-}Ow*@H;|lN%v(d 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%0APNZ$^kWKU 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

L(J< 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ՙ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%0D#-?ZS2+$-G@KF8 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
*DTzZVjFE1TsV-&n{34U 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


|UuERQPmXFX1zlvbX8x<61awDD-4$ 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

2uitO?^+D4k9~z(Two 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

HqNiD#VWT7!20PCC8Q(!Un>CCLxer(iyv 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

KZgji=$UsXD$M65N`<>`- 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�d|2i!69&ea0EOM{GI9vRR1#v)O_Ti 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�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ⅈZpswflKw9?nza3#*bH3FcPbbyd?yrSW+q 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�pN5k!Qlc6}uAGHwgRRED7_Vx^n@u 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%0DLco83A^bDwq|>bC=HN8b!S@kF-y2^RAi-t=;( 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 F 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 ZMHtRj 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
>IjW8c+W$5%V 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 z zPEES|GG>5(d#y;zS$twfu_=x>l_f`QR&AYO z)S*uHvV|JEKe1T6CqlRhc-n|ckzhZp0$Nfyocb%BNtHo@~ae>{-UJptcWY%+X_X_Qf?DFUy*a!0p zlm&KwYhp&_w%;1t4u5Do|83~W2LZ=NKKP|siy7fOuQFGz|W{rZ5e(csL>#j*^g@_|Pu~nGy<*8$5k9m;% zMIBPAP1C~(0b5INShaNG^Ln9=dMkokF9pvv#@BPi&E(phpPp4*dw8YklTQa)2fbZ8 zIcn;J$gu8L>>spig>MgH|1tdYwB@O`@yBj1c>HJ5(g$-MO>uj1vv|AExvrP|EB&;> zX&L$t#@DXeu;-u7CrlcxIy$qSe9Fm#ugBC~e`Wvlcc+unpPa9wMtv~8P4mVom(^>% zG}P*7r^~#>!u~|T~fT7 zOka0x>hsxyY*ugYd=(2|@L6)>a(kOrxj1rBQeu@Me!-Z5VW1F3Q zhtFES{`HnU57%pdv9D6G*x)Y_lb4MBP=3)6oa19p>At+Tp~2w@zhb2>F1puazGuC2 zhfC}VFMn*_+5Isu1Lk~#ooX20j4kyJe{Mf z7r$ITda3cloyj35Ked>diF2_SU%7!_H5%up{@(JS2E#ih zmY*^kuh-O|bZ7ZIbuvlrUt^8B;fp3EcUqa3Sbo$?SZc1!OEO7qH#tubx-hF3w)|193*-skG;6c?ME^7-*SAHEib(_5E>s1zC1mPXy>$Q6F{?8>ZbuDkP_vz5nb8=t(Qv7<%0L`xH2V`fo z-aFARv~!^RxldT$>HX|JWxf`l`FL98rfo~L=ytQSYo)+X0sEUB{1l0CXEx&-X1%po zwu5iw>1}K$Bo8zx_vETV>Ct$_iMm&8hK^42hhF|&q)Szs z)!mN5-^Ve&aAMcXqqO{-C|Jxo}J%(w7NMk@8*ZvX3J;LI-z+jO1Imc$D8X-zg*hRwNm24Dp?mc z-)MQesm+VpuScCJF)})72Uc$xpRvQrk&EiQtFV0Iy18YIAAOJY_^G0@O~BcegLm6q zd3$ZNAS_{gr@v_K9h>JHI;if~wPlvx{=&!!%d*4pP+`LI0O84gU z8eb1I%iWiF;d+)^_v>RSdnLXYJ54?=J8td>ZLPS4=(iYOdT8H@=W~}kwD!61u4TWk z`yw+Z_N;%Rb=t@+YpM)eemfcKFN|+v*roRmo9=$l@08~Tn+qQgbtpb{z;^e+bLyO_ zTEg?oUidXz)Un*y^u$VM-!i6OuU60N;hxlsjR!_t8|F-m|kVq%1cu|cNso=WvtP_ zy)yc)`J(JdYVON=&@vux!BKjL>!g*Yc`bpEKS0{U)|>q79?GE*E-ztem;7u4%_T z6@PDjHS=ECV@YlLJpX0c>B&Q8{C)|K9T;EK`HXB~jZ>Y*8zRP7kBEG=`Hw!Qey(*r z!ohd(CNKBr7@uxnd~w!UP3E+$-)EbpqSgHHDjol*)oR|<;-(d*e=Z-Q$(ue6=d3rN zbhm1Z6EY7(ot-`F(Pxw5#}Z$Co;B2dSVI%f_shn-xnW2BG~=tfeBs@C@vmmAPBRH9 zo>QvM@#X6iThHt|d%0!l5|!*|Z_#1KH*}&=$t(M&U-_`ivE73j3qo=gPZqy!xw@iV zZO_cXmbS1L8_XT$#&Rpwffwid=PYkD=aWmukRzoxw7mH?r*4&b6RNb{wD^7__+7>~ zd(Vk+rVsk1)jP62po!wo2Yt35uF=~;UHpjU@e8Yj>!{y-j4$j+jb*j-jP`bx&0O$q ztNZGU>8B!}IiwmrcImaN-_JLZzcP?1H}-$zvu)Of7yjMi${yZ-dtbGH)1I@xRh;;u zhyT0&{q1AFW8t3h9W$%9F8=kDTEo8tg$6hLX<_+>`%6FgW7zyJr&Yzfj5(T%*ZUaX z^ePq2JX@b=QKr)-vwA;%u*Et)J)kt`(c^JgLIE9^%Kv z^XQ#bn%Dk#)NkF%Cnct5wlCk{_qBMi(3tXP((TtuNsT7VHtzAwy8MDC4R0TuylGrx|90+L59cWQ_4-(XHCH;x%~$z}V8ev{r- zx~vr6D zV@H*`i|&4}`SEK@oOjCjnmIkJ>M;3^?ZMJXeeBzH=-i^oYWJK2U#u(FAJg8u{|JmX z$~K{NfA)78I``8YpFfswm+h)@&aRs8hX<{%*Z=0YwE3!>=7+Z8$r$6yu`>0sl_^8Y z_43>KZBo*+^MBNuU+(7Rps7=wPo#OgdXM=6Rc-VuT?X?%<~u3`{m<4Jm~wuWoOTMd%mr+p0pux%GldiCQq>#yXFPX z?Lu3Z8_&4gQvUJj_#0QuS5C>Z+2+*CYT?)Fo{LwnbY9uuR-iG;F`n@`4ECtyHgMh` zn{eX}A=ifteO9ene82mf%ZHx!y|bsy3)ICG#`kGh?78L@O52rBKAJe^uzFF9$Mdo4 z9xU(D{?X>Eiq!|U;FT@RrO-a+rhVPH(PBVy$?hAjHH;Z`XGqC8XX`(oy~{o+ez!xd z)!2K*_*Tw)vLd6+&}HX_9xd5>Nc!->x9hs+|fi~08tc;%Au-RXa!T$1sz z$7e4rbjvPVZJz&DqlQ24voV_dQ=3=S`hVUo2xiSF-6@LlwJT=Um^t5HlTmy~tO6NNH1pTa-k=1o&#Tusb2i_Vv z597M|jL$WA)Rl_1!a`wFlgIO#d`pYic;^>YgJZ$Bu6G;X*2NEP;|1e8S2DiJvX?c^ zbUA$G{qgsu9u4VG(|vsx<$|gWeyZI0T={i^;DWg=)_o$cY_$JcDt7IsJ@H>0r_}Ln zUNZVn*Xf$nQFolq3qGMZE`srO9)9{-@uwv_yv!Kx`kN5({L!OEH>(AjrakUGxrg>_ z{Cb=y!1$b|{$y17!C{BsA-++&MvmIn`-!#9$wm{FE&Teva?jL|x$w^|DBbN_7C);o z;$aWZEoGKB96!kK%w|=I=BmZl*3Rmj(KEdAF1#+y_zs(&oOj-~_q?4^4=vp`-5NY{ z+3oegeQO^{A2%p;ce_^eFm7jj-uKFHIPdLo=J17}`x})`TRJuSI7!Tr{%N_ajGhs-7DE{AHtIYcSSzN1Kxyx0;l- zZ|~4+i%pi#tRY+0ac|3ac1t%syHb73=yN+ZT<^UReuMF~A9JV6sDaka-qxNqyx5LP z`zxjXv7>+5y|e9yE5g-P+>dvfgK1B32(s{`CG{`vuQO zxU4K)ZLA>F$DBrPTz$S{2~YD|d0)b`2R9sBf580qu9s=%seL9)3K@C0&8>U*<}2e{ z?P^rXqf6J1{qrt9sgW^Y+OSDYJYLjl@cCiYs9ooqL{7rd7mP1hx%y6Ysn<0f??eQo zSe%%Ww;{dU+t*I}b3HWm9(|K=-%gF*TPO2 zUqscB533#e^rm*P%wHDAyliw}REYrBTQSYsRQmaIoxyfX1mOweTQ>dkqTnvQ-_6uC zJGShdPxtvfN0#v$^XcX8I+I>n-+eR{uiiRS{wCEszM#jGCC%;}aewioT}E-Uh?R=p zEFwc5KYOQGXtvu0&k-44V6~MsE$jlK+Qb$6{A}d1J#Id-(>J$YaUXZ=_l0#TS*?OU zWqc!Vx&~cddT7!H^BE4R#0jSs-Y#AD{JkMhGgA&dJ96Z^9oDHKQ*In-6+8K6?e@*y zb}l~EtLur@p?mVuuAa{Me6p8tDc9+p5&Cn+SNg=N7OTD7W5afIukxVs%^s^4k95C# zYWs<89ffVPo4$lS|Hk+#Z#w(4{kTJI(wc8-vOdJ~i}g=+FS?wYlvlTVu_~d5vbzdG z9^<=d-01Su`WZH@y4LX;^{_?Ha=#oNKD9?sG0pv9(~jKiiGIIr8_Hj|N!?5ASspu~ zLjT`)^_`-g`f=E}zDp|HoqP3j>dCLo@0EZ*Wqi9Ao1OD%j0KSbt%BE)(N_fAHl-PP50Y9+q8kzIDCBRlKfbl^SpI%I`~XuUg=1 z_7kOBdxG}_i&n|AOD{V2P_gz>c*U_@7j|&i|L2963y#$tZelF1VSM*L7`>{q=-%3E z8_cJ8J#N#<`TkkI+-gf3j_-5Ltj6JIS8xmo;~SrRCm^fOl;6g9N2h#s*r;md+1WMX z&CptrH~mjN@!0kR^ZmAzZrSs1qW(NHxB?zsr~^%KeFr*N4;lY# zX}0##=!1R^vMa9|mFr@OSNj>?*q0+l*DGP%y}^s2AEzJLxaQfzhemlD##}qt?f#3! zM_+8fz5>SAtzUq1tbE#sT;t#-{#yG}dsC0S{8p@3#G9p89BNkys4NJN7+*!ZZEc%c z_MTq)o3d%wZ^v(|*X{4NsPo`Z>vn&xUlI2Tw$c$}3Ayo`DUrX~rd;S47i9EWcBRtK zsjq^zcX<8#gC_&(ZS1nC!8oi_Grl7w%M2U-A#>#WM!w&YC-`(t@@-gsUTO{RWzIWm zjd}NI4c1>6-yh>vZhWX*Fj2l`%0wUAtN{mRM+TN!@w;!#!ukiBG;QvOeFX|iw{d)n zg}cLQyZv@ID9^Ixz>^=s2hTLQk=LzjV$jDjXHBM~UuAshn=d4Oyr)PFY3JdvV~h7@ z=Xp!AD@7N3esyg~^G2(DpQ2x7eBWn1A9sK2iV;uV&#bz#K_o!7i* z+Nqat+Ops63Pyh%+gaxpMGKWo5?upi1E#scF=xmYM{x~s3#{r)jK+; zU3S@E*Y$}F9!`Gx(4@t#;+XFX*q?%nevQirf+J{fv4XRRj|AR9#ODI19lC>;b}_BK?1U!S#Q9zJk5!IuQHXg4hd2Niq0pTaiA_f$u>CF?oF< zlnZ0q@W_E3DHRr^gTJl!-{GW}aZ&Lqgu_At`)uMkqL;S8q5GuMKj^bx^{X-J}%5bpV zD<~`;r}Jam*Px_ie8$6YDve0O_psvn8%*G!_?SrSAT45%`R6mBzA$`Cpop@l-C@67 zcyv+a=vM=)1={0>&5{PwU1&r|qNF?0>>hR_(S z0`J)9WEHiTNeK~Q{7djf^_aSjK3^c-QNov=4bbW1=^C!B<{VNTABg60>ogs8J5HGg|;VMK|2JNOp@rl$z()c$GKZOdO zl$I1k@39%8>}(tsMsKhdk~71VJ_e_AB^$sC#DyiMB^baP^X@|5tp9T-BvlD1Q7mH7 z`~Yhstg|SrQvQ{>#A2q7qiten6x!4v_JUzk7@gr^5MdZ>2GfZ)h1lM|DkimxkR(hA z4bmp~0W*fklWu9GXvU>mY$>udu?Os%5*;oL7K)ZNdXdr)iqaL4<>Kj+o(&{(yqRYbc!$2+;i`6mlA^74<(TBSj{;?yZiY`fP0XVA!3sHI_)1oR(X#}j55rkc zhN}ix2o9i0iZ_5;#Bx3R$XQ520tP|JA<;OruBatu!*8qz#EI2V6bnWx!y3eY>Xz z)#&+(C{i4sB_?3$32ws>M#40Q%1lWJj*kl~YD>t^AUn>ch{feg8-`FEy7i>AI6Obp zJq#;a%gR@pAxbFqPB?-z-T*^W?i&rV+@d$LDB`XSte}(4(o>g+@c%O#6o0 zY=A`|Iv~jqjVUQ1CPW;t{C5NUVdzd}HAK$%Cw7Y}=`UHs^Od5?r1=0pHImLkEb;>8 z4_U;q!#L;9urm3?kC(bg!{wx=$zci6Meb!{gZMc4|InuXFI&Ob?m3)UTEqg19l@Za zrqKz~u;@RlOOzHJ*Mhce6ftYMUZv25G{Ze|7#NnA5=ZkZ_6WD=6E?lkgdv(7JsG7l zFfnU$61$2Ys^|ZMA`FpjtXhU)b*hLakUvZ@jG+F>v3gHm{y*svTN4eTK{`shkWw42 zzR@$I*Gk0ku4x9!a)NmF=l|Di55!t=WKmZJ@(nAz$YW{dr*vaO%pVN1>XVWj9fPi- z=+ifyho@z&#Q35*Wl@^A{3$x5|2~GIK?Th~3bB}fxzGUHV=Iho2Am{yvOl!(e<_kW zg`aVBwIr-)<-}>dMJ%SM{7?fudC7m|>r}*y(X>rmMWtsFhEf>Kb{qa($M-KQGcp>d z&KtrmsDDqU|7BAi3 z_22(eRnhTKe9@gN3?FiEAZ}usL3|;bG8=AJEkDHE5cSA1W|)P3TH;BflfET4Q4}XF z`u&Kwfrcn1oq=o!InWe)5?yqw$M7sBWT3%ZYI0(7JbgW)=oyO*6SvX-=h_pyv*dyC zDF(<-{@S;pS~hLX568^kP|7#Z5)uCKLDQFdif#;Og+Fu}|Jf$sQ2CBF z$vG6Qc(h_=hz3pPyzAD0ikKsO(V*xGM`wsvhzwCOb|!w&GlZqt2=OU((S@OOWaVO) zS`=e~BpQ(xF-t$rdYTzV8lDbe@>$ejpO`i7^TIIv6Z^sctTa&|6bG4+A+gahhFvL# z7nIuef6gS_1g+SG#m0y0_R%7N?s*8m4t6h4&8+?=L;~_|NLnWv+0=8*Vi&A~nnq8`kNObCO~9 zkV(2LT7NevBrz@qd%p}*t$0vT^v4wN9%uq_5y^wZx77Z#bwCo-l!ym5hAAGLZqXl{ z=sY-f;PYJl_X_;sDII-!5(06A48Hh_b8Q8+O_{PdZz)UdAXjI(JJ@CgIF#}a?9x>c zpa@iSQFK*~csc`&YHhTwO8Y3s-N6-if>L``8FoOO72}}v((e9X21>Tc;YTu@>}Y&g znU&$7VN8xn?TB?CDzlOu9KABXTW45W;iC)LOUD@D3peR)9E_~9Kj7FFWif#WM>5YE zQ#|A&N}aua2F28Vu&(CHcm*}2v{Ggbap-29nFfBf_OLP=2YL|K303x1U(g=Wtx8)` zon4Hu9rYlC(RSc4AwiX6N>ruxG@~i3w`5*HiXKkyR4%LMBP6-BBD;&TQhSPpD>L_5 zPu-WXPnnG)d=QPxM6zm5P+NN()8)Y0nxibnOR-&U8R273sU%0LXN?6tjrT zTDu?Bl|Y-GTAB*NwU)V0Y3*^;EAyQa)n7-9sIvAr0tHbe@ci>6aA?lo6F8wyA&p~7PL&dQfH?p;4BwthVrY_UeMJo zMNPJrqH<-68QIYric*PL)X{=LQ;HQ2OU>L2Q&DP%I7BJ6FkWVMiX0Qtw4higb2_if zBh}P6UzA@vh2=;k%E;K4Vv*iXu+FG}u=IAalmIX7_ym}!SLQM6%-&3Tx+@Gzo$cQ%sS%? z&ap%az}csb) zhhiILO_@D~XH85${R0wSM{=cR&GewiT1!Qgq-N924-!<_;~hbiv=)Naui3?fTUuxK zLXbX(h{LzA2x{$7wKiu5%aQhkQu~roH9I@PR|zRKH9MOSqP?Wno(7-w)C160`T-*; zG5V;FGVF*_mL3IDwBBOYri69I7l>_}*a)5>F?Ail`M;x(K zneVJKTp&k#aC#g*+w)=XBmHdpxs(Y#(d) z?Dm!{*~fn(NK6~aiV;~*2FzOwx8XVs{+j|Wk~@sy0)b~EH*as z1#(n>Zb^|K=2@BE7Ul$xXq{<_U|qb&AHTs=cG|K$I;QW8DoL5GtxVrZ9gdJ(MX7an zQ06CkL_=M@ST*@Q!3o7~l!UiqF(pOxE0sol#5M)|HOYb_0Yc&$@8m04@a4!B{# z-BM~dh>m`z8}E0ts~lc};;#LLjVd0$diVXiu4#W}tbDAptrBh?uO_|ZJYE8TUYYeM zqWf2Ar@E3ehE?SE>_^c%S5`yxEkw@tHPXcq{jv6_Qp-CJRo&6lb-~4vOzr;1q^kVd zWG!qP9mMvyJ_TrZIcRXh$0=&984FkDn89GaQw2b~Kh~c0$O+(wk@HHaP4$s%FD4+4 z3#CzkuA*}t^agqhkUf^n4j_UmtC6lBR%A7BP-u3uk)?I!SPInZEZnu})J_X4N^Y3W zxFye_C1c*PO_!81Yo*?B3ZlqSAa{{D=`pZ>8P5=Jow`&}m>V!i9^|x7IpPovuNA?H z-ils|py1xUdLGd1@naC2!-4;JMk9>`3fe&as2Jgu#5P6j$vdx@eF%~za1D> z8s&3im_0CZ&n7}0V0RhT6xc0>(YFyfrUdqY(MUHqb{R4H1AEM{fxtR5EECvMhSB#D zIp0EHl(vbm8CVyFod))nVV8hW-(e!$1$K*JdBDh$O$0M2mea_ObYir+z`il888Du% z8kh{ROoRZ5F9etgqs2&kHmX30XANuj5K`LWRJz)G;tyTF1O z?Flfh=l8(4p1(;nD^x3|wFDNyV)y`yV%Q{LF${YFEQDc3XprFy8wt#l^8u^K(wzy6 z*Y8naDi-<#m>0u70`q2=HTv-|hBXJ)hhcqz)nroQfw?o{0Z7ncg7J3F) z0KOvJ}@qC6)>_(6JZN59%CmkF69U?R~C927>{uSm_4ZW??Prb? z+F6V=U|h;bVC5NY0x)h@^MHjjDKw7?WSFOgAW*wD5xjwMzA#`sf9rwqI@$w_*U>9r zp)5veOPxiu0#=!&<_e5U=>sg1@%;*n#wsSla$r1v>wyKa(A~gz8acpt8kd3fWub3@ zDH&#r(J^(ACV~|(o`yXz9=9nl9@iC^598|wjHi|aj7ymgtP~5K2aHQGf&4sNJCIgG z!P5q)^jiTgd)yHmPJ?Fl)42I~dwaMA;Cs1kZHkp5AIv_;TUt=qP)VH_*C4CzRx*4# zTVc}?H2!nK*P7e14@Jw^hrhAB8j;F)DB103<)~kFFC`|lVE5!LajZ3dWwD;(Zu1D3 z4P?2nYJSq%`n8Er9XV)V)Mwy@dUNZ4hbDRi-@DU`F6 z%P0$KxaLIE7*1QoeR~^6U}W8BDOP2~jN`-2DWT%FSXL@m1XG<2fzn{SIC(TOk;%g8!K0K7GD#e`E8fe5K`=ZTyO#tzeKr~H z9ozE~kWqz=7esy_>lM6>_ds|vqgsebbeX^gBEliFnnFwCk;W=nP_gd9p`-oYl3QVzZ{i8d?+s*sX!&uHGpF~SvDl+hB#N6JrQIkUm%+}qm7m_8FD zlJHtGzQN87WEwNC7N#`>jclb%Yuu&Sb*2dnZiEj^b3eh>&6vOnpxt8$m1X8>i~F5O z91C3LA+oE&PsZNHw@jPJY|TRjXC_}J%%@=CnPnrPkI^h6jnLdUMz+YLtFf`Ux3B>g zlVe_0C<%*cZxJILvak@YSjd>=lty#qnJ>%oQvvr4;7#EzOv(t(CS-}WpyjKuBU9lQ z6S+`OjZ`hXrG`aCg!O0gsHM8FvPYTQ3JUY$;AzX45+epkYCT2?3YHe#jIvEXnp?7% zq*iWIM`2T|kz3xrVKcCiflO1KA^j@Tj2q(UDiM#=W5VLGJDr(%0wkB0az^jZB?S*k zj80CD$hUVnYdfVNqrJ^7@V{dtu$+K+vLLiwvWe=SQvL&THpOGxBx>&RmsO8WX>2aPk zD={^aQOqc9nf7d?y18IdOz6kzhFUyN5t~-}hlM0Y#7D9;QxTce$So9yttN&rdLPgW zOXwLhgtB77GGPY0CnNo<401QDJgi-Yq$EeNXw)pXFk5cVyxQM4$40`JVyRM-EF*X^ ze*mfMq-j&5;+4XU1aG*u`~W&?+SJro^UkWjRb5jf@!sB8qg}J6? zg50dGtP45{aw3itO^8ky*djQZyD<_(qXAk9C+na>eWP2UkzfnuQ(bXaMj60^L7eEp zvO)b8t&gH-Fh3*Hn1+ej@Yc%)@2kvADI2=}igeUSPe*h#x2cJ7Rvjw`=%p;vlB=9xDV@VkWycF|rn}GA$P9MJP%G z#?rXZD3r~TvK}_n3%DamstjLTnYhN_qDs<1E%0%;2u{RB*(83trsA58YbLHaxaQ$n zh>K({##*KE;Y2?o(uV+&dWc4sE*-)tPn32J zuH(2UJ))h$Md3f;qO_XhQsB~+fx>k6m4(u!W>AfbKUW=s&e8^2jItq@L+7qjrIPX6 z2sX@L(Xh)$#)e(xL89Rhxhx+UjVJi9svPJqL8Bp(k4zdO*@FB*V%HzqR6vNU6rwkF zpcE1iPy?5bEZ^DMfqn}#aSY?(kfwVKb)aun%A&U<6@d9+Ac?&oTkiNV)53nTqF05B*$^&A_Oj8|j z3!o$5cEC1(y8t}_u`a3c0o)511b7mV`o2?u;{neA&ILRRxESy};A%jucxW~NUIDxa zcmwbb;BCO?fOi0CV3!M62Db1FurlClz}A3xexOkRegNzQ_zkc(ptF&nSqazo z;3z=Yh-NBaZ@@)>eE^pOV*N#P5HJkzJYXc?9l$8Sdw|h^-vIjq+M(-?2Xp}J2S{VQ zL_m7*l?3PvNcH9iXoUNCKnxo-S%4OR)b%$3TmV=ca3x?Vz#V`U0FMGz0i+>AHNaPZ z_JA_XB=B5HV*yCL26V!`C*V?~9}2h07nDbV&sUGI8ALpEnp+SUjUl}qRngE0ZEQGg#(6D zIADK3N{?o3GXX~d&H|hUh_nG91O0;njZKgz^I(H={*XA4LTGR%^Enn;@@(RN6*JreD>L_00fOyPTZx|SklDU_FJ zb`lN#MC5BL(Yz&^pF~4@75U;M8ZFxMG$u+k>LWM}mclSgVYfuvFVQYZw5t-0`UxJl zjEGqZ)g)RCiAL+JoR4}C!YqYu5-mugB}=qai8e-}{UXt3NVM4!ZJR{fCDGnUv=0)^ z1U{VS#azTJ1$s=xX_X~ffJEyi(FRJipC#Hji8e{1Q9r`vZINj2B-$s5W(q&g`7A}u zQm7}<8c8%yiPlk~Wk|F!5^a%0TPD#qNwjSetpxl#PnUWa!YqX<63t$s1xU1R5-nV! zMM*TwBy{BvF-xJUM5`{*0wh{Di54!=q9j_jM4Kql7E83{60IWqGA~CJ5wjHPO0)>}qifmu0S z_t564@Q`2oN~wLUb{RPz`b@UT_IFlkk3IrUyD!-GBzFjqi%*NNK|!rOE^Z*;`;+)y z0&9Bk3;{3$tm@R(bgp6_CpM=OF+ z$}C$v+R_H$kvctur6-xb{F!F@AxA~;gYA%eH(Vy{QOqrd^}%2MaH>DByNosve;+Vx zF#bj}j2t*QT@zs{{&r^ABK&>Iu;uv6`L+Q&$7qM~moGu1g|G!>baq110t?FIs`14+ z;SMgE&hVdZK{=RB$!UhJx2jCj(fk$U#%zs&rpk?3+}+YtRF=P>NsgZX8ZdS>?x{ON zhgaC5v2Ma!m$7tbQ7{r0e|7(1Avk~GmoHhyAyzFG?{~J)dmb|vo-dp_Mukhjq|UiVUr?@F+j>QU}a`oHq(L1=caB447T8DH_&f|6y%H#U!<0b97ppuxIzZ zh3bE|Hlb6`NXAGDoPWQ%LKE8j-16;@EE>kdnEGMz=89Xr$t#hRAkkuikBluz>t>FH z%v))$#;3XZ^VW*uJdsq#W$01$-${r1carOZIq(^HDqIe4`{jYQ3B`O`_58i_^ACwA~Vo z^2g} zi5OKkt+w!=#tpAv&_|%+U{8Rt2{92^w566u=Bnp#^8HgKftr9$LIEf?0dtV`?42)P zu=NX9y$F;iGD&p&LNk#*5~f3FIv_nW$ON<%?qNoV(n{0J9zcW8Y<<+wJz z4sfalGiBCjOydM}RpNfbEFPvklQo*w|Hh1_6%#R95H^9PACdS)f*_8Cc??6&+fQ84j@?$$>o+qm?gXCv_4{} zCEH=aX$cZ-jEGqYzeu!u677*hbM@!e)g9KQ<)(Ekxw3A^L*skm6_h#Y6v$B6L(hX1 zfud}J3G3nF8K$dyN~d7mll_?DYKqGbb-;f=)_r7R#Q&^&U1P_Zi|%nLb+e>$dR$)6 z6vz>9Gbzu^rX!p?Wq~qd3DZC@TNM6JCh-c9eMy%1qcV~`kfPjmL=!68;|3c|5;W4*scAus$7vb-LDdm zf_)l1hlawl0I5&Y0@{lARK;{po~Z{et~$cF>Nt&5$7!TGPFp6?{&o(CK5l@mLiGK8#IK1K8WR*p2cdyV&zY(?AbkSN1#H}o}5A)GEMKQvf#+SZpWZpkppyL z4CO?5d;=m)mw32Nex<*pSIA@Oa#*(aw$b(U^kk0qM$ri4AKW^|ewKKihpe&@W+A;k zJ!K=8&L=oOKF4zfy^#5kQexMi59ua2Q3%!j$aV^j9q?Ud=A6m_l5OA#jfO^=6#z+H zSXtAw1FQt-2UrD=rW;iOlK|y_R4w*^)Iz)B;w_Xg-iL5nA2F1V9XKsPqEX&BZHh#j zFVUz?b9o0PT8>1!Aki*Mw2u<)t3Rz60McQ*G8gsmuS5t8ks1M z8!OS$BpOY1DAZEOl4#iyjfTlQF72%4eB`CDNEJhiR9I;0%H9gZI+apOBc+eZuqWv| zDMv;r9hBLdkE5?q8o$=G6;fKcYfrH#cwY){W--6zu6>D-cR5^uW0;$C>o&XfG+91FQfH_7Fd+Kp#{q<@vA)ONStx-kd>b6e1@4T82INTR}- zZk!K-X6Gdq*TP-P-n_{*1A@nx*eO5UR+Y{+>kBER=*=#^vZcKOciPf}-ugL0FYM`2 z%i#qm?qv5RTZpqcauO`EXsOkak*#b55Bt&nlDbQ87*mwRa1luug1o>5>wjzncBd#eJ& zl~iz%gQF)6XW%3FPtR-XW|;px4XMUFlNW?kV-mW_{l0ElIhdtOr7ILCxG=VI{AfdULhYmn?>IbA6y*! z2l>u6+SA3O+6YzjHmT5es$F?2TyrZ)8ZvebbC^oB8WCk6yoVsNTo7MW=P{N-7gpvilP#rx8Z+M%Y?91b@A49Q3kCT`cy|Xl`3M zSk<#?U=@xV+F)c}u`t(PNN#D*<9(J8-{aa<(nW>8=9IPyl?C%>79kYoRhkvCEc!nE zB9_(5AuUxPL*+)4qrB5qaE{@~r13vwgyK(ca|u-h$)VCxr$n04n~GAW)D5JHqPq|Nal$iMpGZqA20+k5HK3B3t%E3#&zsnAhc1< zRNSL?(~!l*0WJVUOVm)cA`V-A>j$`1r0)le!TnLd1VC!PXyKY`fJuP20nw9bn#%Aj z6tD&0AV6opR6w%eVSv%9buNte{foe7-}iRN_&KMGVisBw8bhhCL7>A9g`73}bhRhMf!|%@)3s%d0G6SkB{bavubNRyu_I@o_rt z6a_r3IcW4V!_^n&%zyiWgKJ#93CAXoD>!k7a1&`qx}yPKsnk-WudsZSDQoy z`|!iJ{gdMpabOAj1-2c%LVzPri2bEJ(Bc^7m=A>6zHAKzM#6Gf-b4#(2O75^!Yui? zp3&0qm&$7?%)npHN4C!S3e0F|z0Ogky(&G%dIV1P=&KIixm4xsqZh*1qc0_Ou;x6t zz;h#Xh`|T##UxAwS73DID|{3x-m!qfyMu##mOHK#N#UAceE*YaIfgxkh(d@=2yUMe ziBq^)kCeY$DwldFIb_flN!nB?#_+@^S3~%Y`}`+5Ragw_ZmO^tEm(|1o`#w#n(yVN zo{}a@g3y-5$e)Q|*Ba8GEttraBC)SJ8v8(XbEFC^N>g^<86xSNwTXnTr|=z zSnr%yj*)&@cuiN_QbBxVx}pL&(}+?E0tH#)-bC|{xli5R9S5)Dq1#js?Hk38-;i8fQ>qvsx6 z-Y$u@PokZaXlEtb3yJnxqJ5WW^mKvCn=N8i!hDHFyZXd8h3+oIL- z-xg&C&sLde@YjkjFjFIP%s9_qR%9G_(3`myIS|jC*f9akI9n-GY+DT?<4|hZ6WTJ_ zZa7SWP4M%@>0YMigHv&dT$weO2CzG*Er}BNV)%I+MZi|bwKxM}9<7hF;M_7wEsG(> zXGEucIq9j$3z&o~w&sq=8W6^$)1HumIiWuEA}$l=mx39FzLoVwCPD}>>itYukB+_* z*fjjT%rL6P-VEDucxgbI8}pw=_ZTHQ zE;{+2N4oso3u?bMEUuNTDat+q7rkpijSjEAL@+t@8VGq>{(FvR!sRet$VB@2EA+%e z(Ko~t`DKLPeXyj!|vS=1EN37ru$Mu)@J#-5U7^mRJhupMB zpUW);N)LMZjqU&K2z_|rqNf7%?1P56w7>YD*9{6;D<}i^&9hU#cOASrnPU`@b#70Fs@c zWoSsRYXCKXXg-=TfD~^s;5tCa6gB|v0Nf3@A8;?=Rlt3K*8vX#-T^!W_#E&E;7h<9 zK&VnU3TOs+43P9n@*5z0050y#2;+}RIjyG{${&?-T7QW)LByVn<21R4!*a!z5#|$U)|_lDPVmJk^Fh8Bg!SZ@@iN#1S)^j~$7sA6>l$xu zWTAC|{TZ~Vj~<6DO3=)J|1|XeO;RvhWBj|>D$QT=`}JNzb3u;z%U>53iBA%YL9-*K ziUpb;u~73T3#EBMN3rS4O3}UeniVy>vbb$YG)ydX9kg!t`1c+3-|R%7nT`^ol5y#8 zqnCzxQIwGQBRv&dPD6XtknWrTDeFH0RsqDIO+&eC59k8u0Z0jT0Q3R$0t^)IyNdT@ z+zGh2aT8|A95bhdilLUmD2Z>ZL_;GL<5I`P7I;>emNKtQi+cPlDMrkB zI>Dw7AHrTfed|OW)!-r!^AYZxG`q2^=E{;}}h5X(Cu6UCXAX zth}UQ-7ggg&pF2^))YpQVS}=1QzJ*>Y(;;>Um75f!7++KHDxTY7=A`9jXEMX0V41i z9HSWX8O^?!kx&dZK|fs#y5oGsC9D*%`M8W37dbxNuQ1t55NIs6=6t!Nnf&zgQ<%@V zNhUdH-LEjYs}P7%k~Xo4Ri{mNT@=6pjDu3*7?p+W6uDs~C0EaQX_2l`8TpjE{*YYzrtkiK_E)Y?AHqR3p+-;u|sXy`IWy#F~8Cu z@s|k5>zHFywnL02v$quNWn~1rm$tXcpDnwOwIE+>M~X=ATj_pDK)3{sk%Z%nhL3sw z_d^z?FRQVUNTV>JW|ABW4RP_w^3Vu5ZRL^2<9&Cz?l~y?{2-27mWz`Qc_>?huopxI zc|sJ9JVq$r*%fY2X44Z=>7R4Wa6w70h|(WtdCjB}mV!r8a!6=QbW)UD84%zrXW5YR z_xR<>@!+9Iy40IAauk|0YNESGD2vsYBvArFU{XY4Lq*>RytbT=iYfWh^W27ReD4`P zYb6vUILkXlL?kp+#6%B_K+f>rGX!7B2$v^C#D(K|zD^00FP2X(K_Z8Q;xq%Who?jk z3!O-f)8z{=iF!l&^01irq=@hW;i3>BjJ|Xyr%$R<%I-ei9)eEA7_KGYi*=MpygVi( zv2TREpz0eJpBN#pscO+IT+Ut_l*dORI_GQ{8Xumf<6)AK%^w51cJ10wfftUUy67-e zu(PNhdI>q72JPXM@8pK+h`7GVQO;Z>Q_T+n^5{58D>WUR^3xJnnT7mHa25g*L*kOK zjMdNs9}uC!>Ph`e*gps+eL} za%@e6DGPoPVG%HhaBiQ-BD5SXr|+hS#u^fdZ&vDxE7oRWL_$n7;(!yDke?@ftpnyy z9x%?zxU^9@OiTo~KtHuduumr;kM3pSeW160ps%lwUx0^uu&bQxeCNQTIq%JbbJ*M!c!4- zS6q*W5`l~Wm6wN4U;xiY3B7PhMwcIDl>7@%)21zhMRkkmSnKh)DWKF29s$8jS-d_< ziQ!~}O~w4%=*JQ3!XMEBy8C+QbbxU*vlm~5Uw}%X4)%lz=)%er65r1wz>hQWbjyl7 zKJ8J*9swRr9eKISiS*8aq<#-SKOaA4Q{_cEoPv5W~CrseXuOTQHqw zJe`UnJFlzyF3i`%PZ6N<@n+TO zF4bohUAV5it$9AGigdCiYG%5ekgZnJ3)8iUKz|PuKi}5n1>`z4<#N#zvik8;cz4j( zV|9_v^yrI5qo>0fVwk_bI#_HoVkoaO2Qj=o)Z*^b)thM!nF;jrV0Bbe3@2NF09_*{ z^^$ck9o7GFx11fK+ZPnHf_xDivxhZujVe#vT;X1o%CfZG1UD|=(ZcP0o z*wZHvl3BcZVz{C`_hs$7BXza9y~3>%%X@t>oXX~@lcDhIfUc879E)wRQNegEc%B-I^Z*|p_(|{Xs91NEAC6!0=i!cGc%XMDZ>T%i$CpaR z!!Y<@^^0~1vKSQX-`zVv(M{J5n-)m7xu`3rg7hX_W;2oA0jh)glq&BIOgGJSX~8Z$ zygR78Jt&wfm+Z8~U&E0t(ItvHXsP4z@cyAqwG!zlb{GA&)>@?N>bZGKo=0b$9I{al zzX0?N?bRM$ET1m=VJcsxhaZpAMx^_Cz}JhN72LkcQ{~2*s!m@&iF{-Ou>SzmJj(0l z<4%eY%h6WkVfL%??xIku+=EdQy6|>lI9a^Est1~0H#ZLtcXS@S4Y`Wp)Q+j0iCSVd zsu08cNkd9rkk9@Zp^&sZCn-~uD zd!y#rNKa?$-Ni6(A6<7r!m+TGJZ!8I>>q&s*-IC{mly^=66oiz!l+T zsbBtJJ(*5oI(YH%!F5pfdD>wtELg38R_h67<-)Pq zkJhcQgvml^FfTM}r|8;@+92Jzx>C7%2*qf@R4CHS`iIXK&<9lT`2xr;DVUb0Rd*v? zFR;eYNGMiL5a`*X{*S#TMc+K2>;+19$etx)njmg*%oLgy8aIqjWY|GA6kG2e@e5Cn zcrX#it5~`i><;|rWzsx_A5qAs8_aKFt|HR>ecU?v^ANG!V2<)b82MJ6&0wDLLl_(H zu~`gnub8X+C0rL5a}_bHgTFtSnqEB2QN%E2ZPL65^AdeJ%L=u9%t`d=lnvH)Fc%T& zaAtbt#r#8}(+o-1Ph;Nk109_X(+}nvKhn{!(CkK67R)uI@XnYM>BdZ$UlgEIN?bRX zSLlVYEVHyQpC~{N#weNl0?aGKFt(16M{S|B*cQxTOQMAYC-cT2-J<&Q{0z|+Xq5>q zfJ~A;;z4b|0_j@f>W?X~vtV4h1nPrm*geMVknYRi&RoD63P@}P209?R9E*9Sh@K$i zkv&6%QE?WRw;@|rqQdQ&(k>yUosNj@3vENJ#j&rG1xLh0#L{|_)DV9lLq)Ihs7+c! zCU29xEXHiXF(Elo%yTJ(n+pkv5d#HQ2D&dL#Nh}gA&>GvWv~HF_rv^&UX}bIv46^g z!Rkr(O*YY2(VLfLa8*UdTKv7P_##VUehx(f)6WvrFSR##RMwj*J-V@W2LHkC)t~cYMS}*GAwg7>%Y(IzIRZM)SuIT*n8$z-R$})K&8F3jBdSE!a&Qm%<#D4eD33C`(V9}4zs@hBo5&|n+vsAbwm}brgPF$YQ$?(OR6zQ+xT-^IB?aSh z34k?l*9t?1OZQC-iIsa|@j2<= zd|O!e@g?1Ns;GWyA^qC8ULq5u{~Ewa|Abc;@eN|RcwL1=2S>()^iAUSL^SMi0*!r+ zkCl~Z=0qcH(MOR*A4l}!M91oQ^8cglOW@`@vQ_+H`bpZhva6?2<+$k;(x5xkc zJ?Grt@BU^ch5xf}KAmRnx%;{2o_p@O=boGG%MN+)*@Uy}L+KIDS>lYAc=HIyi30=> z8omqsOth=grMEK90&D?c!ZM%TPa5D{JsWWM!M>e5(~Wph8aODjUHB%Rt16Q1&Ov(? z;=2Tm@^O5g;rLu>uh4+>Ro6J46=1y@&Ix|8He+qbj7&iN%z47Kp~~y0tqtL%h&mdA zgnm7m`ZrIAa9$%XkgEK;nEk`I#`<_Nev_s+UpP*j`}ni}V)U7Oza;2vZ|P{m_OG+H z4dY1|eBc|btIom7LKt@da@cRjkJSh1XwOzTB~w}^tUSO= z%6TxX{UN>6;(uPypBc+3jO`*nz6fylsf;d%6ts);{G~|Ce$hwPlA^p-j;vB4bBu!0 zx6jyEVb#N4NOo8$?)TjKinTfhPc2SWxj3xbu{gJH#5x_qWrtvTJFL}l_;OwUv0lgF z%c@0Azv96L*m;Ve-qaC~e*fY~}4jd@j&>lqu{+D{yDJjzg2t(2`J zxc13U@)P!-fB6Ln@g;NFZicZA$b3v7 zg7fiM$RWVDT)JTz&OxSYK|Ey=#X(uniZJJKo8@Dfm*KaogY&%v`P_W(uypz5cUqqO z^1A?M`D-m7%U@?{@n?T=87K$Z!})HyUquPd_Bcq!v)AZVd5#HkHlB(TcU0e>66w&3 zn+=P?z8=3> z*GlyL;-WliY%KB)6DlzBfnoo3PvJ%5R6PYrg7OIC@FGG~p2Vf$H8;~Uj#K7{cjcvV zrVA*e##?_wrWYO(EyeAp6!L8grQkXn*5 zivWo$$%~^$c6LqIS3loUftAJ5i=P&Z@$|Wv9>PC+<9)>S9@7ZLI;dduPWskoefu8z zHuaeH;zeQ@QA8BY#`!=QQ_ht%%HtevH~J>-e4PO6D|H$Rbk-Uvd~5)5<$)E8@gr?l zA@^+ZW`x;3((@)MljV}`eLNkQ<~Wvv$V-}j8hJ_6ufT88bQNg2xGsU^=SDNbJ)_%b z={u0wB;2_WEI62&ucvy4vb`Z=mk@F+F+8chLE10Ytxdy}XFFiU&vmNaZ zVWke18t$1ixXN3#)wv!x&o`b&81!S+aI>BEVe^8_*w{pRv@bn6?!zl#rjo%9G#|bo zfUQb@b~q&kX**bURgm7)&%IC@_b||2!d3)*ncQG{GzHtHaj$JFefZ*~Vfuz3$7g~2 zQ=8MR@1H+ucisHlyD9N#VJF;{jK@RuY0G6UGa zL2@x%5q_n?MGErZqXs8mn6UjJ(~kvXSTis-nSRlyVSP=GqCM_2DRb<_&jHS}G34hw z`!fnDF3;Agp1US9J|?rm3u9hzZnABh2T9D$SCl9%ZIO13_vK8>>H1B0(quA^BVZv^ z9I~uZc{M|1KN&Z|z*8~sV+!IpI|>(CG$$+m36VcLeU%vmDWx*kNh z!2Z-;Xoz5k3oPo-5kY@8H4M8n4~KJDK9vJ<;1JC_)_o-UL$#0V&)k64XCvuNUjCzy zhHuD=)fEl%ytt!-0qD_yfK)m+W_nhZJI{lo#t;X`gmCiB6ox&DJ2s3%Q^!ZMxa^AP zsISLCcRN1X7q<2Ipck*D^oQXSf?+&elYtT0WC%Mk0Np{6GB%#gfiZ{eI4Kw(qRI<~ zkm=M&F4T{(?UjC9&k!P`Hk|C%!Blo+Xj@d?eBgc1OLt1p(>sQDO5k#DVk9#uY8$Ys zu>Mn}j)@$!PB55@;HL>~r+WJO(m5D5hW$7ldz(>+m+4Sg3uKRT8m7?J*=V$V&TvL` zQ_j(8M@=F<=lRzYx}H)t=bQydbUZ=vv#~)i;vsM?O2@TaxC|g`DA$l_D1d8-(@B;g zOs`Xv|G7`#Y`+G7nf6-z%}-ke9`2{zZfUQxw0QI92&|#9$6$F?_#LG$30`gKZ?N=! zJI3?Meyydw(bD>5v(2YidhTUt1$?umf87-6tMb}%i>1HS(jSGkLk^O*v-~+IKi=Qc z;0=~%hvms{6Xgl^mw(x&+bsR0m-V3~xk zKp6xv{2vIfRGyUzU7#7fLDLn$+W;rq3nQ#fmen2Ld8`3k!ww^LKEEDu8>s`zTbJGl z_#k**Pd}x5<@Ij@EEl#Ndmeo%N^tNN#7zc0gIl(G9q+nmE|9ihTHdPp# zsXFsw`bv8JfZ_R2+`%Aj-)DGsczBQ0*EgE($3`L3Gc;zj^IpKqIXB07w5#;Q{Q%B> z!nK=aVecV1$8Fu-4H)(SsSs-OkF?kpjAyZZmR$~c67kh7=id|Kkn9kpYbEjUA!!#f z;j=M_%@pZ+46<@1c=)uVK8!q^n;ERZr1e7DktJ46hNX}wh!RMb(YYV@p+4{b7|RC! z?!;ft@fxEeo_~Y0fv+hYF1=AIc@&K?aVrDk zq`IaEPJ8XezzgBHlo+Nbe2KwJ^5D(}3O=yH^kTS#@@cO@{W0728MLPl0?)|!&@lVC zZkY>VD3F%p`B}CdUp}Z=T%W+)Av<*e8OtYad`QQl@v1daHhLu8gT9N>J#@q|y8pkR zb4UN!>yG3?@{joTpbt+)`VY>*oXtVvhnlToZbMO z4urG-8zf<-LJ39(4o1sbXV>6hu<_|sSV`buYLlZnI|qZ=CCXwl<6{Z=k z#XxARjQ zqp}DOY%9V8Id~R|?$i{qQ~~Z~Q=4!f}8NLGoVo+kLiU5BWml!1;V1@{soE z;oz*I{JDSI2#x@Ra`mUs?JAqg#2=o=oEY$UsptkbMZ6W~^LX$x3eN+6v%Sz&3ja}l z`xUS4kh6={iS_v3x1Hqqx)vYGJzquLU&Hq-^rSdXf-Fi>QYLr+k-twn?=)8b&Ai_OG<*0l>H8 z?7Ke;zu@Q|$Kg=Sfd>J1pPQ)noMIdf8ZEghKuw%a-$wlp;d?F`!SN&RIDT93`l+t* zwDuP3GUMqCud8nCT(YFf*6(CM7zJs^&lwg|dC5~M@w|Vg@nxF6w$}LnG>xz6xLo6> zYZy2EG+Zv>S}X%9M^tG1I%ivt%c*SRdYCp#eKRD?Bk@(u&W3!Zz~n}koc|muVYw03 z2Fq67^b+`CT2^OkJFfhB@L2++ zglXum*V>5hxdM}RNkYPo5*WsyJxX`9!f?Ao%bpkID5O%DkbGSM#%Gb^- zU99hTf$=7omVJVT(I^d{sNw1kThmXHuo&!1zbYlnK4|)rCCv6~c)o;T*J9 zF7h2@Qjzbz1G)tB@{ZnI2&@UbxaDB+R}|~c*}scAzlZOcm=8}H5Bmnf;CwNjbQ9(> z^s{obLSDdmvm=nh5Sj0fAkR+dFh-64P+r}|a6j~iIMa9Q>ieJ{8Nu@(^1!vp4pm6| z{-AGsCdIhs zos76UvG#8D^daoa9>V0%L(3rSZs5y1mco`g81es*XS2!hcQu?Eg9PGq+~moRfhUiT$}$p*V_Tm9U&a~FXev7< z_+$E~gUut^ts`<|{{-K^PuZ`rvB9W0E+BHk zdDCpY*#3M+M+3HlSTnFM6n=u;7eM|R!mwOP5Pp%=c;;yD>}r!dxQ&D~yd;c^I>z_$ z)EHn~XChux7Q#|(NEy3#F)bb^qv7A{kxboH65e%CrTnI6|9Uj4DgT?$u2&{t( zXLvVcP6Wecil(+|Ea*&oWCYhM(H;)wMseZd=;P?9C|(y%!^6=LyrsUoGo_J=qj^!B z)<;sZz8q5!S1%W|9Da{2h+p5_)Y!7d#UGa+kL9}2)}`a~_4ZUlGN zEv2nh3a@QTc|&4lEe_-SA<^+#62`@w$^I`bh*O*`^Wf09$=EIrVZ1k$s&BPBB2 z%IgvQ{5U+;#}#2*Z3Aw`*W-3@d%e|jfyUVdPF%yat5lAbFO0=U`CcOMNZz|h!lKa= zdGBJA_nyGogGI%Y_gqNjy@R#~f(PNj4fxu+_cPS{B)*jSs821_`BJr%8WZysp0Y+k zS^Kze`UUcH-!wm_XAp&m$V5*ez8o?Y?>MoJB>MbIz}yGAq65}Jx#L$zpTzevDD3ZyBIPF7K92c19Nayi*Bg;h zoE&;`pvT}MVp@5`;i;b7#_$5^uMQ{kCICAJdB-PuhUC7f<^46_Rl$`L+3_@vGtdQYZDuuI(#5IQ7U5-T-@Ln8jz@`4#)by*q9hWN3io_T!YlxOaz?*I$e1@pN5G zR^Je0M>CsJ6q<2Dsq#9@+8B%t^*{=O<)_GgxPz4Z4chNMgQVaoWF(H^Z;_U?b{#Sl zw|O0>zDAH1nF!{=Ky@7d-=iGTTyYr`R(75eC=4Ml^_k=`@PpV44;UhtF`TflIHXyP zX>a?pq{3^f+p23Cn{Z5KYjKIo53#MYsY7^SslvM2R<~Ez)f1|`u1w(+-gwjorw6*8 zO;fnI3UGX6y1{q@ob4*ta7TR;{8CtX6$)Eb@7>=%#DihgY=IX5;g2&EUftHlYo*$r znLf-Cv#vuGu3kSZ?O_T-8|g|#^UpGvyHAawkUi@&_(5EIOe_on^#^ay%2JJg?MI!@ z;(HQC^z@?qtE0N3Npykyfo7;(dm*1=wAdtti6w*_#dWRJqo!5Ysz0S{oN3cNv)p}) z&c71Df1{10+vo6?bj!2vN~CjV-+wo_v*Y|5!Z?o(&%OSEFnC#bkCghm*=El-gCvd`|UtqgJG%?ZGXBl1St zjwBH#j!G=OJ5O}!qqOjcXlbWeTIOS&tjEt+j(9&`h2=ZM@;zv47Tbdr82jc-pR-dd zMHLo5?Ed1YG?onwYsoZ zX4(*rEBhVpej4`5jN<{Vl#6|`3yYF+NpnZ&uLk>M#>Mue*dIr*RA=j&`W7h%`(qCd zHG*7#*1ltZ%(zxABJS)M`{M|v4HP_Kf2`%;f7c)Ej|qdvr`q}^)X_Lr2oQZg~MF2XAVh&FwY zxgg(g-KfBvnTvM15B6=u9wlD>5Z=x{A7y=}_gLB%=kS;F8Rzo*=TD(CWS2_>v+bica<2}B;>{rCL zb8I33AFlkYI^Q`DGo)aQWd5!0v$9TAYPNarNaP;Lh;`~^ol?JX|v<+8b@QT{N5 zQTrk2l5;-@+FIL|`us)1h4P-jDeuXgEOGf_a-O6qBIgNQ4ue?dG|gKLsFXEb!=WFg zat+Jj5Yty^xVE(!-pI^%$RP@o4J6ad&~WI>20n2`_BsJLV!yrl8U{IE51P)DrJC$@ zBI-PeUtsr(HvjX_3z+7`(LQaTBVr?ca$fBS(zxxSbj0vZ%%jna-jC+|*p)Xw_6cv` z{7~ID=f}5%heUIRH2hG|gP!m>6BrxTGfA$SC!@XY^O#_?I9-u0=Ue|TLWbgWIX3Jc zMu#B`$p3_N+0o1cJi4&p_$C4k7t*D`>l>O{jV>kJP;X(ZcUq1|r&#X@E1*;8h6xYp z6l)#BF}lMVM_4nwXh?ln;}~wQZPR@T)-{G@g;KhdF!i7z4C@)wgtUt_jNy=W$pEY)cDbkunU#}D;?bqd;Lniry7($Wsv`Fi$^q)X5#R!`;IRj31J zMFsRt_`PDw<`KThh>W{0m>3^eQ9SO;Lg(=~(jeEdGtqAM*(aEdXxOJg((qY^hdN{^ zPQ#<)W8Pjm3}Im6b|s@Ab!-Z3uJX*OJTRCXIO!bbctiKXX#rc|ku=ZgST8tqa-r95 z=whaHk?2@LnG`yh+nmTAWLxn(@ z$bU;w|1x}!18QpUIJzx5W%=kdBHYJ^KzO6u7;%q+B7PrZRdn~z> z7J6v#0YY!wKV672xPK}>XNRvG$GN&YgAGH-9r<@?zN`~o3~>+=`fW}G0)ulhY`Q?F zsU~4{m#wnTC{b8PR}DeBPbu|bTv9xGFVi?UAf!%S%a|6zuz_K{R?c*V z!}FvZrOMufeqP8wUW&f6Pu_YF2GPZXN9!!r_`}7h^Addd?97F>UJ&NfHp8WPdSB8h zbz>59)$QFaVNc*F%bbqN=PAZPJ;8K#nP4ns)KIo*gp zs{Sh4S7OZN%%o6X$?Cm+MnP%!-@`Sj8ONtGiBdK7@JVa)3v)e$)2m7Y4le84RgaCi z9>#IA;>TgmhjI0-dPa^pAHr%{>()D+1LnI2hb!pn_Vvyl9`n8+&gnHU_ro|a9Qpy4 zb+p`rQ=84TwZen>cJh?v$tzlbQ=%p$h;_@tAP{vBc?BvlUV+C;gEoAZqW<%2z7pp1 z3eFc_pG$cOz6=Kjpu`~lcuq!{s9o|gFW1Cqkd;w{Bp_o>UeRH7cO(6%)lL0r5b&>Utv}?~ z?v5qp5Xu+)a_p&-=5MYT8<3v;e!2CVzuh@O@w10iCQE6CoJxPn_#bQIt-LtZHq_IX z9?TB)9uzOf^Yie(zOy#bH#)wd50@YDH?>tB2*&JC{Pdy?efa8G zL2~v+>vwTpD>M(sSx}4XJzpOn{m#d66*@@T^>MrjVd8br>T>5aE*<9|wbNHvy3Ll3 zzRNfl^n4)l)s;cK`13-u1|~*AA4)@j&z3!%K*ipl^LQ9=_py0=z&??VMv#Z|q5&DH zKOewvr$5i(H`j{dzD9f$<*yM|ZMZq$m_+Lhirjyx^;zkYr@fK>1%6c~26}N7-}na8 z%q9${Bn~!)w#oSu^09qbvXkS0xzD`B|8M)I9W{ac#6=qld5h^;^Z8mg;*0Y&+8#ta zjPr9|ATwBa8fCQO?fise&AEzu4ZP4H@vlI7`24^*x{fK+d>TBp3j2ce<_MNTx)lLV z1(hNsFX!UQ0FUz+4%0}}5DbL&v`?X&HsO!F1BZ(zmX7dl*(b%}Y}-cRKyiK6pxEC= z^vQHN&$k@udos^QDEanwZ*O)b!aM1sPNtfU`6yt!2-5{r`ouB6JHd5>!So&cV30EL%CS|9)@XIZc)#N@f1Ll ztxtTImhJp3TK68q+f~v(o^?id=PK42$S2w_47v5eG|U09TR_rN@ty2VzTDhrzQe}74$2FH@ETe zAK+MJC4=K32-)bl#j7pFh3zM|CU$49jHAJ+Cdl=*$5J&qCX0Mq%gbkwaQ zuK|2Pl2#aE;x7A0(nnQtv~LULA6tV6YfIveozW2aQ!a^@(aaAE@im#$;cqrk7&JdCIpE7s3>aGTdZv0Zq9`qv&Ty)C;c*XS@MjHlg> zw!8^nJoziQdZXd$df4WZZ%s!ZAax?2-s_x&Fl7`X3%&wja-sZZF5u`39efMDRU+IL z49FmxYcCmlt|#!n#j#f~yfo2Qn4>59CEG}Q4&nq=K7uKy;5?!aUV~ViwBvlFyG8Gz$SoH3mA*@Nc)m+13+xH~#`3aY zc4&)@JLB$#9D|njV?*cs+)BGx&R*$5+;7w+fIp%Bu57|8?g*ckD4fTnx3+{dPuk3I zC!SUxrqQE!_lEH91aZdtqV&}1Zb*b})EJxlt5D}F63(X>4h9Wgi9EL?fK%r#&fx6t zjs(cwvuoU$ppB^dXeIubW>f+VHm%kXmv(m@1k2CO_uSlmZTJK(dy2m8$D zRX4(wvX*LDFGsj4$@N_Pipm&Y0az{>`Ltqq7kMuHj}c0Ikk%h!niRz7(H?ObK~TMB~KCb0wq!%p19Fs`$JL@bXdu z@ZQ5PUQEaJCdp;>z8&%NN}c-|%|lpa=_b6|I3jIk*$Ya!4)pMCPl1u|ttcgK2g3ae zVJl0;&yGcCd3PXxL+R$xUf2#1FXW56OQ~16Qp)0!+kx?wo?4DRd;Zu6TTo8Y7+ap&1k=7;hLVA7$cQKM zt8=2d#jd^y>*as4Z}zDwx4w%Q?XA`fW38qvyA$aT0WNRFV$1b^8h&&A|3GLnXAVeW zGM~X{@9UktKsTmJ;5=Cn`Z0yWzRjMp5m^xWu~>Q*MHvw~U4^T7N3f)aK3Cyz8O}#a zA&b^JdtvBv3*)@DL9eUvb!yuHovsUqM#y+=x3ztHGa{=P(!N?F(i(7>=<-PBxpI*$xgnKk?*Y^&alvqBZ2XcJ#i^ z+cB2Zvp0K+=qRl6@j;W1M6^?02nk7al6Ro~ci?*#=&!i^Sj#&Y&Qg^G=>tS2Ev}2y zUa0#7`;FAj=fCy3W3{So1=k711Ym+}fvN9!AXLpm_Mh(UwchP;2eV2vOrPmOQdIMQ z@J5#)FWhUr2X(&}-Vg9izlG`R@pT}hmG zeE{W@N4uy4o_BrF>P@30cizahKyDv%d*$~_d0c`9E>Db?1q&waAXOxwpnW0M*;qSW;KQDkRz^0&oq$l(*`BAS9dxPVE^u+o; zhCHN8@=WR>x%TqA0Owx5O#y5kKoiC8C$-@H1oiwXzd#hl&)$Tb@hbVC?2W<@(sNw7 zmXo(S8+DGWYfGd@E(z{JTbcgT_{;Q8_w3TUzfqpj;Io$JZp*{`PQOpv5w01ZLL6>Y z(*{%4$Il>K4j(eOP$OzArui?xxDOkK^H8ds3Huyi^SpZkT$?I!PbUi@i}8v})!(?Y zna@jItdD!05EBJ>X*pQ?HFg6tisStS)O`=Wc)LLG_(}XG9wUCyP+MKwU{1B1e#T&O zQWNURG+jqSHJ)w7+Z&N?W-rQ&>ngl5i|Q);cn}0=nr*!o<#7G&ghRDOHcnpx3_Cc; z(6Rv)95Wrp%E3eqAgyvvd|A>n567;MR$0&eR!=+XDSih}Sur>4(I5$*LSvuZ@BGw| zA8@=$1EfQKNrw#6LiuZ~2eh{je--D&=2IWnf!xH{pi?}HaFPdxC@*QBVLc6Sb4Cy^XsFiho+wzXsm^_3q&Q^zMALQgs!rSLYM&4jIshQ``@(C*rd z<%W8w{xiCK1oeLh-{VlfkB{QGq@1a=>ZD8w0hd=9{x}Cg(`1c;C(=+=s0&gU^%*O~ zw#8ErQ43+XCGJ+rSuqqL>7Eg2d8Mo}z}rMmG66@ZDw8k|+e$mOM?G9ZpE6}zIZqx# zTIzUCMO)bKuj04Qvww&%+Zm_1lHf;xGyRV({Z;VqLwcY-1?y?gri}7ZwiRc3SWlH6 z7@jTRp-`{Dxin936P>3McD%r%eI?hEO0LzO-*>`RI-gCpR(~CB+9ZLC++_f=_w~&hD<)~A7H&u1Ikd6mmp@n-oJVh zWpVBl-wSjA2Se$0^;#!Qia}6{cfKW-LlE!Vo9&(z&bJgsqYC{gd&i`M%fs(=c-tdd zv!6nH^44s>+~TWtECm_`Iwh`tiL$tE-;xXht`Xed1wnmx+v2J!d0th`)@?6h@M_v5 zVn0YbUHt8`d;dv4AEVug9qMAaB`)5cX66}@J2QD2?MP4NpkzSB#NxVTVGymAw*K1M zx)N=DMc7uF>@TibtZpQ%oepLVFx%o}5W#Ef@$RziQAvT&cv{iti(Z&9y# zdPhatxF{Uq@^{w02DGpEoo&puacDnMqAybmjW`H}Db4)>Ws&BJuTwPH5#@o%6eK3mb^<>SSIg2i@N`W zFYQJ-Z=W$7%rCl^fy)!^y_{&$4nt|TtxddZtir40ax(1XVh=9vQxu*IJa`M8)A9|c zXs-P?+5q+lDKD3zW^9bdtU{jo(1;G6Lmv9dqio>b@MZrq4Ea)GzuT~Ss*s$@pch6(~;&9 z;A1h;v2SGu>>Ka+Ng4bheRKMmsc9;bli7dl;lr_IJ4?{c8D2Z*$sNCV9c<@Jq&W%g zTxRV&bGU2N~+NW(id=OG>OItyXaOmUjyy$R45{p3osy|B^Tk(R&sT<6^~$;cnl z-?zNrT#v?qczFu*19y}9a;E31Lc4Jf31Mtp`cv7>Mu&tSL*9{rPnAunzR{rpp<&$z zNP3E&m)}G?JVW`<#;7Ns4s6VAGq=ib$ z_f>1xU(m-uY}j;-_?L#qbB4dyNSJ3=8lRLl^ZtT{OC?OcrQr$*>wN=`?O_t;{RWMn zBVpcW(C}OdgXXNhV=e6JJ4wUXBI|gbEaCC=5T5_h{jA<;m=E}i)$yK!w3JitN>1s| zIXf7h58*8zI~yuK_OL0y@mjB{Ok6!C?cw#+Rdy=kMLJ=-tZJc)0 znTC&E;Dc>G9bwj$E2W-ac^Bs>cE>SW$+M9Tc52djwvYS3$x`!;Y~#hgU0oX46wqdE zd#O126x(RF^&GFQHK#vjnr(t{GhdsQ{!19?l zCw5+OA1C8xN#|&Z?U>YdapNRw6Zc8*J3E;p#OmbUzbltKayR@U^x=h2_vR2`d!YZ?3c1;(W0`lOez`{o zc}W&c4Fk$VJLFQN^k0|E7- zU}3$m6M(^YM5w;)wrC@R#`Kn&siKwLaAv`ZYB?0@l^CrloaV zOKo##3!vx9jfkUy21X9_vx~XLvJ8)ilLLFXW9sxH)u@;K%VZ(Nk*4&46$!e2)gTS~ z^#SzDof~pZC7*NsVH$*jI{amS>hYKT;T}5b4_`&6%kxxYTWxpf?@0R<##PtW*2DXP z+vAfy!Z_&w$EO5MV*RU858F@8ZhUwg1ib*S;{0krTK41BUO(7=jtk?WaVZHdMVS3q zgTL%Yas8oC1}hR1EzZao1XVj3gl&b~*E5{K%Z0`}2`d$yw6t9KKVh=Q^UX-_owAt$ ztBBrrIR*W|8y0}+TN_;0ThLbbsZ^>xVB3h3R^%a0-UOVmzs=TPH_pTladR2I#1C=B zac)PL={qdFqj#n!t@F#i@EhT^EaQK;Lwz-A`}}T5riNV zMZI9z5tP?>uZc2W4!?;@6b~DEmHCJRXmW8*r?LR!p({W*8ut`3;4RXTzM+Z!bjL)m zzAmQg+eXA4N!cNTB^Wfu_Hv&00Pa2ulrF-?P1Rn~MlbTQ@83h;Io7X0m~+9=26;d~ zV2%e6SEP+J{xbc5r7ymg$xKl_QiwAN3cltWPKX0|TO8@PcSRK^a=s#KWD-rxNWGE} zxH)jS?AH}Y&wl;b`ZZ|nbT$sIUqgV$`&JqZ1IE6MSe^s$1#aSKgzBN#Am|~>$XOYu z+dZ!<5ytq7|5(aBqz4^;r3XesSETg7Cw)8_%-$OsaWr;w8xN$II7jRK0 z*DhV3qPWIY&8>AEjqot%Y&6I?{P?bxFol(&YjBi?3mMXg+@kVKJdXY4I!C@v9=ZkX z7s~F$@nJ2D*rT;NO)aV`FmzrEAuBW=8~lIdIa zz!~WmNw8<*8|6>{;4N{pehcTy_Mo=C$$KyTRmgxhM$xFgapy;l_3v;n)5~zK@04;= zGRxdt+2z@3T#5GVX4rcNo%!|%ERrDzyIWv!d;co5eXrCZ3U6sMVfR8V8N&Sz*&qY= ztef!ra350MXzqm#fTt_`GWO0;VQ#@ojNzW?e!@)M4-YoDdKi`S73i&*IMs_fQt1Kg zn8N!btmmuXY2z?d$2l{$vhnw`zefL0S-W(Sk{9Y_T?1N^+c_Ba*(YzVzc4M3uC7Bq z?z0Yo%)>iO(2yiuIr^70v?)E3#;eapU&6!-!Jw{Z_n#PBt7sp`6#0;7Zr+5nJfGSCgbjo|hI|lp(BoRFu6|WDJPw4s#*f4H%;36j zad{$N(#kI#T=y+(tJ}A{&TFfJGoudeN6wBp$M>Efj6@iXaLy|(xD^?96}ZfpAb&~o8_ueWx85bZvI z47GWXrd**6B|)Lf_}aFnL3UoYb##5vwawz%JF1=E676FIcjpH5H4s}oN;B`xuFJF8C%c3j}HYIDq8y!A24+;~DhEf3zAGaAkUJ87;vvTS;c|+CN zvYmpEy!B`Nhk0f*-eecz5!sV(0^EHdJ8?yt5|5mFZ??KuAv1jx>_FK0DELqO=DI-} zSJHs)EY>tMSHp36!5+oIn;SbMft#GVn@BYgZ`mmWJ@ie_vS$gDdOxO4HLK7`zKB zf1Dn|I_s<3`6h~{Ef3+4PvPJizN>LzyIpu{MHq+r^5PB&q-JwcS#ziBX5ltJXKxfp`S)R;_NBljQDVM`+a7=S2-ggE)43hA^FCMS5vtEggRkP;anzlSGaqo7?w!zAbe)V3+gqNXhkhX3J_Eicct2GR^9W=9 zO1|xjv2)=C(2YRU4CQI2snT;H+m%OYSBO8-C_kDTtmK~CyMsI*usS(A5vfY*A*?~$ zB0$znSd-{3$CeAw_6;nvjXwYJDl#8iVOq|IPOQOc_&uOL#I?O!{A&zk(nI~B4Jq%I z;(RT3w^Vfj%&KX5;K(vgM!7jTzZwd0#Ja{KSnNLJGBj>77?49Sy;-8TA$+@od%6t5 zv3Jw-aOFzA&U)#41^c(q_ll4I^O0vK{N9XaH(_h2{l5^fUBSR4)Ge~{Vi_v|+YS3Y z5`!yu6<~XUOqQ=g`aWHn0KXgiMd+DvSzC2M9Ou1)e}MAt@W}g2P5<}Uosj*x- z-4BNv!*IA0)jjUTu^QKJ&h<&LZKsKxX7=M?zmEMiO|%N*ZbF~s_2>ySo1|p*k%#X{ z=)`um{Di?D0{N?pka3zo!*_|F17TGHYs7rtExx=W81oO7$a_{oV+`j?7$1jC!bbp% zz2E^t>67WUmyBg6_$Wgj{3ZtvvnalpXGa(pRv~R;+|ClU&q+B~4n{+a+f@Pr5H}c6 zS-YLz0l1%VxTVf;PYFi?;|3Ie+k8qtvxWallESXbo)vu?P_}%-eGtB31z-l1J+&UbR$t(fP;-?FsFf{ zh;NHKigxp&zf6}<-`6qETn5X`cEOJ}9C4oK;0qwL1vgt&i5TK_QhW$3sj9+tmmY}d z4p;2g_A=amfcl(u6CXE~kuKwNfI5;LWqj(3@HlR$lXw&3&^>?srsYN7as* zdyTsU7RUSD@Q1Kf`azcz(LEC+556FAXbjj`c66I1(E1s_SL$akMYkE^@%@P0R~FgQ zd;sCL^4_6rudbUMyB+0mKQJusP35$^-U_aQ`77t7nx1hx%SG_;Vxo53Q7-=Y+$;&l zc~?1Yp;KZINxV?D-(60dxoAye*&h`cO?f#xwA_y(Vo$kPf24Xh>72O}u)7WBd^3Fl zu)XC2Bf3G4#%7;`d9=s69x6A73;j6!+oT3Mj?TYZKHitZIHz+Nx(pFsbL-DP^ZT(4=QcwfX#CYu*!nD@_=>!l*@A<&Ppl<@@8<8v-*)32$J^%Tl;N0v$(%+pjc29en< zPZ7MiqA#1>oPiydc!dw^XsHkr-LULdjs;u;(FztXTZZ=@S$126zF{~F8rM>y@-M4^ zos-OUS((G~+AGX&*!bY+L`se~xqgQAcT}J-^e@#j)|bgdeeA^8iVq~(V4JTpwxO$n zmj*#qFo|$@T3bPW8Q+sI?Ya=2&W)MhAHusmI8GJ9wyqE1Xp;xOT;OAyftHN3xn(&o zs~F7mVO3`9_?tP z819%Z(Ogf=;;MF!^5&Eagbyi+pykORq$mmnOxj)(y$-} z%?Px4QTw-ZE%3^`j$t}Z!#OTCDd8Hywp{PUiS@Kc^UPT0yIE}IbsTNK&j`s2_B|09_pmBbuBxeR)VK3v`R z)3w7F%ogm2xYqjc4$+UvvL)lL`YrK!2f;8}Gb_<{=(xa6Gn33ud}Fwh-|)tHV^AF5 z?FZ|QrZyk9G}Wf!o2dI+_&T5DZcKTO@F3un7onuw|4y8f5I5hJwrU|h{)2MvX(Ia_ zCMz$8k2{ytn=doVM<+&jYt5T`hr-v`Rwuw%TH+D@&A{8>ywYGC|9MC|3Bv&zwy7kn z?*{O0(L>TcB*Le%TyZ%Sy>reyjP&gPOOT#4{Wbh1O&7mwMLm+t1pWx;!FMfB@j2Hs zG(NVaPZWJTlZ}F5{_k7<;=1WJCxS4y3rJp$5%Iw>0*{ijAKoEgcq78^G=C3F13yN< zBkin|HxUM#1E@|@{ci6~nEG%}P53bQ*|9sT(L0GuTWNOjfC}9cCiaBtfPi`)S?@TG z&_QSVVRA+qVi@nchBjc#w?ghHKsRLf?+9BN^bd))$moQyhG3!qhWVQsf$N{F=VO^^ zy8*YAUg{-mBVZ6a9XM?FAmEe?-Njh8lj(DS%jP7EQF(`P@KXxeNcXvpK8gSBd3Q^8 zxH7m&H$O*Ax68q^ksp>lfT@-*+IukVUi4d)X7Rle+wqVW=XBxBgSRKA%=5Gt=kojj zbodPTFUAdvpZ4>IfK?_8CYwSXYmVXe5FW`jHzW%8Mz2X=Z)9jR{K_VY^nN1d?2k}~ z``napBrfyJ1&rRO9ra_R6OV{X7hdjH*`Qif6T!Ze8^ZR1djUFUjz4}+q zfhagRPQ)_ufl}5NjURGN@ojV&E~lNM_;S^IR-`4K+hJ}&O%>@jx!0VBbw>7ExGKwZ zoV%4lMsJ53&m(#k1bj$Y$Aq{)hj)LA_>rv&>yGYx(Qa*pXAebMW&bOH`=5EZ-=k-D zFRK6Koln|WoSjhK`2@nmZE-n*ep{h%lVP>rz@)R4;ypTgUvvDSGEn<9mW4q|{?cpb z0`U)ASQgv#D{IpqK_BFgPa#a4PJ$m6=g<9_O)x`~*~Zb1f-=tTEtyIg=gdfMVjNqo z%@DP9ELe6q&fG#cZ(>{Adu7aJzX*aDkJ<6!4n5>KolB&dO2|RZ7cbjMn}FZO`W!V( zP#6WJo$UMXtnU|LJc_ShqFH1w`9t!J7#+_i`h!R>%W!Fs%iy>u)ZY?T9`tO1uq5MD zg)r|(j(9Trq3U0ooe9$%7C<*Kj(b(8SY%i?1v zQxkrR;1n*LsS=dF70&}@1+_HcfO}!&q73jS)Jr<1Z3yX6=Q!tbB;U}VHO_8BKgoYa zp4owt5%cKW#%71Qb{l8TTZ}WU9YZL|Yg_|E~z`Mc^L>b~vI7q!lzTM}cpsO^n4=cdT!Lr5sE%#4ba8 z#xRe$L3P=fNBqSwuCApc)dqhal1s}gr7xNMxFybB%;FlV+uGKr>etuTz@i4XI$HG2 zu4yiBJYL!}-NlJ1Bx+U9u+oQe7uVj^0+X0^u5T3%-qBWHUk8VLc;S!jKg7XZrwkV} zLU?QID%fzla%MU>teI*-_blU32Q%9r`pj`}!Tt?nrZ+X{TnwWkK65hg9hTt>OJe`` zcN^Eg%6w4T%=b~rb$_17Qc7dYvmi*LO!Ylh0($xk)~NXUi!F98lkPL$lwk;+xGgrH;%lL48=Zc6e<-b z`18@#p(F6hzM30h}ni*yLM&pT_X49F6*xn zpKnpUD>M~uJGI0mbXS@?;ftvt{oere#?5tItCSH ziJ#q1+;g6ndo-5gyYT-8?m4~{HomuEd_QdOJ^WPWw#c7yDC+t{zECbUHy|C^nJIpm zT;IC0Es^KjkTO}NyLa!62W~OO?h3Kb+?P=zBVO3eHd->~?E{&vTm9IGmfE$A>*7X? zC$7us<$W6y!uu_~FYU69U!dWGPIk7ou`f9XqquD4{2CG1t3m!$lMd$RS>iJSi~I$! zzCQ<9=paW&N3szu!A7MIiiSR?D`Y)EVn9^)q2}J|`VAt>6Dpj!`U$I2+X9PF-2Vaa z?gT}iXrDmXpul842|k|%Y%-xsKHJW*+?~+XLbOX(H~oX&EjA_cu!qby`d)lSU@!>r zd@??dGG`~X3}274y>u9I4hx1wdE?rFA&>;=zN)TrK$`ok2mjDl(~}_r61aJtSnPLCqrxH5#E5b zzMTjA+g28?6m+8jMnJ}_WpS=|d-0gcLO)zXCL_46I#$ng#BDF@$wB2RX{%7jGiZ))umqa6`WgRh+4vwd1^Cy4vmom3qjLYmzGHR4@v7k0 zFZa)7&R#M~|CcgV{`)+hb^NuA^9^$g4yTzxf75}tqtmTLdq52g_QlA--%i1e~3w$ zg`$XFw=55cj#Az@ifFC9a6?^s%Z4p|xy_q4^iBXjAer>o2CU3O8^%WaHsJ5V^HVDp zr>Yh%TYf?R;`4hh=wGr({1|T-%Jgnd?}C`z4SBw2oU_a3J=dps;{QrGnD7y?!JrJ~zfXv=p$~>VkR6_w_Z96=QYinBXDw9#drn58E(bd-0 z+TI!7ojM|(9Lz#>ZU<3_ zUyUxj7^!qIH=dS*08cgT^?2u?x~55WMn}cd;GP%#_QsM4&W_GYhwefT)Vj{?r}b?Q z&_a7Xansq^lv2f!-G4nMp1-SwS2$OPgtJWzx_?de3}A5sZ4kZ+ zJQw?5o&|Xi^=TY&u{|CqqN>YxgT`@tIYi4e!kOnTA1*nxJf1Jzt#PJUQ#kjzdtE(h z94lqbL!CC##$S64fNydJD}5SSz~R`wa|;Nfq0Fe%dhL97vJ91!Qv_B&N6;< z3g|^B0;iC@@M1{&P|=3x0YM7FlTJl?$~JERJ)UJU6=66_wA?xmC@=DyPBwNhvLY=e zk@a**tHf;bRGj97tc%bn8bF?ShSmQO$W}izp2#^@_`XJD7eyTchvomOp`irI=fRrxbUSB1KK?08)vv<7u%aBkhT*%$-Tuz{_!rP>-OH!`Z&Tj z$(^w@%vuyrdjQ)5{j9G)C*Qf7GOCy}Y8yX+bbGz?ub(0Oke>Yse_{AB4eK`F+WK?A zpMbxg9++0KO}{|+Y4UTce<_&qL%g?R;qM^aJwx}bu8rRVY~u{E#SuRHD8hp?dd4!A z=P`tHGqCpPl{-oEIAG7sjP@pnaop#)4UYEdXu#U$sJzX#%}2QENIU|La>@JPcP4oz z^Vw(Rk+qcbMT*m43>KBTIR}PIrxr`!ZRK6!wVuzkD|PLQe{Qo(uBx@F_3|3p`JDbrKh>Q`?&eUV=Ohj~C_V7gdVhcc$KpW8%uW z7-{`-E#HhcXyRpKi6P>qWmR64f4Q`nC{12ev%mUYYyMcTV?q; zZ$V~3y;tul{B}bIZ|`!JQcxysN2N^XFHdpc@ZRX^rYV2y`ctsq`8lJGkYA3yyJt?m zNlSn=UVEC@9#VdPFT8-OqRRD!_+uFn4w6BOm$wzag${{B>5RPNRfu1(F52l&Ifi-o zXFFrHTCmnDYaRQcuYHDR84d@o z4CbW{gyXp$=|L;f&&%-}+Pl6%=ra5~OzG#@;MMnX{Fb)E^EcFk<2?HU&C1)T&hJPH zX-LaHO>P9tjit7wBXJjC}-9o;2A@Dr2Gyxw*#m*>Ga5O)zCGcXpEa7T| zSu_T`x43OrEOmIqSpY?Tw&@DAo47nsn?##UO?q@Q`4P@?jhAuH3#DVq_7U1nB| zLv{Tf2CO_7?sYKMp9BGoNLr?+>=0}9i^7Sg6T~2I!aEw3t9T?*xnOd|d1r1|2ak%` ztz(sI@JRKB#Z?>Z(g=Pos#>)8f~sYU7gcSTz(8#1gFi0(g-TH5uPoY?!}n!qB=MHP zZ;qwoDT4^}JBlyqkMzy?C7wBx?d&&WWkV?vd>F)p5Zbv8Y32cstC8M~vCoHjF2?b$ zis5%!@M`39V|)Ya;aVhSb~xjtAs#gV-rCGHiRJJUjZ;bRTEN}fexoag>k_W1kiRlflhi-q+>jn>m<6_$jm( zl~)$L0YJA_?r`PlF+Gp@#DKQ&?Be-$0 zn#zW*FK=;aDX<7%#Pwf2f{NjUbC~Nz)Q6H_C-S;Jyw#Nhwa^d^_RQqK;e)tf8RRMa zOT0v7l?87{e#cwxaAmO^YrFCwm62RO-|5ojHjR#T<*-JiW3o2uLK3N~1@*H&(lACQ z*oD8Y?eBKwh+1rLVq`PUzEHEH363Rw1F_vvn@fWC0`A)KK39g(BhO2?-cw$6>-`6i z#+O|`h%n33bv_a7_R9N^Umg!kMBaD)o8xIe;-@uVtB#)&?-y}@Wq4V6!JM7-i6;HGeOuI zfyNNm1;hOU^ZK~@4AMFp{%lxx7G5<}97^f6r5FuYp&zas?E~H__R9I3D@S;f+6W74 z0`8r^MsP3avA}g#f%UFYo~!yRg{^{)+wpeQTPeJ;Wv%#6qYYt+@!T)4K9q*nC&bCH zJ{ZmrI4JOpuN$X( z@tflWKbfxJaIUZn_vLsI=j2acMjl5i_v5$9u-F$uv0#Vrg?oo+KFZF+v7Z@IjEL%1+& zHyVLo*UoEQyr=`5R1w8fUm$phs|)u3rre$Rb#%7l7&}#44~3x9m3pug9#QIEFM7~q z;KSu0(BzAJxMe~+DHD{2`C41oH0l{oSsZq$J9D2F!l4IjZFUDCQqFW2XKq7TOJ{2> zoa|{mc&|zOQdhsW5ssHxcZGxH$v1~MI9zz9@R|Tz*M<7f8L_w~xR`6Hrt{8JXKPAM z|Eym#y>z}l^-u?2Qy=;UJj{a`cBD_UVsJfnWV>e9DlJCi*kA8xr==A1CD zy(ZOEzZQyOX~U5Yt{xTX5mswR*geaw*R<7cnl}U$K%6(oKOglQ~qC zg$y|MmNHKB<1k)zt<5PxnB_g)#gpKxainYc&Tw$3>{D=K?dMrgB+l>GnSOj@M@LtE zyKo(j?ODa+EW6VD*?yY(meq~0h+*Dy9Gq?S?hq_=a5>JW<3}xLk%K!Im)7TV9bD)= zEKKlK6^jcCl(@w%uBBCHij}v-!RaCs$Kg0##@TseXjiZ_9^Z*m@a9xkd!w5N%VP1- zu?_pY+{NLEIv}ZWZFOgT%A?owV(~)F63x8l`*CstujI}Isph)nuKpDVO4rd)y=3`$ zg8vKrbn@s73)Qo;3tgOGMr;DWnxp$6FLCi0Ix=nl4#-6=t{GPJsa5T*%}Tp3jlrYy z^@|-G2T0;xIvheB_e-XVH!34;R_3P(hg!?1o+{oeqsFD-Sr^zH%dK^=u9n8`l+HxB zDFtWKa_d|?-sGY8edeimu)5aJwq%uqRX25ZtgV%Fs~xO?Sl99z9IT@n6P4Jw9E7KF zjV_M&Zisi7?zl0()Q@Xy!P>W~+Pz`0#*b@it%a7Mv2B@-NmH@7^E9s6#gS*!!^Ex& zRoeMti;JVa;PQG}__Q}SV!bsxi&ht3+uF9C&kC$+tZ%AQ+G=xg)$7oY#?@=BEtfgC zr-NuWdH5m7L;Vvu2$fV;iVh+SIvvErNW(LlpTMp#db6sgskKI>B#uoY2*WWRl~g!q zqVNW2`4fEobE~#k*M>EIG zf(z)I^7CU=t7)%>Vu|JBJUbo_aSoPR>O zXziN1`kJoQeEUo4WjgGm;$=$v;T#zf3q4P>eN5Bt4BcP=dMQIow5}p?k_UP;KTji` zh7bGN4*&Nw6@Z}vx(JD^Wp&68hzpe7Nu#LM)orm9Iu=eQbzy36NQsL!t`YKF!_RY8k!f{_DvNJ>!wajhZHUZ zLXyERhYQk5SSC0Ya6pr@x_T^`&K9cD>qmWc=cTDmDk;HHfF$BNC>8u-4&fpfFE-lx zuJAU{6EP?;u(O>$_ZZ_f-^UzkPv?euaPh4+JKE4c+JajSqnSQ^p3jVR50pap=q=G6 z{eQ2gABN@b$VjN8e-v$d4BzrKK@izMV=qJ;)u2n@A&sr=jh*XL4UMZ+{>I(4V(}np z5LZYqMbl7YVf?UYyr?d)KpiMexJRo2j=`Emr~E_oAyuqMcY&jb>aYd@Y)chL`YFE_QWHAn35n^%~$UCJio5O ze2~RETA^aY4pZ~bI#7Ne>}At5$WdjuZ+fa zyfg^-rnIbe0X7?yA8T+D*#wK~#x`31r<`n^m@3|6{bXJ|_anYO`q!wF9@XHQXWSOR zFzDL#8>FH9-I~<%WB2A3&#KPDIfI^WMDI!x?)>WWw|ggnzukKP{Jqx8yT|)|iTC>p z-tUiizX!bE7kIzjTe>XYy?w&p>%BBHk8S$7T8!j;4n|BVk?;$m;g$YZq^5 zZmg+Vz8pW6R4rMu0Wx%RR|`UGYd3UevqNJWnz2dUuz14Gp+W ziYhkn+c&f*J&Aj22kjg}^!1|bUPRx>y-}N|zV}qTzjEEFwz+3>TC5@%&5Yp$wz6Y<0#;zgLSU2w@15h@3U~xHeY{_R4< z(7ONME(YBJe?2xRJqmJgF!RVDI27N*@STP4Y<%AdS~whki;Yhlg9q+4mZH(|f4jYX zxtuGgv$k?!H_viQ(Drh)umayh@STD05%@m4|CH$ibI&;TOUK^0eCyXsFPvO(`P2U# zXu0`Aso(wd#=5QbJy$PU^_SaTcm3n5AN}XN8&2-K>H6=#=4;ub=ihzP7ssDE=8iRo z-?F^?$WQKj->?64?%s{Fe)ES(Q}^Uq)PKlarP=g*op`){B5 z{NRyipYq0sPul&~Lmxi8@y>U?`+;>UPW}G!8xr4s+iBwuPrT#}&+h!vKev~B_@z&L z@{ziCUpMy9t-q+g?e*_|yyi>iKK<63rH@?siQoLKY~_9H9ynrO{n@{HZu^N{ch=l9 zd-%(jJoUX3e|gyVKK1h5=f8T!K*Pd`cP_f5WbcEoyZ6p{m!J9MM~?Z+T|fKn-j(0D z?}KNZQa5w;U%t`&kq>sgWaN>LedM(t{_|C9_pe_z{XKJP?p)h_%|nTOw_RC%@8rzS zfAqLp|MG)J-n;1UAN=q4mz;g`^wg85{CLfKcU*GJKQ1Uc^Md*fr#5}(yN?eo9{k)t z|Md1x{`SU87p_~oBKw_}-T$RK?)slkz5e2l9x`}Cf7NxF<@fZZu35JJ^3}ilSyBA<>~9@?A-l^$3FbQpKg8d>kYH_ZTZ&Qdzbfq z@AVgcWy{E~U%T#IpZ;q0oImZ`eap8`fAgO%d+HxQIQ!PKyUHiO{l<6Q{`s%n@Y4P{ z7r%Ap)qBgE=RS1%Q@{D{vwg3B;>M4z>AvWh8((?FS1vd|@ukbJ`{^T1-(2~Le?9u` zi=LhM{p4%5oc3Rztoq&f&9A6lJhE)Y9nXL2s-2HrwrlRot~leUk9;+G(b6Z6`{LPU zAG+zy4?X_K{ny>r{e@*OdCemWZayt_+%L|2>aI0M-;?%Pfk4ZhFAT5$2-IwgP`^}le6Nh}`ZBOjHW$u07=zQP9`>Jj@>+yjlRlz-zTmSfu z2Ty#s?cBMqymqvEbM7<0y}WK^NAJVCKl4cSzaBmQfvacD{otZ|Q`and)xUmM^61+( z{QRn~%)Q{KuOD4^#}hZKzvmC%{Pn|6jD8^b``0z@|G`Tyy=>&y!8=a-QGet7fBx#m zRxb7Zu7fu=={yx-+%XA&;R_F7k>vVKt3yJhrcM(|LSd}iRYiE zRmRGJbkF#rs;V7{#CC&h$qp?V?uR}#2o$mim*@KMS}u#=ZGn;mw!L|uMe+{PsT~9} zXG!9jYx0r=i|A1A)Zr1rp|?Yt56|FxenIe`Coeiv%l6BG)&yy2Z+I1c@lyi3E!_C_ z%3-)9@h|*86W>q#=>7)_%Yl*{X)Z#QmH5R^SwT6t@PRbPNi5!q|IYLH$-esS!3Gm) zp2q(yk)P=Wy56qJM8kx0XlMNz?b+K#DKjQiuxEm=uoAO3gvnOjiK(UN98{^xjA z{w<5*_{%S6o}~E}V%Rc%jxHz%+G*5v0@9E+8vgpSQwsaV*R)F#H=uY|&M^h$aKuXz zFUS9E#h3PP!T%^U)*gD0E=jx(U`Id46_j&=q`3_Lvz)(H??rp^`vs4%Rt_nEpA)1U z{^Bg)XKqj_`Jyr9FP0SG#9Kc{3&iZU1$2T!^yY=7a=B_O9F@aX>c^!KmL(tu+2)dj zwcl6(d2<2ey#s{+X13m}Il9LV)zK>_4~0?1_rkbwfowgSi- z403qj>Uy_9=7f;D3^F~0e8V8KLdZ`Ia%c$ovq36C$TS^(a4lEYJcC4IdP)IgQ2}IS z0p!vGNLK-5V*vyn67A#Kb8P|S4F!;01(44cK)zA{`Cb9!*#gKka4!A0_MA`vSy%vh zi9wD7R`qAAL5>L_8w^q=5NDUjy7=Z-NpNaY%QCAPJc@h|kn0 z$e-i6xH1Z4Iey58YuvP8(WG4M5eWU%lq4Ki`}zsTY*P-&$c(jF(gcfW?A;@o&|>D2 z)eyga|8(ZkDA(1NOVY&ZIyuaRAHkz{pZD&FYrWobNt#$)^TS+B(*37f-Wuh4hvkwq zvARx?T;%`!bba>W`*cNP=p&X((!}cGsulHX|6SY9jdFd(a!Hz4U8hMdSJ$rLcQ)v% z$GRT3T#_bM*Xgmk-gw=8KZtVu&2mYaSY2m?xmfyX53D~;B^ie180(ibvAPx@HtN?A zZ~e!8QLcrSOVY&Zf`EuzT&eka@9rP`S*0C@R#`4d6RYbi#71@PYgn*0%C*sQNt#$) zXG<0tFRB|~S zUOA_IVU(-ca!Hz4UF2R-UGKQ$irb=GeU?ko#OfmZQXWMd{-pN0Oq6Sz<&re9y2ux! zy594un=X%Xy}@!xnpjfqq^Rn80n94ea>=8 znpj;ING?~`p-2vpf5zK*ew<8tw@oVy&{|nxz0Agi9J#D(uP920W#Kw1)Kt(vFR2=~^Q1#YV z`NKeULZBiXQz~~xCB|N*4s)9U7+s$PD#9_Pk^^F8VS)dKON^sjF&-wz&6G+3h?Rwi zw{WDktAWFM0u|wyQh6{c8g0<^_UAvn4OATjD#9_P@&v@nLMULa-h$c{4OGzr72%jt zc`+(#_vyOwIN8xaHCUh`98)SVgtY1s39h5(p8jm0S}ITxjwzK7AcpoLKEUFrf$F+I zML4EZzKlvRh1~T6mdgxOZv`sCF{M(PP|bT;WtV}fjG*v@V@joBRH7a>_3s2TFP2_i zfr@ZUsr(p~D8s9L$E-9^MF~`dV@l=EsHmStSC0q7jmm4JKt(vFRBAx1EJUg%w%X5z zv^EJ;gkwsjVN_zRJhc4eT?5tc0u|wyQc>NvvLKsE*Y5*czc5ghFU~^=$COG7h?Rv5 z|LLmQ{65r2lwnhWif~M+bbuH%YGjSW=M7X*0u|wyQgvcfGW@6OX~eFV2CDf272%jt z1p;ElyAiItEvErRm;A#5j@s$izy#*@5F{KJ;RHgBs zuIV$cjW$q?5vT~qlnR+gS`Zw&8eU8}X`tF5P!WzPRU{yW+3&WK2c#INZVFU{V@egp zsKol^cm3L51}X=Eal!!=KZ{OPl#6CmlbC-VdKa%|5ixP8t@v{610ZIJt;8_#-UYG# zlMj#Y_*f8~E$HL(@4{u96!UGy%m-r|rWs6f6eGPc*DcZ;Hq9sU+a86j(k3s_hBw}$ zj6_G9prseu<;-5_lZIgnsQ}8q3z!GTL`B5mW4FO!3IiMOxo3a^HuW<&TfAblDcAs% zcAy$S#*Pgbl&yLZr& z1xZmLDljM_25$Wwog51ce&J-$gWeVkSTR56R zdEER^QM|@ZsYJ<|z)TT2Qyk7+ujLQV34*U}9HJq2cXoIG2kS4FyUE=+pm@slPTpF% z(#PM!&rhM1d%C;0x4=3)_ZG|nxqAzP2XgloR7>1jq^8J4N)MeJn{+%qG-|cn-O2!X+8gDr*os__8 zxmux6`Fm>A3=Y}4@?vsS1h}`7&^&$QN?(n_N8zK9dt;qgIJ~OIxVtKYgLTLuHCFDf z{Gsi*C%L;ygspu70yMr_oxdm$Da1voR{Lo^y|i*?_m)luu&<}TXMmSdM_^|O3<-Iu zeLd9vkdh=?o>QI+XCtooX(}GaQ{XIPbR6gD+xep!L6zT3tet57GQPN<(2w15|yr2O6wU9UJ1JAIi z?(VK(;W#;t;)zU$o>J+h#Tw`oat|MGKaHPS^9`X;6_90A3vw-C&^8ZWxu1{P-`7j! z`wf|po|J@#m)t8LK&$oilShzK8+TV~(^-b-s44@VMh;E)Q28qj8i2l6a#AAIFE|cy zca0BA=>t(3RY^~8xh6oP3-D5V$W?t3;be?ga8;|8$T2&v1oc0f(iCEHGb9)w*ZL{_ zH6C6{iI#Cl!ZP5~Y4rvgPr0{3jYW{2N_l8#C`uP@KcH!`bOe^WiviDDu2L%1N);p} zXb^SJ3c^&#Aw`9cN{c$g`;K;ZQ{$M8v>2oKyr96oS|#{J#FS57A@bq7#-gaG`bd1Z zsy(3eFs^b|f)ZRKSNeJQcm@O@UP-f!(qo0@P2K?uh2BB{|-sl4H~la-tyqflWV zg}=YX-_OU0u>weV-XsQE`+NE;6-uRwR|;d@@|On$1gJfH1IR!NR+cZ0NGchjh@_Z2 zJmo5#uSyeuBKfAW8f7U!uJpx5Wvx~vXLijQ28b*PqGUHigep12tkL@Fd`027yCy)f z!up_p0DBl81(PqKd!h+a`DirQHYE?l`A4Yjh>|y*4H!!?2)t2+H4;NVIai{2OQ+UuGQ;KE%GI@%o2#o!YXgj)aIj3PR;}pn z>g2`k{fpjM3@F?Q3}mZ4^IdHDT^Ulhkr z!2jc3k#9E^(4L@w+9N|FEq!8Id_uE`W=Y|Fxwc$;d#*RR1TTl~VzR zr5H?oN0bFL0#IWw3e^FN2CRS`|KtszE`rHXEDr4~XtT7q(YZ0u$giu(KHBf?H^$){ z4Ef(|IBqJ?{EwTCodop%ecv&5_1P!q&q4lOt-^+BR{_@~1Nm{k-3{y}keTEmKiRh% zducoF}}a~R>b)J_FGbO;`2KjaH}9V1Hndn zRK>lk6}i&(q_T;pa&C{{@zqCx|#GKBHAeWH# zol%}tUUW89b-WK3u`yC(CkhzQD`|z%y%K?5Ea5mc(hy!N>alioq zmjTF9#>twPUyOoLw6Px{CXfVIsl3}iLlVR9FGC5EyNH4gTJ6IslI zu>4d&_$84MGSV&Rz(DA>js0km3|(?|NIASOhQZUeL`(dxG~$=WJ@8d$V}Bn7n;MoH zPuu>Yu$tP&ez1s!*~_R*&K968Ktd*Y91?3UQLL$bVA*Z#wFa8#BzDS9H9*M^FUu;9 z$H1u&25v|WW5mGdM0NtBA+!oYmmoqa2uv76rQp;Y40}-^@FZztpM)SPQus__{)npr zHdc&`HO_{pNMz*EmpSpKc_)2zI?k6TN#}?pyrjeXBpS#_Fr|=ZQ~+gIVkC-|bcfvh zvh2`l6*OEn5D;H$L>WL*5fKrLguDSWl1vQMXm;H|LSpkk8k7|%V)=%R57X8q=+;qk643B zBAHLXX4Q%E_zEux5Eg%WHO`?mR0Dg6mp|c`Ek&Z@3K!F+Y~xc<3I+={_SXTWLJYxb zWgGhnc++$W4(2F&a<vBk7nKXlyvI>gABn zgnnsIAe0|7*mV$TN^0zYD8xppA120@0HvUFpebeIoF##2-WWYQNRl#M8({j>gtJgk zl}JDiOpa{wI6R$IWWqZRyjXlp;tQMdD?=*e+l^c%aJ2xK2^4a`#Ba-He%Sca3dvc6 z0;iMNu#TOPzmsqJfV{^RN{@UKuue70B|$8}7dsl zC~zaRgEa9jR11>Sc7)JL(u{F3@-xL0^EY1#aZxGZQP^_q%Jh&TAh+U56}H$b$XNzeI7$M?40^$9uZ_J5L@aZN zjVd`gODCj;P`n^bu#UYv0umWc_QEO)>J(QWXw)q>D$;Lytjr+{alKU%qHz2?%sVr3 z)V2DK_YNk2mqfSfZm+Wt!bs6cDNje_A)Is^mePFSK+hykyTv#8hw@ zVS0ArDrHp$d3baU=7odQm<}<8qCOl&LKU0ky#fHNBS1Br4oQ$CtJkwKAdTb2i5iZx zX3|&{okN&7t}q1dW~oeQ_$B$`!vGI?0v*mkjRpbrC=kx-Wn?S^k!6$`CDV44G;ANJ z(H!v-B8}|{02wVzI^)P_rV5k@F-NYx^ua8VgS5s#bda5o52g{t;j!7U`YnA7SzM?Ov_9Yx>%HUZOBZmibqPnC(tkeh4@M=yZCBRr}LO7pG z0+4?i@$g1wRT=>x9T(3N62DfYp`EpG-$v{eC8Vf?WHG5O>QqpWGg zC2SL6UqfQdB{M}dpR!D4%z{cIBKUgLNu(_AymckRB13eB@aNtou5dZ>B*Ag+dis{pv_N@dxn0lDM=iV1Nd1R@j^ z^|VqL+Ik^hygpMBwU7k)RhE*#(U)FmNvQWSpRz(_&Bkj?LMevUj@pe`pr-N_&tOHy zXG7Ksm){Eq=R5dYM=uBhiNaAdb zXk*YIk>fH3a0X6@c;r2qCVU6sFgVW;8bC5ldc$Cn>cc945=GO@%8g`+DhvDA)Vb}p)W;mU&d95;vI1vrbFHlO?Bw+G}w z24GNTwYcP7pFW#bUu{z&F8jtP_l3LvXn$n#iO@E4+x6+1SLJWaWzS`JJ4Yvdyf*XT z?Pgniu2nkXwZrsJE8WI8IaFVf*U{l)NB+~UGLWh-x%Z8PaGmvgfAu>JMh zuQ=0v!-bjefB3v7YZ1=Gu%vXKwb6_pz3_0UtVNTZLO(RF(0^#3TlZRis5au&+&w)T zBvs+K9ELaTS@+77E}eLz+qrA#m3}{@PQUyjuH32Imx0so7yHjeGHN-y3m=(6zR$TP}UCyUNJ?Af?ARw381qI7RvUlv(m?)q%5ZIP-|r(~X% zt$R~%UrdDuyVhFw&T_7Z?~(Bguh!a?9cye$PXEJmdBYAxclXYGP_kC@FCUUBC(SxE zf8~1_$L(f#SqbO5P1&+0tEMLV<>vD*a{G^~+QU9x8}j3Om!EeuRDOXk0+g}Ls%O}_ zt*HUeM>KINs^spUtL9$z!hFYL8+I4l^!TrBjix%GelWa?haLs~`ti^&*N#o^Ki;xs z@!1DMYM&nZxyST#v!_-%(QysOZDn}YMO-(`>0K{Ce|KihK^xldb=*^F&C}K6PS?7l z?K${ME-bz!zB$RPR-LukGqTv?8FmWC%Rk?Cnjj1Cy;!&L=|&ey+tzA5vO_q&B``eS zmopocwf}3`Pc1e~Tw8UxX8jL;3_cuwKJdY*HFFydUHhEl7BakLrOUiN`ye60Pw{ll z%(Qvs`$fHriofxs=j(O{)Z?y|h5kKecte*rTD9`cs||N^lhS{CwO-S>S~dTzhsRm` z-R|g%eleEgIIaWgjLb^4p~0-pjn4-C{qAG>-D_2Qx_=z7&@DiB!==;B;Tpdj53FQn zcz0X;F=csblh&SF-&}opv02-;(-J58w(0GZz9S;^p7Qsl__WLLyo;23RC&+O7q&TU zTh*@b3`MQ_!)<@P;1lS2#PVyL!FFsyT-v<*?o8E-+4U{j-0>_iEQ%ni73#{XVzjglEfVOkVi` zdQhCwO)inOVOaDix19&R%wIC7L-kgF{rR$GjS1%yd)q&l7pQ^J2w-^Y!*6X~S!qp$ zD&B9c-S&)`F}8(6pPpqe20a)&Ye|vSGv~q%F}$f;e!p6OMbTMHo~2&Axa7j9ep|eT zl-j@aTJ3gMo0oo{)Drf9;bngA-f!umQ}Z0`d&RvNzO`+QP0N(6D=+q)eITLjy5=vi zKHHZ*3tIWLcDcLY?1U3vy2@tX@2j+*e6gv^YK6_FwYB<1&mXY!Fvm@0cy%`(w5_(g z;l_?f-aP#6%k-Op2ZthR37;hlukp;^CZ(M&U8#7LI#qlx1+8oD z`^$?Wnh1+*n-h5pf2`gV;~uQ_mstg9wmMsS&i%CS{MW`&b;eBoWm}02K_4<_6uoiu z;XTVK!#QpW!@IHL(b3EG50>tiS0v&3sK4BIINu0ur||IKaBYs#d*GwrIPM0+yYznV zU|aXL)ml4d&wO^^QoUZQGN;~quwjzwmyI_ZD}IT@QU`oz*w&v^`_d-a`~JUi>$LOMMW86=}^8{oq zv)WkWMvJJ!ccR6`@V_v0$`%Z-C zZk(!KKC#)Y{T%m<;gwnJDtjW!+;*+Qlb=qFX>_;xxdi=_$-&u8)ZeY5wrQrBMF z|MT8G`ql}JroXs2Yxw#Ds#ABJ-Z{0x`ArPZ=H7}&B})z2{oCIk7S4%!Q}6YPx?9KS z8tug)bM_N|{xQFMssi+FZUnFvoqKUa@F)|F71FuGQ9Scew{V$P2HiT-DOztr@Yitajat_)yonu`*xjeyKs(% z<9=dz6*a3Or&xA6=x#k{^z>zI_a6Rp)X^1fR%@o#T@b6Umy34m1H*eUGJVJ8kr$3N zUgTQ!&Ro}9(bd-(tk}C@mtOs}CGqMGMX9G751(1MvuEJiwGqoZ?aHw% z&vCaIUfr=zn^gZ;y4=7FyU^_~g9lW7;nLkZv#RSLtK2)kP3u|-e*DoNlUYqz`*vrQ zQLjhdcM6VBdA9r%vifqutiKne`qXd#_@{SOQ6Bvn-l7r1d{0DZnsd|JjE$+0c4+aS zv%BZjd!s(yZfsP~iS1oD?f}E9+xF@k+h;cYDyS@+qE!#4`rX=7*FR2MKQI37tg7~|@w+NV(K z*JQ;wxw2(ykk$FPYqgH8ZhQTw71vJGj`nT{e+CS1*l_hvqmo@`_3bk8?4YydudSTr z(JODIY|K%&sdl^dBO9Z?#_�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�cCeKU;XZZsK-CdZgu^b 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

W=2e5U$mL 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 yKE+31*< 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%0DD+ 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ℜt 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
>fv?F{&LKqmT=%fBVIQeZjA?OLt438$}^Rqle z3T&AO-x39x-| zPV_*6XKw2AhV5pW2NT?F#bbc5hZ0;Pi)Q8yM}OAyu(a7#q_m)I>LUr5Fj;>x{CEO3 z=Jae5z@ALth)OR%3vK$5?&*YF*Yn}$66AvzHh?tkNy4h{yo~_9Cdsvf^2T0-JCoE0 zYxs=_cO|_a6yd$w04pVVg;?=s_`#%fpWGZKJ;>`%FijRmqVwaD?-0^GDKPZPl-gS} zE#bp0K0l=iW2G$%hGWI+c>v=^talZ!I{?_2XUkdG zylXD&*PllGhE{i-PxBDg*?O=5TX?~lWp8dhl+Tx7s)qqUe7T0&)=Jvq*)1!Ju6y$C(_G z!8SVND$zAI*2atD0^HhNe2?miI^wV|e?=86_7S|&!{I3&{6HL6IoL3sSHNR34)-%0 z94~GF^?^RvaP5NJW1cfzoLD9)Y_)@7TQJN=M@+}L#=&uJA~&O~-n9-c8YAkCV}HdN z^d-H)4FsEjIE)TQ8BJRs$FaD{CwC z8if5uYUe}ITAkUYw+@BY>XQ$|!>b_9E=qmz5vI0Amw|R*d)YtjbF{-Tm0TT^YBIY} z&HsYWb0Hqcrt8XEQ1=`72fA?#w%QnU_pmA7^)<#k762;$5=eu+g}!@=e&zlliT%T^ zD5w1e?jN#NZyqJN{Tp$?y1neqN!}>sasJ6_XWJakywFkbf*1Cox>g^Tyv)yaZ~Z>w zI(h=>*xm`GyUg}(Tq{So*W-K(?nV5D2x|eNg7%T0(7xnkP>1<6eO`WIeR<>|Us7gL zC&Rgyf19C`33W6)uc~h^F$jN@>Pbg_fhp?i7=)dtVGksGRv$uo_ABRd%2s#g&wh2d z@I0QsdFDR@T$z3r-%Rg(Qn>W)JI>P@6)jK6@-V-%tDr89bH*XW!AhNHS~5S*A>58T zc`#7&Yl+(d<34N_&RE>~Vji#!f!zh?rcT&B6|u--xk^jDGex?fS;?~0#rn9{@swCZ zm!|39*bLK4R8aQ<{@@Ez=y)4`la8^x=*^-aLkKIRB2~g8Eg~Pe%Y#Kbx`v6&f=g`U+bo zfyp|6yvi~0CP~jc?7PLh%6i^x^^BmN`ZkR!in(ErJ4xgekbU-)yZ1+V!2Tu=kPrDs zK4h3DzCXfxz8lcN-4( zSia{OtCjh@y1q5r$rCmikt=-XsinMaSn40)+nLSRiZ-&N<*0 zU;2$<=xq_!^EvJhI^lc3odXkh`a?ZN#VhFS#?RZNKGsRStj8|y8pE||woB#G%=ocb z*YRVh{{;TdL;WE=>eG_zO665Chjk&)@(!aP#~^r`qEYBX9_sSCAcaw%u}yS^fr5xy z2%{}&w;l8@LytR?AD>$=y&7$yhDA@Z0LL;mO(73)<+;F51hj-c#bKvR=R&}hTc{bU<_|c~EXb_>%Zf zI~Y|JM$5M%Z7Jd?WJ={}rah`KO=x|6nf@_y3Or z_O$AKlyR&~(sp|Sc3`$uar!~Rdk7a_Z2^DSKA-Wu5??7+VA^8YMZ3a&csJ@BP7tqo zHcaqhyY?DP8>a0gpB*qbxea^18OMX{&yv)G8X&Rep^wAX5;~XIwnyldI09R0tkBS{4LN^iJKx_w|n@V2^gWUa=PubzF_*hpmTzMIXHwlRAtw5 zcVbd}hETr4<}mplwAp>`O^6H;1Y#i)%XjkrPa-|nNjD)AdD-#)^UN1|Amvx`62wSS zUGh(%ERLP}dw~pSFq0p#cRyJ~6$GX1fb8JD2|bG|BzS#lkgs;?**oTIh4HaR{V97# z%-IT;hxB^jD>a_8e+Kx}%-LbN^=Iv>6hI1mN?N@SWpUnqdlK)JdOXv6hp+DHlILpF z48Zmx22b&f2m3*ud*XY{?olM8ARnW7(KvWdvBkyPQ&+S}gUVm_Ee`^Z{LvDW45*kL zyJxEp0$aiL=M2~F!1Y#-D@`D-?z&p9Z8D1C-D$jIWqZ^X58pF1vRn7L z+>bikegXBG=R8!T$i?B9mhU(GdVybk8+eSh3bY^M#TRp}O)>!pg(=T{0A-Qq>d#ZW zIwi^jDZ+=4`#PJasDs4_$L#_gpA5H0uxf@v&%r2*;V)L^CDsEDO@0vdx)1JNFImrE zvusOwwb<6Xzl^$n1%Et;a@OZrpGvUwA*3g6 zA2r;#k1YXT(hg^$a;Io94y@i3p~N^23f|xKyfA?4g{n^5k;a>iXcOfy^nM=B-Mva$ zz2^blpN|{EqljS~^nX4sJ*0O?q5JbNVK?vq>wxYrfa9su)W|;PFADmE1l+PaZ!`q2)T@l`QAdlm%uc;{*`Em?#p62*FDfyU}V<7HiVW2oDeNKM=gw?$l z>E}%ja$Sm<#jihq2Wfa_&-IR53lRo6hsXk17RY{uP+F z$5Xx)7=^a*hw`hys@~&Oo)x%g3ApqiEn>cvIB(0xHj$qm18!`{A^7HHWA;6oeI07HP^7gF$G!fP{y*3Ho8{v* zjp3Q`Tz-DGK}MMLnI?u`i%R)^X+~S+s&~Gzh9ycXZUkS51;thk7=J0 z#?Ge;UM#Dcvn%-#2>j(Z04ABv7@z_q6z@iTRW1O2OMpS z*5B_|r2v^g3*!0DhUZ6t=g%A6o|g8}_9ONkO9al|9yncKolv1DztI+;U0}3lB zlZ)5tY}+ZMVIO<|X~;((L3ru)KJQ3NKk|q0(PxYv+=oCj?shxUCXT6gcMr($B@FMb zEV>g!_=XxgUFi4pbxLbL)6m9O48DT$s6(Eov)us3yYhK^Gl2QFLuSCge${>YUW4Hk z1NdPs%N~d8;C~C~HY|6WtJ_Sv{X5d|4$?NG+jop^_4P%xdxX!&DidA{gNmg4e_H+p9q%3|BThu=%{6z@n$8T=t_ zbLX*3^Hi)CXZvwx=lhm;wgArrm7@09Aa|sy>mZ&?_*$AGYC%u zX(_Tf2^if{+g!(aeFNro`t9SZEyR)X_d=l)E5_WDbZ7}jxPalfZ2d(>j|tF&IG>L& z>ngRs0Dc^mK~FQ11n<=VOSHk0l(<29A8vv3~fRGfwr;n-VYDpMzr z#GSAWk=UBX5k_Oibz0lwNTmVeHp8#NT1by_z3@)Du4lL)df;$cj|Fz}E>Ag?$H?A(Z4iUd^^%Q-C1U$n0 zU*q0jqA;m9CsfaVDaP1kB)WZ`j;c-(b@C2R8X*}t-d=`0l#|CW-s-O%#vpil^6)eQ zTY645K^SFlj5^($vrFNAF$FxrztA@36|58auE4j9ZTQ83j1b)(`#t;%^Ic{6UTOKb z-=NMh5*s@n%4A33)I)Tai5O-Fp`ou3YV9Sx#l`-MTH<`vjp9^LZJ_j>V#yiu(?{YpHbP+(S6W6=gj8Bc$V2#F75j;+yp6oE6Y; z*gfEFf7On(4{(Qq*sn!B#GjTN)!pMDXa!^y$JdQW%XZuqw1fDwUlbp zPFFaC70E>oj>swqs&;D-(kiNXtBEkY`|22 z`c?tw^&a5rKAp<7&x;#rl13iVw(byoY*0!23jtSmp zjQQp!lxd~NBrTjD037d+ARX!RH89)~b^zeMEF3~|R)k{1Gl2)8DB1zEt>b!)dhbwA zjpAYdu4_Kh0G1nGH&0sQZX&{QzmFjU-g2DF%`8mjGYb>?I+MafV z=P#~Z6M$E@4KEo3#gqyNSKCfiDW(Eiu8 zA*0tgehA*~Vmf=TWzO9(V_L`nT}zdDA0L(?!J2I|&pN1p*NC8M7^#B_ekaKFW08M@EK4%!aZ=z>!kAmIVaHdBG(-_Z&m!s{=k#8 zrZ19dB5R+L@$>W1ntfhC9`^YMkuRkEPgTuNS^6->QN10|qE60TIzPp6eLDw+dNO_R z(B*8hDLBITu|c20%FsDDPQ!@|X=L4^>zV2}wwLo9t+;H!iKlb9L5% zz*aKP&01Uk7Ru&3efy|q9!cMng$rk!TUCEg7~R3RwzzbJWqFOr&Y!E`G*&R&J>2`9 zY!m%I%jJ?z*Hh?TX-5&bb#sLFqQ^$^w`(&(2wH)*v(HLMOC31UeCEcq&NFzG9rchWD)^>+d!LO*-s!|lrf-3RX5?Qa!Jdt8JVOD1x0vm= ziyte;qwbM@QSWH_1!TY*jX)|_aela1|NRbD(y`4k{D733l~Lx#%7cMj_U*vuA%=r@ zq?zwwfk`%x$0Gu(zTevg+)qj!qVSfqgna_*k{R6RmJKp!&$rbSkI%7X%$>dgJp1>BEb)c%`9Ra@Wg6|8jgLuEm@V*R%(WimRCfLr= zN+c`hAAIP=&fpw;aEL&rZQ&axk`}^i7aY|B93+q?8ZaWR>mUJzK85_Uc!$EYbs_ zOZxIh9X$?BS8w663UKte*XZ$D(BnEAbJTA}fsDKaA$cp!)js*oPUgW^CQO@ z?@zr0FwT$f#5dc?Gfwil?x5fpYjmVL+qVmr@UX(RF=A^bjT;&s?Hi(Z*Kqt;J}eW) z`j}DUY@MX}Z0y_+jGcD_2U5y%Yst2Vs0BN|c@Oe%{C^1Rp&zco9afPV>8%?K1_@;!WZTE1jPvIaKzJGD? zd_-hwhmS*jHE}C^9NzC78u9$MGKBMffVFj%hsWcHZ`_gBe}=q8Nic%rvg);|LE>@r zKBVOu;xSA}Zhbk5Fvkwdq8=-i-4!ehb=Gb#xEIt)arc1)wxdfIkb_3y)yKwx)x?W z&@w-UW1Ju8M%%gP4tx%61guBSPGnUjdjZ0F6&C>#7sC2QcUitxfVOX7nZvLxI*M0i z`B(+hay*P;4$i~0iuw@Omc3$=HC4#ZO!_-xv`57GT9q#u)deuCrsbp3EaPI7Taxpu z8BZhDRf%C${!cCkaz~>nIRsOqI;9Qa#~nP-We|?No2G{=Ov-iEOWQo`-@I*JNdGI5 z=K!66^^6CcrJ&h7+o&5h2@MUreV!=ESo=;pTLcy zvb^?MlXoxthRNH4;6iyO)+bUtSPbb9P3BrE-OvsG;NPq(?n}=+`VYCyuP~tw8=_VA7%Lc2_4wZmVz+&Kcjqg5z;;c+%AZVkyro=Rpi}!A_`MG9vnaio=YAjO zs}S56_dtu<=VYDhHsc}2J=g*U5Vv=6Sr0isV{kX;XiJ^p!!7Iy^fzp0X%IkuOQDPp zt6wv(mtr41B5C13enDk%3HeX9;D+^d(c8~=BHgE3xC}Wm4l_H!cOK~;Z{ccJ@nQIW z^X)|_>pTY7-ZrNjiPHic9cY6&4HQMVo9sE-jf=@PokBxju{?8`ZZjXUVYJbRo0c!d_P< z4~4UR4~1|OWW<~MqKDf!|3k9Q>%B$pH9jn`YPvrH|7S;}9dtn#-z!J*==UTJ$Uux0 z=Z{$et)KBHrGB5&hmb^n`CTUv|-#o z)2>bgxQ9SH%2|^Mw0Y;IyvkK13uss`B7WRQu*(#I<*rEE0>QSO-iVT~ib1 zW>web4IK+5SwR+H9W)QQlZ|=sw@`Lx$CNk@5c8m*4Vyb)a|DI68@s=av|Sww{w$1j zZ|e{nS9oEF?@#;=(rx!}@9;oq-GyfMb`;8(V|YD-t8WkQ6SyuJ8A1G+{`DP5oX5n4 zMIgk6PrtiE=2Ixo9a}1IFi(F+8B1n2J;m^Wj$E;Lr~o@G@v80X80-)eU0?PP`vR^& zX$6ay0ll9SmOb2|Z@|rh$F-EW{F^#p=OklYW@caBNJnLXuHdtk>G_4M9B+!dQ`g2! z2MR;`vg74kp%Axm6n!f`Picc~cJIVttb>*P()H_P2lp6YQ8BWM`6Q1qDK3Hn9H%-U zA1B})*yJPYJ=g)?p+R^W{JpdGY8>Ze z7)vqEhcTYvr&iDF0-v3%=SUbgK2vgY7vqk0h;$e)XA6E_Cj3}OsZh$(Cum&99UXl4 zh4Ml+1(@x^v%6tpMbd-#9Tx?SO z96?;}4C2IkI^glUf;hW1=<&E)c&F=CSzDrnOF6=rx zAO8cvcWHYSo=vZbf;|Gl&}n&}C5-Qk$^ziHW*D~JRc}miZQW%yO>XbTblV)PqHA!% zwnx=#Gs0ktB75AhABN#?urQ-5F(*%Mf?gsAS6yMc5%_*QjQtSj+7O-*{g_N!((kI@ z5+B!C7{+sECvb<33*xkJl=(?-bXW3Z(9Z{=`t%-YmQNN%-``pP1nT}I{@k5)*QY#3 z_%z^LFG5Lq>V0;;_J@M27824wYUiFNw%=j0_ICKRc1eTrvZ{R^>jun>!Pq+kzJ-st z1&pO79pTRyvJKAa4aWZ8fV4+pI6%WTT?wmS3EnMwRPaM0d^+2emP_$F$IN3$&-T9> z>B-Z-kKg3!`gg6UN0O1iAATHs#`4r3bK^6W^5L8)`gkTA2Yvp}S^oOE>0!47VQv?Y zyzC>=gM9=UC1*dpL%{F>gx_cW-IxXzL!cw=tW^FH2Acz@PP3D4?@gHA@y{-Vu-HdU z{LUQHcA8y0pu+cri9Mk@9HX8`<~#NybkK!Kn4EEZF^u;yy$u-iZIe3+&<)xBJHoa{ zlQW_%GCm=!H(FQ(!}!h4!PRFmxP!~IdjYqZUg{<60AN^lIAGV{qZt3 zKa&x6G#oE3;K$mJLwCpVeIx2d3zDv0{g!heE}WbsVi~nSDeL1V4>_lVHo6SA(@s&| zZqR#HP}12-@g5y^BwjvrMryytvd~G%uLgK-miIswmqncZ%5eG@@CW7NUm{GJ9)&!t zFP|q12VsULqm8{C2c@5#uc1!q=fYfRp@OZ}AuP4EFIaXv&fGklH?b}57o^W+zX*n? zRN3+34n5X$I+n;YomdCCw>O9U8JlXcITiaiQ{-{5HiDr?l7s9+F>E5Sj_zZndhmG-R&Wxa&sNmie z=t8{E+~nT{ZNt38=-QpY&Qa=gCb`!zVb^=||HBl4_?l#Q52$2K-Q)U{hbbKIhzY3=CO ziJLfAn4b~mBMrIcB~6Jx*EHV>Xk~t?muxfX_HCnES8^#C$u+6I_CvDy5ZZs6w-|qA+?7hpTc5s%bXE1{|8Q>?A zxwO1i`i^A2Fm8*p7qhtD)bQ}WYokLqj`Z!|lph<>0Vp>b7>C;b3O_ z!+TfmEzN&HpXp5vIuk~(h>y$yd<7RK(Jf;C_l))Hzsq<~-mLXW&v}1?tfiF4m}hg8 zN15ttxCQ+5EMV@_C28yP0(t3Qtdz^ zWlIc~i%Wbr65TEKNZ&=hScYPsH4l}FTjT86S`7n|;7#KBJ;Spdc#fc*i`P4N+j)Gp zz!lpu(LmtlFHTXsXk0oPl|Yu;zMu32M^ID4Nv(tzq(r_EjyEH*aEbl#5e9iL=h(4Q zQ|D5~Y5%f_7}gny*@j%ZcJi2htK6HV%-2=(&KK{faGxIPYM5?2Y+mp#s;uTk5`$K* z%wDW3NIMrEu9>5;clUF&OLHJ@x6F5}V_IRB_}NpWJ;(X~1Uy#ayV?!Vp8flM>)&^v ze}CEDcl)x`A?r^$6m{*PTxb`Y8?cV-%(R_MuD%d$OBDDr=bEh3-MbI^1GgBf?h3KZ z+?R1hM!IlMGE7UxntdSC?NvWEqNR4Yab7%t{={`Ty}WOIK=`Dk4_CXa<10XX+O3@p zH@2nZU|cR+Ie&u)?A5UTRFe+o=UL)20*n0xu)gm^Md%>s=jVzs55qQOkeBI2n+@xfe-e7Lz!!mT1KeHIo>*pbq)@k2!^kA!uOHu5oolKSv zd8GY}e}51U8H0+d;~&y^apEHmdyFRJ#fMv=eR0+(2In01Nb4k|sh-i&hU;W&Y{TXH zj_bI`k>7=R4*EoE)tP41IVj#Tt6+UOn+?uEdB*ruYkbD|?+8EL8v6??A-q{^3*z%- zj+L%9%sj!k+t%hzVw8Vq&#}Et<(zb_wT zZ|-sqIU2)t*0Fm28*#_m#!FDS3a@pcj%R?6y|chmtwWA(j62mPN3vNsJjN_D0fQy* zwAIh}XWJ^%&=lbRahwHFcORGguWUPJ7aXq&eZz9U)8_0Y^DFB@A@Z^OARiL})FT#C7_{vF#rc6Qc7+hlHQLV&DSe$B7d zcw=BscecA9Hs`wTQagXZf;Z&U#vd@bXi1DD(BjdYg5ikZD_xzq>MsQMDN*J14Ki)-dInvcHgkS zCx3YV;aus^!Tl2ppbuCkU*38s@C0D&yQC)x@_EY ze%c^DK1G6w91$A~uAu_|l^rM>`e4`-=@@64UaT?bE06++Ji)#43c-PRa19c&Kz*Jd zZ>>Zgw(FJ1Q-4o0jFTXLir@mmQ}ua~6qd`0UhQ86LC&j;X6#$&5ApVAaY}O7TOl8T zY=s^X_e!M*|F+obpnZ0?-6tZ`*Ve=KtwA2%clkLwO>A}h6^?=7y}XX3dld`sNcCh> zJw5OklF9OdnDMKQ1*B*E&DiGP0uN;)^Xh#U#C7)%Ww5~^OveFWyE2*7aG$_*9C#Sj z0C?z5$DfXeAP&zbLWRIuqz)Y$i0|ux+jOm?U2gt(ShlBc=T2M^k@Oudu73!RRrKQS zvM3xRZbelbFZ1EzqqSvaRoqy{mAA^l2Zyq}&gjyg;o!J#au`e?t33%ENsfKGANtt&QV``}euZq?fSi9L;9NhKGkn_&lTb%ew0Hc)f8TC0E(Q zq*nG>wP{6z1M=gckDVZcEA#B?bi2}n>5)`FUK1GsQ;1)Uu@T2J=TxUilDa zyu!I_(6{T{I9}d0k)|M)ynJ39$G1V#!cIox^Ie>{!WGUCd@rbiSNHLSRdMKJc}PY3 z>>?Lu_cGO0iNM6UE%Mr#QJN9SgeWUj9Scr!hI0+ z2jX|k?uokjYi94mcsCXjwy<`>n|vu~e_ zN-ztB36s&S3wggP`a!e-Ivvi9P$DJe&>3<3JQca=Q07+`0L!QjYCX#3y6tu-vFhKg zml>-vL#rU#(N@ox)o_&hMX#SG*W$9~4hTpn&{XTD<3!hTLEI1?0Y=ctQJu?z_+5iz zylEcKWkDP=x_mmP1#v?=AP;aYajVL8o!^4^U0CpqYMjn*LEP|Ae`*9_lOsC61@U`^ z`gbzg6lrIlkex2{a_%sNFo4BdL3?~Iwj?R5Sy3}4aU1XNdeL>v7j&u)W z4F{bA!}xRtI?ch|hJ((9LHrIZuMu?lbv_K@N5(QNp6lGzCXZeUei4qqDdYsa7}7pe zwBa>Cu!6{>bCI5Fo1XwLUT$kD!f=*oxpf?Hy~uMq+1SCzioBRa*7GGT(^Ce$I9{Yo zyuj-J6|AkkVlt6q4zFp{yr&o2MNx-sHm6TG)$;Xgun?@HaXIvhU>*nyQ|izDs&Ji^l}$IAuF^T!C6R$}haD|eFSOMpGM zD&Cv4vfs~g8ys!Z8GsF+rR#0dYXibvXTwQ6%BAds-jVvF0$@{A8FBBhL0vPV$%l>T>ejhBBXw*yQ05e3V z;FC(?-h%WNH(3OJu1wAY{IE>!zgXtWf-*Pbw{ST;2t&c0`=ma;b)>AD4HgLqLuWjXGg z%UUMeJ&NnO3d4PKh24@K83K&wXsAopGhHYjoid-ljpP!^;e(VJP1_si%enCqUq;e- z?rPM#1%G_s?7}Fqj-=-}CoQRa`y#&qWV*P&mql9VVkU;4xWu{y z^0N%)LlS%v(e**TZTQVTJ(^v(qf#v2!SU{VIS>ct~Ov)gRv|8u^z~Pj3WvGF0R^G5gIUye5m}!wRpkqfq zN0(k#2JLgFqAJ?5PDD#P_?vCfGTNfoBf{aa+m!*)wh%lw=i-C$Y-3&RBSSpj44Sz* zl>RNz|Hs{1z*V(;f1n!<0s@Mdh^R-!LP6S=E~Nx)6iG!=K*a_{1+ly98ray~f!%t| zYhwp?^S*2L-sfz>d++Za{_pcX@9^2|wb!g!GqYw*&#dv0gyE|Q13Q?+8Uwl@)(uks zd>qxejuQX=qJQ#>Cpi%oC*l9Owm4@H5a^F-uwZ9bbST8WmIN0JBkWzfv3`^~C&jag z1lGrp6~haj5Dq_YAo}z5?cmApD=4Gz!*K1zIXg`S9{mVkZ*d^S_-Ki4g4rPoCD7Ly zMmqR#VDFtzi;HV#PZ(~au*-@#S086zHmS$c>WFxl01AdRQkcF_^rv(Sxp~1vg^wc{ z{|OHC4Q8_kLb~)MbkhDT-OE$ChosJL+@(C~7N@ba=DDyusP|iU zfr}tt6Dggmy9-&^g<(L(qrTJ)`Q_s49n1tK_-!D%lfpYf6TI^}-$Y8|>Vpd+`7+*A#8X@)dyvdTJev+A!!bM` za}h6^$Pv=qOvE#NS1@DpvMA)HV94AoMK>Q`zN85JtVBGS*uiufW~VUs=Bb#Mv@Yx( zh*>o6;7i>&@$K+d_Ed{9HQ`j{zt%Pp8O2KHu$s=Pqa&$;P25jUuag9*)0rm+){B zX=tpB>W=t2i?~ico?V0ak_aR-(B_EI-b+-K_V<|x`g?I3mY^2HsM zu<>of=ZRNIZg#wzx9CQ7hAWonIw445e!@p|qj^l~`y)hePqeqfJgu+j?(FN=jm(w0 zdAfSJ@VezEx;b`1Iy~Jw3vuZv;w5|X{DrYZAo@cX-|*|P{8&QqNn;5b<8=ZJjq&ba zT~cZD-pR|?iSH#*-rzPv@w-qRrOxB2B(l0eruY`fgt|e4$CE@PH6forWlD0B=$9t% z?(9hB?1enllHw$^+B}{~q5;NKv_G8sn_YN0&_R5K6zD^gL03TrZ7@DC#a$qLnz7t~ z+sE8tfZof|Js{W<3o%||->`_AwUv`6YBa&{87g3E(7Zm@Qwq}w-7_>&{?HL@z${9$39EdDUA zh8_!9uA}r5jlZ~1h6UvI^kv0|Re~GygZV?LA5R$2Q>4`&_A_a!5fhzAB6?&#?uz<= zWC8Ahw5a0l=vRn>&kM0nN~ZR`9kEd7B$nX<=GW5;*3~?GT~NZEu{eYa?7bKrB|89{ z7WsIq(H(2ZPzuf4(<7Mo$I zwqQFO=n0P}{ZPLKibEr|zK_4qu-Uf7b{ zJ$*W3)>&BB`wfj^jOGLxqiSaLSTCd@xFnW*tyZFwSjPnmG8l>rsCNtVRcc&&RP(-0 zwAM!UCoz^m$4W2;8SLuA7CD9dSN~gD(itaoth;!+2;&!xzomBxaP|uhbQIRkwf>ft z35&0UA@}Z(hq#|O1Zn!a6tIe$m(4$tiE;`Rrp!k z*_QQ#b)v*h*thD36&c!eDYSVCyia_x=*0Ky)H#KlXB;iZU@Ib(5m>qtd3lGVM8yuk zJ+wveo^d#0j{_h1ZW6ughj_6GDU<}vPf=Zs4huFdpu^5)$$#T0mg{Ii$ELK!9Unsd z2g{JYG@$f#at#jf!j242KiWAIEcUI{e&;Uq_0@~G(|ANWmmiBT$sz-e_VUNByVxi` z#dyVmhWg*W>iil@GS+!$o|)ELno3|#2`t*>BpT7qD#4;XQG&fB^eZK>tpwgIftN~P z@tzan(@cUF@8Tl-bP3*90y|3Ja0%R60&hin#WW^h{Y->wOYo@@{1^!wD}gsi=w}Fc z*mV8py@M%sHfHD{P*1{)meiuc%n~DFpce|iPzrZ{#}Sr6-kwetwzdGQEUc`8&~Ntc zK4}HU9J@jka6)(})^F5!nV7jab@KG0No5+w zP(30ybD82^0&+ghYp*jZS}%{*1wA1d@5|A~!6e7IjhkcCob z#17~`vH6GHsw#T_x3Q2UMxyusC2;PYpnFBO-2M}j5-zOd_#ngsW3jj7dLnFJ`$jx9~)vSfw%-c_H=4*u~ zN^a&p7*sxjE_ZJZ$3VFmS)1_WZ>D0lggyyrmYcbOQy9`(7b;k2m=fe26_yyE6d#!^ z?;MphAS6Z}kUStfDqg5Q;$vfB?I(F~vHAmb2UQ;y)Va+Wr^KE8Q}T$A^kE}Z&sZH@V`dar!e z{cQTHkKxXYA#1+vc(S!-=!qw-1HE-~3{GFM3bT(33w~9wKJS$8_6!^KR`!uvXGY#G zvmoBpX7sxQZH#>%M9*t7{N%0|&UMOP+&J&phL5%eRuPW&(O2jG)h(gSvNGYFL(><9 zoxgBJC-aX!?|Qs^{P5zi^L8Ek+k0N|`DvS)uDv_dvqqea?t+3XL*_U|$PLRs^LhWi zPQAaT%zm(H@%=i-)0YNXBWu{tAq;!y&7;Cc57tmCD4-o14w0}cYHndMMNKVLzzmF! zF^>($ycWmt7;|ib48yHQ#DaDx$kZ_WDDpFB_N+|;2u(g^YApuS3cd7aPKFUoV&e!$ ztI{&Hhae?;L>(=@E$4ZYo9GL+sX-_8MJ_TmenlI3ReSdvr7xVjWIv5!zDP4=YB-0& zVrF%7LldPh+QmV?GQ6)ub|RKxFvSU9*wDj%YucQB!uzLBG5tiN&Y4Sm5xqB~dF5=~)WL@!g5L%77T)jaK)0x4dh0!TC@S-Qyvr3?>`kxCw8AMmLFKIBF} z4WtZb9VEGf?Q5V(2aPDPGR0_g8BJ3}#sv`lWQ>NOEc(ZOav?s8MFeEX$8b$C%-&*{ z++vuk#V~orFkgyc$|5EFPYm6#7^Z$PjCC=LVC@lR# zVNLoHvqkA^oZySm6bg${BvUgK!WwkO@Ql*eJi!;EDHIll50Z3^8~E|O(${*y7o#Z@ z76vu&CCYGBn(r%K>wxAC3ceUkp|DU1OTs#S&v=5n|pMVR0ITEPF)y|?HP;2_)~5)ub<#)-i^$C7YKJhI4^Dz=4<->SvHLc7r<``Z|(*jmPu zN;W<*M4??{JVvs&iXoJn^}?ik@aQ90vB{Es(UwWJ8k2*)iL+ahy@`t-0~C4b z+QGrc+s&neZ+jO9XM1aVD-5jdt=I`fdn@G;M0+a|fxT5yqQa+zvyY#TlcR^Tg92sc z=j_?u4WkN#=ICQ@r*Lrcb?|d?cXD-hYwzGj_AtWjZ3Sby_O|Y9$E>}ra7M&|Yi85j zx}{wCv$V6dwQFf>Yi*~*5rpHrc6Pv7T3cE)wBj zSWvUST&!2ba)LQ2Y4b|xj8u-h47wiUcp@sB4qOE%X;+3^W~0512aV=bo^B9c@(O;v zi}Krw)_fhh1icsWbbfd_R4C5x7x1Y|an;o_o{k!+lK53d`f@;X^beknItwN7+X}kM z=$M^Y!PC|F4ZlX{mt9-QaleFipDLA-_-R8Bn(NW=*vRv1{2P8IX#28rIPT0Ap02@f z`0WQjk8R+&lc)P#{0xy7m3QH2&;g#V-Ea71A-!`BVY}%Oo{pN9lH_*<@w*S2Z9*TW z>2LTw20r#Amitce{HXg{62G@d#}Lr;JImA6#j7OwnFGK79LK%HLq9~fM1It{`vjUH z7Z@3)4F!IZP7S$GzP}S_=$n2H6)YU2-5A1=|8JnvyhvYYD)2D6BK)W;Zvq;JqI8mO z5&0*6y+G5iC|wbL6+o8(nmI-3O5nF0G>41Q72!wW-VYnEmZcaPetFn(hC)8E{+|K&NQT!_4DD`{AnQHU?a8Iv!LBrUOP} z0ziB#C;J-tHlt|DNIT+D4Gpw$(`%DcHmH(6mfc0acmh=$S) zM*YMhaIXf#+@GzCQ$+J!wFwgPRT1Qew$zCod-;H^*^ih3))*MRmYI0{}>*rs3r7W~kf zGSHO_J&+0$3PvOuN<3pO+?q;-WeHPZatjksjOl2uGRg@%-Z8VN5Pv+0EWMMPFt!KjRs zOfYD`(_pWt5SXTv1}l?nA3AnL@^p0+bXrn6+B+BA$&U=_ND`-oCPNW#2}y9Egh;y> zAJHU_Bz@Y&IEh5yWuk~v*+RU?`lrIa53K2mDJ)xvSs^NLQ%XyxI5#1Q$`Eym^Wtg1 zNhvE`X)b%XI$}E_zuiz7n4XkGI0nVjC?j4@N`taPCEL@j8`Op_Wv7zOYeRV{9i7-< zYM|7o^3q6)?ual|*gOY)Y0_yo9QN7@8&;JPZ6+a?Wb|*y!Jk?jo_~eE;V;No8JP;w z=oaCw5OyO4Zv!cB)ad?!g;iK7^NP|EDl%q=tCR(_l9U^E2E)cJb_z0qDz%`pRNx9C zegh*_C48c*NP`p3a7fg$s+0+I0s2Fhg$Mybpqg3OuDg@#F-rdWT&K* z6g8y*QMXVyy`)TcEvfkE7$4jJ%^#{z=4ovyl_D#s(p82fm(n03ys;x48=oZ7t0T>I zY%&&7&F8yPdUXpW3nwbs4t?q`@;P2lnkevafdyG?VZM16(^w6sbWmI{wfHPp1@U!(w#A2wSV2J4-a6k(5dl7CZi^ltW`_0>qOd z@F&W_RLX;QXB?C@WD}_*(H9VpPe~%u6b2F$tqI!!=PKxkl8sq0Hc&^uKz|7vb7@?p z-51!G5#!rTN+XkiUJERx(t*tn*FtTwm9%zKHtwh{8!9+hOKFNU z?;uoWsg0CSs-$3 zfl!&3Ev1Ci4}rNXH@ZJwSt43VC9CXW@rN2DtXdbzp{}q(&TRH6E9W*+R_quELNbIP zR--dle3zp!r){tnE^HZqZd(XTPQewXG0flzogg>pj!`+OE15^DiSKnHwP@5rNnRDs zgD`SreBxo}6xV=~1;k3gF9M#8M1||>8FB=WEMypWC7VkalWQBS7Xy&q1}(;j;=4g4 z5KM?FBTx&j8%0tv zkhQi!B?u@fBq@eB=wSd%Z;=cODG@20K2TRM)S(+ynL$DlYp5vJq&}EV&^EAA`iYEZ zhMsBwyGe`{EVN(|K^Ys8!)DP@xVls6S{<%K!H_aSysH)~D98{PJd5rmPi#%5oSbFAP8Do3!_VmS(5jOK?(PSiv>>(1}iBCaS)R2-DHO|c@v1V zgWHkQ1;q>SBV$Kc)73V3h!1wFExRxhtEb8mLf3;RZw+BN;3~$B1VfkeVG0g9|PJflh}; zu*`KL`S(xeFP>s`c|9=24Z*l*E14CJ2v9I?u}~YbQcfXL%o(yTZeD4QVl1tMP-8G-`>p4Z=Vq zG?64bp;%C?uET}woU@2i{eMUdv1nk_gw#Ql2Vs>x5xGf87%%2#GTAb!M*NU&mX#Eo zVAPK3>>30VjmuCYu))=q=^>R~VhEF$F0eME%_dw~Qs9@0G+93*qVnJw;2r44KB^)} zsz})fD;g+4=p<>g`AkU$7Mp5hhl?nVIii>o3YnsTmLToFISIm&TMHf&;uEZSMI$kj zr6bJU;Qk8IV@srwC7y2m zn`sRD$io-w08lv~)!`+@YXqMgG?TA5qK%aTL=SW@ts9B#qUsp#tU!fFF%-p3(cTnp z3`sTaGo?ZOk83el@_GP4wM_!<=MnD7pg<@xY>Fz71#$>NVs$X@ktisaasOyMqCp)W zT1WW1vz)9Nt_wddOf^W+8h~k1tk|2O8Z3om%~u6ZIL^s*tf?q}s?3=sGYZ{+@+iQA z%m9+dYDCm`KwR|T0G2XpvW-QLtY3kZ7m^mmKsg7@P)|U|%bn#I#mrQQ8DD}ZyhD(> zGk;Ac<<)+{Ph3Qw_~a;(B~?gtd&S?}fkC=ak4WPCva&*qjzDazf}{)WStCMGzb%Se zX!2M|(gdk!-Hk8oynymR%;HZOln{cem?)vtO>$07Nf!D^6n0(6%*&6LKh+AoK_aO@ zV5w5lv@-v&2`cy}-Fd<2q3l#2QZ#9KhZPMERGj`1{c%JIJwQYU(-De>f`y0eSH!_n z5F0fBOqY)X0g2Hy8x%uYpn|fqWBHU1aRPlX!%*3jBmX+FDv2#72e(*)WAybfReiR8njxpKL-@MJz?D zpsWnhjRJ~$2zZYaS27;w*Vz~6dMRpjjhlF39DP&E%x>jC0V3-D`0m0|#?ncCS*1Z* zLZ(b9R;)Q-JqwD*c|<+|Yl|qleOPKQAqYRwMj-j4HdvuDtO=%&LB)9pv!tXdF2si# z8Wd+-qf3HMCNWT>MY_p4bYvBhX<1?WrL2AE3kDKJ;zw&#YT$=ecF2B86cs+!I5O?g zg=-;e<`i%_up<59rAQ40$%(R*g+%8S&qAx5)F77)HSbNYlY%#ishyt3%<)iKpX zesHG*phaedoW#(d6+9Lo;~D5Aim&G*JwMo~2K!HcG3nC6l;dGYE* zu^I+9A6x;Q#PW+q<%)xZOuBO*NXD}-zvqyVt$`;>7hfJI2rbBk=FSvBzyzxc3|Uh@ z<(MdJ{*DVOv@qK!_T;IdNfI(%v;~ZW)8LR2NfRa{H8urET9%8D_!`ucw2V-j#5l5a zvnY^kgq|f)Fxj)t6O4XFF$(bIJCJ-m_mbEW1%H_g1>F{G71wSNLLGiOiFYwjh76!A z504lqG@(@21uMstRB{djrKsFlMv~AWK5Vn4Mu*A~86foXb5@jaGDOJw4N!OLIZ$0A z+MRcE^!9|U5DJ_%t-LKN;zH>Wm4PBVl>|o#f{L?DtBX*ngQ9GVNIiq2;;Gi8xHg0c z0#FacM4%2HfO`pdCb-P60Mnc!ORp`)V3F^vsQ{F`wc#F0*oZmtwzR;^fO(N$q~^SyKPf z^+jK?rH0Y@FFe=(=&V17R_HKhTuj9EYk4(?yfRzVA^eb9<*7eA$3tL08C~7OKhIw) zyJGQ#nqKcrLmoS1#yl*$p<>H(?{>I7ov_mbr@FM5-?~q?{OXUZaNK-Gw`Xkp_gk}%JTTwpcB|TPx0WBQn;Xykk=-)G!no$D z6ss8=_mI)8y3d6=%d_uQY%%2+mvy>s+M$MRR-Nmy>C)`4<9_ZRyad)Q)hXN=Z+aM3 zyK?H2-=4iAulFC9H1q1a=t^fMzW1N`RO@^1xn9_@&ghyww70ky|Jd=IW`k@)K^>WYPf~xt$uXEg9MrY^L()Us3gtLj=E2>vs654#( z@ujy11l{=DWb=4yy~*F#VY?CXST1`WBg=^Q>C|&(TJ6TG?Xv2;KKi=B*~+&){(Nxr zm+6;WY{l-z=-TwFUc23`ora!GavBYP{b5Rd{U0@ZY`5C)H$ms%^!(&o9Jh+mxkoiq zGpoI5PPv0`GZw{e996f@yXsp8j&)nz)@CZ#d3a@PIb(F6&FV(fxqI}bgWr*`R?Q=( znclef&7hUt*Sq;0!>;TPo{9Pod!ppBIvcXv)!LCT;I{M1#%(qC^-g)FTc_EtZ}Eol zbB->|{wn9Vxs1*scpI+RRbrGFxvZDhpvxP~hHMINdUeg+ zgP(Ofjyt7qK0a*uiMYIoc59w@#Vt{cu4cE{v#uqE{&15y2aPuhGKlf*^v750^}8B-VE=18qw5)RVSAF#+tE!eG(EVd z7i!p7ytL5d#HM{(TV6igVLIIcR$3X|AEx=K{+2zeZff1aJ#WLH+<_m~ov3xV(d4uC zhi6XOv=t`+jIp;%F1vj6h5xnhM|a;kF>}xab(^wtk94YgcI3~XnHT0xuXd{4TC_5Z zPNR(Nrg^;^_yp(8u03p1n*%2MtF3*#X8hSYk9>O$|1}W}eGa30(*IZF*le#e^L|}5 z$k%^uT+erQm(9BeT&lA7z2<_MCZ?zl7~Sgg+WXVBmd>i+XmWM^1B*#=ANR}ko18Vh zR8GH6^Ypf%sJ*a-ST1vaKijmT!NV2ntTs*FU^L1*XWZ@K$3idqKRdH_e&dlF-l862 zbSui0|9JjcY*>58*Yjp4FR0u<;!8x#-B&$7wm$4N{ua%CJYjSrSDLQQ{`6r}-o*F; ze}2gEZc?L0hwaD4t37U=`>uaq_3_XH+Kwjk+|+2!)+Xlz9)I~hAn%q@Py6pf7Ps{A zyKCL?-YD<(Sxz{o#OSPNwpBOIJ7y9*%&+g>QDb-ZdaiG9#(YZlvY(%gd!&Rcg7tYu zmuGc*+RCJ+&7HS@y7~UHd8<}4;wHPd=xs4zS6G)P9ygX_dnt}4$z`r(D!nk=zy8t= z;~lG8_nYNdr{O65YnR;oZI7!LL>q5=ji!*%_1iu0`JR`dBW~VWv9_^=_o8MWUMyT1 z@iT38*`P7C9lE3LJI&}8e13NSgty*Dm-F9h!6V9MWNo zy`ys3&Np9-W)4UkcV+9oyxE@b<~CGo@yJdlhbaQ{EeRXs6`xq5=WY5MmGrzVTJ*=*= zQ}eusbF+JK&lk6Z9x%F_8kNTcSnIo-J9a01aCEn0n!UVr`qa5GzulxaD`!p3{)Tn| zM~URJ1f9W~(jv#S+;jNX!eztS*0g*0*L#~fHh8wc-y4n0Oh%UzdVgznwY62M zyMESaxj$o8rj>D@o)s?#JR3e|S(!Dn=VN;_qnp0%#?6MSH0LaPlXUs=vP)z7Z*v); zcWC*ox~*?EEB7_t23uOoQ@ANVd-Pwv|^Ms06ZYs(6c=7vk%=N^u2wXxYd z@S4Qv+Bdh(TXcTXsbAgXbD#F}FqnGT%zBNZ_LdEG`bRDtvga5qt24U#n~&(%*w=V- zyW^jp|M_d?J^v#kmbLoY&2wLdysOoy<$vJ@2pngU%bLvob4v2ra@ERKuUFmuO2Ecu z?z`WW@eWf<)jpNK_>Y=qIIYI$e7v_?syomBaqwb6lZbj5Q+Mys*%a_CWtQgM+~-f! zr;Xyc8;tJmt{1si8y+dw9~YS28S~J7m*w3qtsR{@Y`Qhi!*%G3KXKbK%7|Qcrh(-hC$o9~)b{S}V+Fh=L`HY&tAse9X(7mZ`uXgzm3 zrQdK$-78z`jeZ7qZ-O`Rnd^gV49DGnq|Bpz`R(><+g$7Y z+Ti4zn~n)9Czq9dNa?V4-mj<}Z;x)KOP^Oif2TUftz>kKbDJzPyI1*0jV}|2o!q zE{HN3iuwSZExGL19S_~3jkCM&sn|I5P}kGPHs@D6a`05>#Ld&aR!%m*e+Wkt7+v|L zw(?iTl2RGd+}Ys*kmEqn&d&j#hop z?k_yqs*0Z1pbdvQpKj~ku=Bo1B5ZZHw;ek=3=<+69_19n|azjUI> z5?iB3^KI`(*4&WvG-T+QR;RPaEJ^Jig8mw#d+L~_-_``N{HOIXL-Y7ge0c|E+# zbNS>!pNy6t-ZYitt}?oh%|5@MYWFDlV3^1Du>oD0w;AB3d%w|2?L4QGht!*$bwij{ zDct&*ubbBVUar#6ffc&!d>=T(=$&;B*Aye$VX}#j{+!XR8U`YaZqkO&d#aE5nEuov zFwE20=0~SBS7YZqUX8PRX57pcnSE;|A6+`^{JsSZK6#yNof*+{avN*RdLwMa zuhq>@`fs%RSMgM{i1d6uz5V_Dwa%VhGdpirLG4FB+Mv#z#^^S092D)_Fh3@5j*)?F z%wEH=tg%x@3|n)imfq%b@vD8&FMiDE{(3O7VZ~ifnywn};9-*#AiEfStImlvt?sN_ zb?a2!NY}<3XKhH~rj7DiHzvV$PQR{`&ks9a`BwHEr(XHl@{HV;(<|%?PH)0-V;J4p zX%FAV^bcsZV%6;fhkF|T^qZV$KCopa^RrWCfBp2lbrQB%GrI0Km+v02XYKncpU#d> zTD~rQrF{P))3R!_Ce4ige66wbAGmD-WnC_N5$!PX)Ew`Zx(Q?L`^LX8YJR8EyyM*u zO#D#mX1^M@Jw9+;45PCMEWf4an!&j%PR}Vb!{V+-`LWwPcg#_DZ!|G`S*p<;9G2e7 z=zf_e?pS23wsxeWUAgPy0*0LSoc=RKV`y-PO>O=fJN3aXSm-gLa0f@%ZIC*9idJU& zuIhniX%n6}PPt^DYp{6w;Z;X6n)G~(sR%}w8vCn$tE^!$`+m&KxYRdu{EI$=q!4#ZRAuIPL|b zGd$(5QMJp|(R=L{=uGO=t@5p)0fV%9Oz&3B{`g+kZk>8_Tw9zKLixBiHQl(~uV#iL zpU9Sc3_X(WrnV2F{87uJ>vDZO9|7) zd7hYODxY!Y$oq`Oo30<4{pnot=;xOjd2!q`MrXJCh5NkL8ZBl_H?`TZb>-*Q1H3I~ z=iHq6dch!r^}9OW;5b{vQ7(J?XmitJ5&mT=Tv`68`w}pQsf7t>oqmi_;s~S1OAwOrgMSzV6D+te%v~7wb_$B$suRH z+07fnaYqy#IVh&+^gtx;c(lEYEuX4E!`# zSEC>5moJP?ZA|pH?^Qd-s-Fw3ch9Io1FgG;8S?9MN6p+Rul0Ui*&nDU>rni9uAhGB zd-7Z4@Ose_2Ky!Z`7QBxAm0R=3|$v zoAzYN2II|NS6FtgWw5^M3DkdoF}mc8XJ%ENnO+#*_p$5Y8pD=6t8xB;Po36l-u6Ge zvH!e=YdNlAT?%)E{*E#eP5g{!w=tZOJW!*`^BayHuFck*ZhYNf__)CVkn=)XcoR?XTwdtqk5Yd_VSl zxlvI`yD_)O=&JM`>8$(F%gcOLYNSiqLD4-re)y_;cVPbAFAcR;&!MTT#fwWF3d`c!T8mYhYEWlsxY zUE5aoXcKs0?a+Nj*FWAIhpAo@ieK~I4%3E~{it!OLQktRm3$v~Y6Q1m@<)AcW_-j) zx%Nu*hh{OlcF$s$YUf@0W8RL8nB{|O-&=k({v6uVM_Gq{2Q@9P6oj$a(#in|b`bX-$oa3{n z&y_oswoLB&$GD$#k{WySnqk01hSM&7R zR(_QNxv!36I|QT4@z?m2=3R5>uvLw>)^wb9 z;nASF`Jo3lU9S6e#(`OW8^bv6Jfmxt8TCi2)s|bz=ln>|YTdcuMEs(m3kJ4wx#yZA z>$7)47EZ!9WZ|~H-1DpPn4HF%?e|x|W_x4Iqsk|f+Vp-sA^Y6)VRNos#W;`AO<&;c zV0SF|o7FbMvR(Y2O&VKu(%@&)zMR{fHZ<4Ra%(!ron&;wr>d8~esK2nFWDCMdG(ft zyl{NJ;(hb=)r}gujTx$AxQyefG@@{Kq{qw9MqeImEPx>2*u5gGbvk?*$M?tOMhgIf_Mek-LiBPg zG&;32NEj|Fv#M zPu9vVcX(6vyA@t6`*X#mWXO3hqYFD;FS}vB`hkvW^OkJl!m9SitEEJ(IKi-6nUb zZnfu(C&$@ChH}|w#||0|;%xesJ9}c_-K*u!?|EIbjL!3E8wc}q=+Flk3)jd7#quyn7@B8P^aq08@;&$UxYnFdn zs^|K_qr(H=oRo+GfyrZ6TifHdWsH^OvU3rq$tOAu?S2L1v0SFrY~UaH;T<}fSsK07 zUToFCt#f3HL;L5JiP2hQbFqT`VB`m*8xmkWe9^aszPDHJQrlbeqET(XFL^C*HTh++ z%646@?a>`*2N_+iuBNY{nny^Lp8k7&O-p)p>2`x9Rqp;7G;>C)(}P{#edf52jP6QV zuMErYc6q-2;!nokb8I!#vY*GsdQ}!R-5XNpY{v!>9M=xAmdnOmy5e<6KIuzdpD(TV z^jN(ASC0O)&51L{-@iV6M%nQj-e7)%(am|-T>kat*j!MCX7zLXz4~CUrc%jMb1$*lx#qTp|upY;D8C`flZg$*&PJOi&HF#R_g|%SjX@8mLci+vZ*E=KflehoUP}In;YkMOz#nHjQ&9dj2-1NpGQ?UU-EH1f9!J5<1HT6+dJ6&oY!*Z zu*g3+Iy$Z_P(+KwoGH zqiZoO^WcHuH&xyTyZwRYpNv**eRaKV#<+{SH{a^D1;_IlUEL)X<=nLI<^KrF zICw2)E9+T44@aSk>Vzx594HC#J)`5K*n<$1mI{WSQMH4%JAxy*qmFqrKL#``ms;>kfgQ zGP2?@bip3$A4FAnU*FS!wP2f6YiSYB_4=j3~FMo94F*Z8m@Y*R>e$ zGrH{A-?)7P2s?EvlPrluj^cYpiKjYimeT}BQ)qnVOCdawkQT#g9UR%GcQDEOT zab>>08kN1@*;nn{-CfsRCY`*ttWgc!b(p7Sbkj^vE$#k%rOkumE^nUOr|W4&tabdO zY-Gr@SDzf0Y3*x`^$JEe>aIi3pR0~e+pImu#4~Zq*=6@DHoo*|*vl~kj=nm6yZ~d+ z`ltitvb!?#KW8>cH)zqNk@wgqc0H<0I5u)-_n6;-|fDB#VD7D zXLp_6*`C|E!0IjZv<${@a+&eg3q$HmI@)Hi?N-Z8A#OkP+cv(^`r@?w#@)))3_Uur z3l>HhUDs*d%I#krJEdCmwY`02c+LDeVp5-#)gCUo@jd0tPuoZ3Fz#k_`&MXO^fh-- zZ)@YV%lY(;@$X`vE+5%iKX_e~x4eFTqkNc~V04u)edv4V{LpGxvdG=?^;Ncm(fHLn z9$mHm)pgUkI_F(iW9hXe#jo|$_-lDT{>rs^*5XO!HJ4hN9;@knJ+s1Ojd%V(f_pXq zzgdi~;S`@KWm_aKsJQ&%6UU8L!>f<)vdrD&(4EUMmo4g=+(n=60i%2TMg3i)<&QSr z+^jvr`&pX~tsYusHK|gyZgb7~?b^gW&F{4a>qm^PYrnu&vGQ48UdVzi1G4IzJ&F_2h|q{^pFEN4h?Kv*N^? z%~&^JbRT9!{$V)aa{IU-_4jJmYYa(w7qrX${k6R3{Y|%Y-r95$$GNtl_*FOB+0II* z*X)YFJgmC>I(6SG=TO(>9fyYM+uzx=Chi@0tzvY?%U2pP^2?Y}pUwS#B~S6~lH_Mr zcX3KRpX^q98f1KWx`E@~FuG>(cFXpKHFW;tVNkwK^MPl+gb$sk@mGG=E{Q>3D_zi- zjrHWV6z=G4mlMA}a!d)acQx6)-Dg{?#VaS)h${2?#>Nm^^L2hNF(1b03g*9_^mxab zwCA7a)mmGA`aX++YEOr^PF-bhGRJ4ZOydxaJICmjZD>^EUgY*=Rog!fTX@Q`W|l0y z+1DC%!e+@^*9w)5LH%shj>7%kYQr0=4n4VZI{offQ@?%W&|eYXbSj)$v(-9!_T}{- zrXxQX-JDrR>dZ{(q%pJa^V8obSUK2XQ)1I6(_cQ(u-mH#z30#t;-Q~qCCs+dFy3r>*N>x76n6Ze_Rv2tFQk5@@AI>@?@{E3OG5g=B;6QAQ z3u0%Dl44Yhn2@dgbz7m9r7#k5ApE$TQ*s(Ge8WECMO6g_% zl5q9``!!2NfQ(_{fFyD;;J@2@zrZ<%L3PrmE;93~~4Ymy?xBMUNVfoqy#Mty-f&2bxtB9&`>T z4cJC-Y!fcI68H~lCzTxz?x|cf1ckvVpMepHjCpCuFF|Y?|Ffz{E!rnm!fqB#hUit%FOlE^Te&?$jYsWx4qxW1=^F#ea4!6KV9 zI4OwEukgH76C&%8h0zJn5@J?*sgHq~!emveRFo6GZkFoMe=l`3>LXE7;!9=h!j7@< z$6-n(YjDaZj1Ih)3Nv=%1Lhw}$mah^0b?IF$9XEx^UDcF%r#P@Uc>j7c3;H znz-1Y&2xL)s#+|Ock@B&~kk&jB>=6Lcfi#I!a~Q09`9G zn^797k(3Y z+2VVT3eEe^krEmLL@X*n(Zs9DEh^5AY`v)}FKYJKZlMwwmEO$xz_7#taWqn3%ZI8D zJtU2F3Gx14`p?Qnx&%i52Lj+jQLTAQ5UiJ#1~0PRSwhPHg9xLOVeVz!5f`b)7sg_ybNM_DTi1mMvF*>{9C3gEtPXYrmZyKp`%}xzkTznj+ zVO8GLP^b@wEtjP;bul10Dh4%ssSQIgb%8-hyvofi366#frK2yxTwtm6RYen$D#i>$ z1=L?`%8iW*lN9Z%YUK>ZCsmIbHBm!g<5dx-Le<#+Qecrxlzd@{(OUJGiBo|zwXTSr zY7!Hd4%qH$)mX71sTsKNrEW}I21PYy?P{~@$f0w$LI7w$fHRa+>->R5I$UG_@IjDMt4^H3%6OxI8 zOF`K&>LGiwrBtNZ&RY7Xy0jAbN;)ELAkRy+JS5Ycs>cc4vY3#8%KA?gC5;VBQ87Y7 zsYxCfKS0&)9dt@LM=I4))uhfFvQG$!5^6xzxY6|nDvAv0q;1yW7@jM0QMFjnv`J}b zDA~d-jY$KPo6@P2AuE0xRw>mDWTd(@1jWn{tF8yM)>j(!6y{HH>o8k`R54P@sQ`?z zN~evd0$2)-1Y|}1zS2pbFeb1m9d3MO6^71?&`$j4I$01u(h8oDA+b?0rE(gEUrR_* zePN=|1SsZw6~*#Drx+!iro_Tx**bq97;eOaiW|k>`oBHZ6p<39`gT*6 zsj8<~tV)usRG)6=6)i3zd6257bHE8nOT;pjin=c(4;7{A3jm_1uuGed)qn4e6{;ZV z#x5|#59S+iB{s)ta$W`(ajrcWXWGBuTbBzHARW#l>u9E51+Pp8L$6E^c^8k-FCDVJ z?S_#W&MWJX$C#7)={>YytuSI8JB2e=j?0c*kOkC73hEM3O*vnI!-<^C)`1G0xGZ&x; z%XQ33Pb1J%cBtTR3nOIE6VPmUSs)!hr7p*}Lvj_- zPm1Wg0nYFAE8xE%l!Z!qdGceCK2@Y20cR2Ulp!So4S}OaRt=9axAfDy08Y#ORd5&i z(^7vNS-F?wkN);_WGiBpH9^RzlLhx3vr_$_WSO#OhM>k5nNq-)4!%6IQhVcTS3yC+ zNRQTsM(TUy9)kZ=!1`W?vQA{`K6?oDfv3K_r>p!|0{@lEe^r1i!EhJ;*~3_Mc^z3 z68c#d17YQYdzK0i0aoCnnuss2tV-TvF6pQD1)P>!Q1AxX-CBQKH*!)I#}cy}S=y)~ zL?w`oIp_gdd1mT7GlFN&tc(*>+EIUuxr3k`TV&Wk-IDbMa-w^OIC+Mp%E4sxmokHz z6jCM$-6_yXKKB&y=@AWq;vEf5284WZA8 z8A}9LfBy4|@afDGH!8~$+wh;-kR|!8k594e)Bv1yKJ8fz&H)u5Y|0?h)b!J5FhEm3 zeIx_QCYK%kRb79~D=3I(R)V4T#2gDS^UAblD(IN0>6z&Y zN`G8^a{5P|$)IY01oiI(&tWmDk?>NaH0B; z92UbtD7*AIMM)=5egZnG2jTEy2;gi1jsr~12jN2jpAg{AfG-Ged%)KPxE)}s`ib5O zFjb=jHvl|`PuvS5UKNrnrxnmO*aP&eFY)zCrp)@1S5~q~BMX_0lqt1hBs8f5@#(x;Yy(-z*kWp!aq>i_76bnENuYn0K%|G)o{RCM*qm7j>1=%Pev zaB~2`#u_K%HsODHhC8Q#UML`KxbUu25_!l;0UZZqfJcK$jngQa&XbH%fh2aRu zg+T_W#?1g}aK>o5c)CV_dN5ZDKtT+02K0;3B?3}oVN3$lo4L*dq``2j0ckO4Cm&h2#^nhnga4=kOd$=2H61W$eI$ekgMt7BGN?BoKD|o-^<=o^fWjG+4Jd*^>i|VEh%N@|!=SBzU}+U` z*$F6`L3;u9W6(iBF$_8is277y0P4%2Gl2MT_0VAmW4H={LKsw80U0VFV?d$IRSqba zK_-9_7)0HU{tRjgD3L)HfRY$w11O$BEdV7ms12Y23~~T8kU=hh1~JG3PzrI{SC{uwhdt+DFmFFA{$Tl1QtBE_o9S!{OU6UdFw7#fU=7yH(#l0$1hWm!6 zB6C;cVi7zl67|}MbUCgayW6iU$3h^Miog+0Mb26BP2P+!Ja#c4O{)s8^-!xo<{^n8 zvBAO`4(`%(G@$F=y0Ks?3*Ta}m2t;iJ9a0p=r0EMT_z}eRYZ-7>q68hvYx0O6Bw6< z>IU36+``w+U^{xBqR%9{;Z^C?2bCf$>JI$heA{>{f^+$;NciY$P++jn=KF+eo)Be3doOZK`Xl+eEj%W_g*hW@}j)U3X1={BNXL zR!_T3MX*E@#kGfbFFf9O#LQRYGoSRw5F}ObpyASr;U=l+sozoiE^DpUOtYdIWvn6M z&u57t?%r%?-~u+tj^sp^IuAtpC(DI0!nY{Esw}W!EEi~_8FTgmc_t%|6~0C0dW^X{ zW1gH8#augsdJ3ba+hrXMIxDn83pdraW4Az34Mc7v*X@k9p71SluEYd7K_XBxbEw%= zHnyFnhOC)pxJ*kkSf;Jn3-4}tcf~sZZ-2bK@%F;o9d9?8fu_Bznr1t^o6E{*+5vBg zw*}r!@HWM}KHesH*T%aR-qrCo#JdvS74a^Ix1L@ZEy`kPjA$l6v#DN#p@>mq&F*>z zWi>m=Dr*K3;0wTq08aoO1ULh5BA_jRHUu;WV5e8MEFz?*X+b~}0Hy@g2Vf#At65u5 zr>t%{#Hy@jH9Z|8fK|y^AI{~$f@1VZA|o4$k(+E(4JM=1n}~esRr+^@{+-7^4ah-T zrVpJ<-A}k(^lvBq+d}^~)4#R!Zw>wXgZ?d}fAi_zJo-1C{!OEQ6Y1Xs`ZtdLjirBS z_@^z?f##Rf?V}lquV6fUE@=t5q=j56r`Z8%XphGg?k;%j@wCI!5>E>})_9C%HFSsS zHqb1K@*(~=V!5G(vac+BRCUxN4QKZfM}{+HA}y~%WeHUoDVv8v5qagBA`u+f)>OIAfQb*fBTx1nxhN@7{f)G;!BB&@pTFhpw*6l);f@p#AK-3jkNynXTZ!P_2h zN{TJsHh7!i-4yToc$1>lz}pD#DtK4MTOaT8dfG@*JA>A&?8UNHf?AE9=vGqGjf-E= zVb(+UMGGAWEmZ5&s;F_>nERjVTBvwuarMy;_AxN#DpqhHZ^93)w)k^00O!7Rk2kX? zN(w^-i|RG1u}G!Mae9jS4rKqYeHw5E27U;TnoeIe)^rkz+AzA-)>lnv`dS)1XH^C| zTtKUHz7*Scc)s8ff7Cu3>f&NOAYKZ{hU#1@RhkxfQ{!uecLTg_@uvQDbG)gMXn{BN zJ6!OlK8Y*d)Pr!tTOaM7J>Jy*Ip9sRA{bqy(&aI&@K!^1w8mQp?>2aMKvaG3rbf>f zZ<>Mh!@C-Cpd;SKcvE;*czfb)i+6jxX-c*O-ks411>jAsbRgcn@a}{+wRb)7PQ$ww z-c1p|MtF2FC(T1TtjEdYXmmr64(kK*IO_TFxN!oc%VjBWYZN$G-4*EeD{zMuxYr6C z)a`fy-6kPAhPa6}V>#+(!lOs{&UU`oM=_C_p-#i2~P1 zfpb#e+!Q!}1+KFK7pK6{1Sg-i5enQW1@1KTix2m_0O@eI6u7$z+(hUXPd8P7bhz~j z+$IH13;IPPQ(aD1fONR3fM|@W%NYrf4p$#gZ-#3uKsuZaAksWtu7v>UaL#~egsscD z3y==y56GF}NZSe0;X(kpFkFNH>97usEyE=PN01J;6cC>d>aFu~p>ZpZqj4*b^T-S` z(WZ4Expjd@ZW_(kvAOW98y=av4x*yKi{{9@CPGB)i)P7yqzST#UEBfP;}JB&hA)~R zbI92BQICDm%y{N5n#l%^=E6ZibN+ZG@UIj`kxCy~nKZBal!cR(MboxIs1v)i_sHBM zaXgJra(BqsvxI+L!7Fpm1@@n&>Onx$b9m95ZRQ@D1s6C6nOI;-b@Wkr@R246>pLC| zZaV&(Gia#-m!rVF0z@^52LAXl(0aVBi;RJ&eCr7A^$|G#d#T{?h52v|-)U9}9)SjA;H%8#Bj%^H>uVV?)VPkn7M_SF}`U;RP z8%guHqYB&!1zp-S~$B7~2$L!`-wvGu_t9%+Y2pM{UCOqvc*_~F+eh>R{5;g0-& zW73ocUi_S09YAS#WGvT7k}@{?Mx{f8&9I<%252N+=+04S3|O8|{y&~gQot$@}6%3!WJfW|OLtR<46s#csE@?ZI*)|h_urtUTWOBE(b zg2S+lo((pCJ5y4YRT8vf1GT_!ty+t`j4|IqGZyARU<}D-Iw%N!+JR)j|F)`? z)X5HHj=|_;YofN(!@Qvu=H|56>;iSNS2FiezzkrulEAF!tG&Vh)?3!+%7`K}@$#{< zWz0e-lPW+c=yCR5^p?=E)j2{OTxP!-c%CN14^APxX%&XaU%!K zXQnO@@GAs7>CXV*!GrPJEa11`jhZ8Mw}3w&;1A-B5|)}P;Liy7vv^Mg{)&LVA>eP~ zJq`H#0zOZ`Kf!wz@UI2@djbCe?|HyepMd0mBE!;0HP&K$YvWD$asr-KR+izrihwr~ z@HOy88dK{E_=W2SXQQT?vV*3t;l;b^owj^Qc^kPasYl+JJ_0;EGDYSwn?ayeJk|%_dFY#_QD0lJJIWE4lpj&L9sCdF7kANA{h=SH3V-?`oU8@DOsRwRBICE#*O!0lAvKBe&+qADvBnWAtM_d`K4EFhj3 z8vvBVsS08xj)p0PQ}myEQKe`ZJYv4Qz*ah_ndR@bDz=3q}2W6r;o?az2|P{o_p@O=bpQq+nWk#{}qT|f1%2>nv?tB31zf=fOA zKaSr&A=ah}jjj=~_{T2|h5F|;y0O`Xk*VT|b-Me0kq*bzs?>^Dhto_ewYd9gI5%_{ zRD73eVHFBbrJl9^7ppUsde-_%Jqrp?MJXK>8qW>Hsr5aLFgSxgN{-$TCL7i(F z6shVoC`VPDFh2zXa>RCjY+q_oYXLal;CMJ{k>MZ2_i}vy9^Vwc|A24W{M4H0A2vT% zSn2;2^Z%y#sU>g&Z<(t(`T<;&CoK{6Il7v~szYhh68#+i z)72cU0-lsvEm5nvnj_MN60Ie=*j&xg)o@YXwL}}t)f~MDE=t1|(RJu*jxvBzdbNnI zLsxUO7ck1tmT1geu+PCoDbf;^&D9KpxJulXh*bQnq&*DRXC&VJ=4uu#{;0s-2^d|? z5hazqaBEP+LkNo^Q_ui3# z#KJ~3v539&bNAjs2^RZdS)onv1Y3FIloN@R_uf&e@au-&IKFP_js3c*H}>nc-q;1n@8|hs?XfD6)t{>EtJMQ{HQ~83s zo@p*O1Lr!$SvUK-6kn>V0~)apZS8&c-l3a*U8txwnh9e4@BO*0eE;o@e-{EL)q9=` z*Zug_iH=OkSQl}2broFo(K^%;^ESY)gp2aBPIPR{+2Ep%{X62q%8~4(gXIaX-xXLV zT(n?fuMu2t6;}^jnAZW;2iFmCVHGNRo4By9#MvD}cfs{;aqWTY_rNvzs~7}rM%!0d!8!pt9bLldaLT973U&{n*x;Ws_-FBb3h-kFr+&ov zU&Hq&fIn(*;3{z77(D~{69)fhgCmdVXMjI#@ShqSU5`>itY5^3dKB|N9p5^9+1*y+ z%bmy!zudyF!M7FuYYl#b!Kq7~33%Gzlqbw@5Z|-$9WwZCgBS2U7jWvI%%55m<8w|6 zop$jx2B#iM_#5%P7~kJC_-`5f_wcu9`J zz{N4S1(I4_&C%=O;^^FhO?K*Pj!18gYAq2dPFHjEZn!x5wM6eVS9A1nxHw+6M1N$i z=7{ruV%8FI{!bTleYiN*Lf1DJbbYuu5<}NF7j%8NIEF&kHy3n$(2RA4u5T{r`fzb{ zhOTce==yNIU0~StA};9qaJ@}nJOxA-bbYvv2#i_*U092Ui`qj=R5Vv}GzS-Ti=RGv_c@J%T>Tx!{)ksX^o<;f6 zQL64?l=kuu5M?ora<5oJeU?YV5ZXI^$RnZW(a`gF=%HoMr{Nv~^{9F9Fl+oj`up!6 z4mk_usd9WFT<^!PF1if=e?VMqXq|_|MUwhwuIPJ|ABUI*T{qTg11^;5`QK#diYmjKPNtz60O=fWOS(BL*ME zcLwm68+_K_C46rMe9_>qG5BlE|0eVQ2EGf3_YQ+|7$bfh>~6!C{gimK&k@cZ_ey-( zX9)kS!9RyDhT6ri82m2`{s_Kz0{%A!f6UND zFb;4Uk3*-zz6=-TT8o(7>B4}9|0&@xpqZ;V`bW4(s}`!w;%bh51Q+E{i)?eHt2t@_ zo|IB8QIol_IS($%Fl^2v#f?Xycc8l=*c7jX1_!-t(HH_8P>w;pMM7DmD`Zh+><|i{=J{U z!DSp@u6}s=hv)UY;SQc$#t{6&Qzic&Hpr((?0h&-i&M4bOE>r2`^rl@Y2ZrT^0@-A zxB|a=(Fvax*Pr13=Zfo#`2Tt0as$(uKyG8jiq7{CgTpR6Ug`||Cx3oml7l;yBU94M z@)eu{8-&%jR;(7>EAwZPN1G&D*6ebDL~ldX3ncny{GlN?f>j(EI!~f~qQW+Eo}52f zdbowdG8P= z3{VD@MtnJ_(0>?T`rm|a6Ta;1n8V2I|KE@=+we#D5{Dn-OEn8~p+ycF|BCMy@ckja z96ZiKI`Z%ud?~ay;-^BJF5RW6uss%v)e0Z4>|t;8u;1`7if>K(4i97RQW#68tC|sz1EbXs&*c~4B1`op! zXYn{^R9sX#upShn3cJ!=&5^FUKz!cu3{U=-TLMeFTYrdGBrZZ-ufi|hMcj@OD_4`R zMvN8st;3JUPxLRAJ$y3c7pTRToLI73+5}2GTchf; z>y})H?L>Jzi|M<^pp)BZr0u2w4SWfs~j=Vlf5N)J0?t`@N|Xxfi>7?lQvZIbq78Jt!r ztOjPDGv-cZH?&2k>{9{LlNBT>LY= zi^GSeWGtS9aevjyVE?R(F19Ex-y|NIZWZEazRZ&+iQHecd>=z#T~vbuKh2v~M9mvk zlo*>Tr~6xkLu;%q*7!RDt65PSt=Lf80gtS7@XJ2}G=;jD;t7G(oYfeeRmN{@WpozG zJ8Q#fk0T(W)OLUDy_#BGO#Lqc3(F&axj(j;rcf7C{77JUIq#Rhz>9a!yGy|_EcB#P z-BD&Rmya?-`Dj}@FU2q3eRWD4(UX6|)|hFjJH1xU?R5=h`_hHM?a^`iYa;az4djM0 znZay6-Cf9J2lInngMHDzJtc8!EzZ_dZy$nt2YT}n)7H7P*}g)5s&DIHwm+4RG)=vQ z4GiWBTZVf3@<`_LYp}4c!J)qHfqWsG&JFhMNVD8syDj~SW#aU(qK4PXia1?^0|V(U z#jVl8cBXr?-Gy8_yCa=NL7BeYTJI(c&!+na^XWpWt1F$$6}r;{z3Fb3KXxVxt+wVf z5+Rc>CvvLw!i4c8Zp z+*Z!1L7c7>hzdq12(h$1S}nXMpU-SC{7(zhSX<USce9q@hYxnX!NoyvCgIFd;Ebr$aU2Fs=bzuc8QG|(mF zXU1Cxhmf;`Ut!^?Eh@{l>_+K*eOppp+XeUMSvc#q)#Z`OZbRJ$ob0-?vTWm}s|?;d zkWXi~rn=G&W9x%gSEjp8ak|Ff`N2WR$${Ny*zVpeBvnqsJ1l%?VEX{bT^P);W*WBM z!q6`PwxB|8_dq_i%k{$z73E%QwAxq+U$1#?GWa%-4&>|U9oQzcxz?2hzDN&j>m5il zScywMy>4kZ&@z!|G`QZyNe?9Y)MkUD+B?F&c7wrPJ70Uf;&`LWhdi3j<}o&G=}Y$u zp3e`%dNV!gtfsli;F&aJy$x0n`@LIxyQHf+dcDBnkq5y4d9*z0+cnrtLRdXsXmNyp zdk1!;`g*$ykc2M$MHWtu&-K0pU2j)cI^B)IL;Fytg|i>CpBa^eM^hG-BaIjUhS(YO zjV&%bZU>IJmWAfuWpVlj(M}cPR=0)aDQtWTYPxh71{v0G_--}0jfdU6x$Wp5eZIci z!gRfTed%o}AJ!9w858$ff9y@>D(N%EJ(sn=L%G zEd>Qf^T-Bix}Y05B#3)126-(Yz9S6F zL6_msq&W-E?F{l2*+<#khjuWWcUd^dKY*4OP0#WAZVMY2bi)NRPwhaY6gs8Q=_MA2 zw9oWH59`hhZP}jQ4f;YU?CNoOy)=kt-HHvB%ct@~Im2a-#SvYlkjrCy?sw^5W?_&c zL)ly}w8m7XS46zZfLkm)HI(lO>t6`++-T+OHQ3EVys;1?I zHh4KrZkAx`z>oCR%VV7RGM)sG^1Ki6zgFYtDXPuubVGO;a}|T-2D`TBG{pK1<|v6U z%2vlSn5QJdMBkHHjP_T|RhERiw3w?{*tT4btQMrh9L2(f+x)x;^O6uQsIc#2P7=b2 zhV&iGMGOvM7StE>4-e-I$&J&PcO>8#bc8;bYb4w- zB&7}J6+xJwEM;LnQ2{SNOIBHcd4+{_4-P;dWM6>QRQf_Ac*!`VP}a`iy=ea9*^|*1 zI75!#?3F&ygmRnl+h50f{pwC%jrJf6ciRXb(ob_)V}xg70Gb(_#9qj!juYMv+fpmx zrRX^M8Cle>lC;`~+N4I+`I-H1wUvDr5^ky5hor~JiyejHRB^gEBc#!em;i%BPaS8U zJQaCrpVYe40Y|-xN^x#Qcw{r7M-aCp7bv1XOJJ_@7t>V1u{eY z-Kl)a^%2MlfpN;@;z2$LEC&_b#e-ZBSU$_4QuP(cgAi8eGQAY?AOUCI47(cr0yZJ( z7i&=GE>`NcoRfnTxVtBki;H@gsV*iSCPm;L0%<#}mrX1;(PHx~?k z9whv90zTx`{&InmA2%HYDXWit?tw<(UFVT*SL^Eha6upVh$xdTMZIbx zz+~KgO5_q~QTrUg-CwKR+eL(ymKF5hU;4!g_b7pTzk%&@8Onbyeoq1k(*F{;Nq@T6 zn)}06FKw&g$-?;5@V@w- z!ggZc$LIJ9QD@5ix+tF=$Yn77%Xekao`ltV*ig5FHFy|j0F-kp5mV*yb;$6h1!0o0 ztBNxV(^my~zK|5yxoP=uki**NdgMdB<3q@}x;$WIg%>G8oJZ){9M!azP`4Tz^KV2x zthbZL<15DM1iY}m(BZ-` zZYRRryb~3BOh>=>sX)Kd%FiVEIbM>`v5Q zx~0@jZ$%|vBw?to@j?pmIS>0!(Cj7FKW~5^+swcN+J5Yd?NMoV&iqVsDfBqdQVMW# zY+Z!jIv2Nj2X1GXpFcRpvNoVS8&Fi2*z%6~C_lqak|zx)A&@Vc{zH~km~Lmq$B_Gra#twH{2|%6Lo(f@?Ofn^Yc>$H~sVmj7p%dzs@Ow z;K|vU0yK%DjWIP*Wms|FY%O98>A_$xA{;A+aNILlmSgP6y}PrIYNuJD?d>_*A z#5~8goIqOg^b<%+p1uWc@^lAyy1Ffa`IqJ8H_ACQkvUVD{yFb`WsL)m|*na-Rv*IZ9jq`te8}LcZ*`?g!)4LQ znVvA%$5MP?){S|DwMCQj^LUVYw20B&kQ%RH~RQJQ3)@*LRjxF-sW(*6?Di%#6sJJbs=n5 zG&(GbgMy{K3EvykM}uM}eQZYv+KE`#U6k?AiAL_Op4UXFvN9GNJyobgbx7JNK5!^1Sql zz>j{xzDeBJ4{FgjZ>dvWIv{wJM@u%$xOx*_YdTpV5ik(Oa-=?@p+%)L*d2V(}g5!Fe z2it9VZq(y?el#+>0BjuY7ev!|++h-`#32v6FaqDfkTPGMEkQ7Qnp_m&>3NvEhH%(8V2s1XZX7Jk&P)Y-v=(%q2;yB54Uf#1=Y~hig@u{PL-saCT>hm} z#zJY|-0)b)Z_g3lE)0+2U1#W#z8;s!&6878;9%E_WRCM3bfJT-K-&JE8+HAHKDuJf zA;f1t|8k9vr_{~aX8{r$PnCYpaY~=~4(!bakTH~F$O>e@F~r#<8{p@jc3CO(RF>3cJ z>+c7w`*jZE)S1-{fB(B7~xG{5%pRg+wE>Ai%sqkc28u6UMrul z`%G`7&Gk$)=>I_(?(eYLTu;~^Ii5d&H0--LuoflYTs7+_p$z z7F&3haoeK|?ParbrtdKBIuA?c&9Ez@t+GhLy3+pluApr?&^F6e=GoMh{Q7RA^J<(; zAZ_1ibar%jyOcLNR~*AcVRCqC-gxI7fH$&lmbtX6{KWYH)_(lh&Ac%8kd$Q`w;u!y zbAW<}TK^+2;wZ{2rq43Vp-dvZcFFqpLK&JJf^@7T9o{2&Arb!eMv0yxRZl=VJ0ZhY zta&feuy0Oc3?{EH<()2$xw0}WnZ#b?K)#IE{WuQ|W&it`H|X~PeA&mh7$0%{8^kBQ^QfDdMJQ#0kMY1UJ%+w`F+5SQ)wapI0&4((ap zp1}BCoH~!R<#()o$j4&wf(j?BZ2U;R2Y*-Pd)SB*eE+|}=Z^m|*PSVO_K)TELKlJ!B-q#5-5q|}l11fOG!CKHv_Zh$v5by?gpek?3o}54?k~i9`$iPe$8OXNV706G@ zg1uE_;zWf^B(E@TDFG)_aG+A2>Cm>H-nxK=UD!(44%kCb`x(^R{Vie+`HR|t{rR&4&Qp7RCcvDz?FWDtk#Itj|wP*_tK&ZJ_V$2yB%ie^lOnA;2AacGWU5 z9{@VTRv*6Wb8t490o`nj|BXp=9ANIC=SZ7gdtn*0xaD9jK zBhrsFar3qgxM}(MQ-pDh_$s~}BQCT)qx2qy1|F}kKxWckWi4ig%02A*^Cj1hn7%EV znw;UD02u$mFqYkpIfU$o(-6_2m}VX3O*3QViAl4~5$6tpO%-wXio_#qv%um#L)(CV zC*~OQAP3Az5|3kI#={D-@W+1fdBjCuL^)(Q?L(Zi9nw8V)2Jly);#_U@I|bBkIjxt z71$1|(FgtMR|L3;{pl}I{v-HZ10>jfq#fJuK&>0&x!YTImzhkb ze`l&UzhOfM>a62BVN|4@Jf~l_%1d~CL_g1;X?TP9apKJ6{|XJ?l6#4Ud}=&pFM*$; zdF2PQKp=phDsb+Oi{rKmtjptZn)v&-JG@R;e|NrL>v4woZ?cSAA|i6Ww~+nov@G0l+9{kx#7wSv5cV)^B*g<#Wx>CMv_~TtQ)lL}byBu~2%LC*9{MkkTJPjIVaF7 zGqPmm_5n~1pACNd8IPu%1KX}KJ%nkaXo36M zWPbtkfl5>RcL5%{#u5+YVLm5~_nE1U1&^WZZ{hdMvh|vupNP?M9?=u7TVdnH;?Hxr z9!v)@W?)_@@&vOlfWk3^emRn0 z@3~9DclY=84s3Vf=T(MdxbC%a>HNyDY+Cl!kp>qm3G4UiF02e28jvEH?xM;t)@8@m zoWrL*4#%nZ-hr)yZp@TE!S>-D*C2^P?DVK&4zPmII>q6tg zVgvLoHSv5-)o{h-vZ`SPrJS|rbK^KXh=a^yzFM~=O!K{b2^^>X&{V|dilt#&2J`tr zcP8|COT#^HUm1t_BjQ2{!}Y2v;lg4Tesvt))i;>)cCBk-xI1nsxOOPKD^m!X#PVA2 z!@?%f_S)dXl4!F28<&JB%{B#ao?l|zYdwtTrV8mnJ414vhf`mV;nyeOi8^lfVO>2q z8K1`K;B4B;xk1D104I*&+EFUU%Qq&%<8;p#c&zW;B!02ziN5zj)At_7*n>eO(D$5A z^}Ule2ReX!_uyya-nUWickrXmM|nE{S#y-xQzKisnH?2+B8N?tW zI??wK-UywFXPj6@E$aMFfVn@|icVMt^^X6G__g@m41--*=7Gc-BCR*F(MHPUx+3;c zU_GHUF*l4EE%?&utJwR9LmH)p5z`Z?H(~GNd}zbL*#qRKI*QXnFOGB>TvSZUk2JhA z(A(%=C-v3lWZD|Qu0-1M!tj)wH?_3i2fQP?bz!z##ByeFI>d3a!Kro9j_h#n4B)gQ zJ9rQFD^C}pX9qCO-Eqobk{giRe4P3h=kCz*#<~z(E_Nq$^*zz-+~mFjm1e9^s%}mC z?2YE9hM@&v=cnj?ID=IC1K{ueCdk3d=tykCA0jS!?G7ZUzUQ?}dyNn+-t<}l1J|+r z{~z)p&sEn!vCA$n0(l?O(w<4Vf!hcBaRY`ZX7tyXUoNEChHh{3vs#6Br8224y?t0F z18o_<&ZURimha1nEUZ`9P-a^;)tx3(<2ERq${Uy3aOr`LXDbvgR|PmZveIBY0nTz7 z)t^iE@dh2uuSsEB)4};|TxZGp2n?g<0B!*gJX;i=%4B$~RMW2tVHTNXtyZ|+`eAWT zQ5bOKRVtePRD-$m)MyHsvpxw2X&neL?*-{k-kg=Wn*2JBGM~clBDCmbRpnPMmFp8* zARRzM_q8vTa}1U}Nj|dpkfOS+m3Gvk+FI2qd1FnR7wF5`w|M=lCi-{aNWOgJd@Bpt$s=cm9D zs6XZXYT$4RetUrkdE&=xbMOn>suggy)$6@HCXS&z7JsIX*LNU4%BNbXM5kOR#+q%7xQJpF}+G>DGUk2e3`JWY^uM%+n+TOSaSO5vNvM^U>To1>Q{hT|W zhPg7sxS%WfVxH{$Vx-*ApY!+CV4lpd#GDlK;}}-R4{lEnNIsY!2XL4XJ3^zV?rTa{dV{S~CjuxnQcpt#&XrFnsW+2PG zm$IDgdxo`d7uxre){jmD4EDldY;^JKfsChXgt`vGz9u>!c^J4jzQ!3)^fP5_2RoN` zH(_?|6Xf;tC7xK1By9&^7jliFSY~8jF5wqp|0Q*vT)mkyEbtn(VH^FhSn-r^Fz?9W)2KfZPun<>YrdjkEC<=@A>(1AUZ zus5)-0iHiXy2H{6T6gZj5*?p5U1?)KEwo|dkxv(!qP#fbULTl=Q#~`~Vr$%POz4nhdSYcsuOiZ_v z*wUi(=33FCTqlH|`Wn|i&k1P#v}g^n;uz{{r1`ms%Q1c%@U5=zm1avDEJx}6P(enf@i$N@Ng{DmbDtWC`zrRPRQT?(w z#Q06>?;7mKZDe+L2;T7^-ZFt?oEG)_yKHcKr|4c6fJUr$&|kfm{q>~TOqr|cUKgUw zi}(X|KW+WLa=n0Yo*nOV?{my-G{*DgK_c`7z#UJ^`O%yd!K0pTagwxaU)hb@V6r z4r3f){kTO#%EK5(f3_>5^Ae0}^vejPd?|j~K|KuP8RK}~#TZ7v=UvJH>OIc^9Z8#j zcfI$d@-A~V-n|TEK9}u>^1rwY?=sFW;$8C6Veaz{_BWC*!KWBKRc?2n46GF`;cvn} zBYW8b#>Y79S3P~K2L^`2RV*i4!qspF`;bC!yylnhp#X?bR$7^9-b@D z2XkrfL&GHZmCS+FF)6UV$~C9P$Y8SIr1fHZ!}h{%fxW^w{9X4M{>o7Ny^Ja2bPWg-a;gu0|5aUDU)d777=bXu$(zl2s-mEB1&0@n%z?+13 z%6u<*Cc1|(TVrONOoZK9#<;M$9ch)HwFT593JbAp%TunZ_5M{myKR)1bqm37Yg}hCFeTChZd`cTM zulEO2ivC-NdZZ*R)3Y6Y3(17T`%oG3%ofCD*|gDr*2?}e#u(WlVte(zDSj?!>shpa z5I^j(7XB~dr!7^(|5g0dwAFvU;6vq3{g;ZLqlNmf6h8%~`qx|dh~>}y(-CAgR4M6W z&zEpvUFpL&iJvti4OX0mezT$*u&3kOTrgpg3taO4{uV-v25H1?2F_dRm%FRY?-0PH zhp{vqS_(#vYJ=E@JlTh;_d|9cWHo}*e0Fps0YNTq{3B0-BYDmblhRnmV9jG;TDl?f z!RaM;HsF1zhuDy2^i(j*Cr{wTTK^}upkGk_$+O*{sT`Plca0M-mHnFTjMQ^7t&kQ5RmACVbEie-k|j3aoV|ysbtU7^Y~P5H?zn-!e6Vp5RP> zzGkjC%|)bOFB9RrYDhDd7suxqxu?eCs3Dg3R+M>5jXR@_iI&0Jk>_ioFg@yZN+_num@|XBa3C`c1M4f^N`fp6{NJ_-qeR{u!YIm zlm25h*kjI{O#;}XHCUq3!_PvSKE!*XMvm)w|I;<(gBaG2IE}T0CC|KN0dK9P?x4J} z3;y<6+Jn{qGWa`c{XHncdoKs9RLdj8iZ}g7YNh$)nL+#9w(iit|Jei-^lJ=#p`y!8|w+c z{h8DA1?+j(R95cqAiS;K9p}?Dgtgc2o5Wst!I^oltKVNNmatV19e{PCezdusv>o@h zB*HrD<=mnLXnt=&`kwmzb0e_DGA-regY~=<;#SG)qwpWApDz~o7seN6blefzDa-_f z=Ed^~kJf{xU3T=u>hW>FAFr1_#IqbWFlZWveYaj|8w3h2pFr3X^@J*J^zUtuxB?`; zJYVr>gXZlv@LK_r2g4uJG`OzLcKBNaray}C#~XZz)S0loE3_OOc$a)=KYM%yI0Xj> z-TDv5!)PVqm1iYg5ByKBv~~{47+}0c8^nS>+t?^az*X^fC&7d8)<#@iHas=v?kS}# zX;T;l3HCk4>lq9?zj1UPSEOR-P4Z)VqgzH+nltXDji_^QzMZgjjbx4aYYY3ZR8pG6 zDfm$_*pN=5)5m4YK7~GvmxHXE{dF{2-Tg_Hz;8N42JxFg%Qs-K<(RetZjS%&_G=J! zpexwp1)W$l&;r*_16>ySu)-_$fz&xT)(h-vV9}MK7boH~E6xp}6DvGF#2qIDOMK|X zR<1t!qA#eZjt$*-X;^?;qYLj=TTxT&_xU#`VDTNncnneV?#4~=;0NNk%E2;tUICBE zINVn|I9}WU>ixag!?g`^k7-VEVX`wxVW&D6rUe;3I$}1?RtLwriJXkGa!+$`u^7>I z9N$-*LtFATxc*=g5c|>K$m68xN21!PEOc|yKUB)8bbCxQ-A4LTz;$Uu3oQHpOyYm)YEnx^jebJ??J7T?lWBpbHQc)Q|jx`qhpFW!RmjC*&uV zS40}}C1oaUG8}vPTL+s=XrtkJRrUQ61GtY;Z_*JLn4-FkLD+c$`+;Q6>V1gMcI8-3 z+3ME(*{%*3uE*2OHUBB#%J|dxGQPW$!o_#rI8A*tYiUZBhUwkD3fkg0X6#28cByks zOUB0;_#1I14;z%cE^#YhoQF;0G8U&_%mLOG?7QID)Q){mvrw{_uhLS_Opz|AR_(l$ z#qv1U@swCXmy>3LV>Qe!QAXJd_~9-{q2tTpCLLpW(bJXc>aj!0Du-(#gY^&f<$HC! zsdcbiPYTcA;4afxUK~Q6eoiiTt_FEly>m4T2Sb3T$(y$!ACA9y98ka7+UX!*de5dz zK!wJPhql7hNnoM}kXP9!ULoHBEb~(>DpjS<&ISeE^|7 z*%t_F#X1M>#g}%YA9h>#b$yQWgLd3K;MReOJMTlijfPjy+4Y~-NqH=jc3F>I+%$&k zN!z?saA zWjf~ruIwj=5tlX|oH>(vzY6Y9X1@u3;+f>Ry686mC!OxM__yP{B>92%6pW|C`zCd+ zMqF{{F~(En2l`vZKjrNT>`QGz8^%-G5O%)6;&~; zr3lK62wxKa2?wL8!f5$g#4Sbag^Z~@&A5jYrZKHO*rtoIOp<)x0N6tj=g`u%q^%hb z_8-h;;`aYFz@AXMk1~$sN!oVSU>}%GRh)g0@NUB8uC{e@TT zYaA;9jE_C4Q|68svlT86>2>3-)OgJPUEotOW@}u{xB94^hykR)r=-|%L!PVAZ2&eGF?fn=JeUu1-4ov-J4aC)1?d>fgT}#oighmBp1R_mG?@Hl z-f{$Z6c3ePWI(~B;?7Op3v30~w;8UT!1Wf7E4M(b?^v(Latu!gGX!j{wl<34U1_{y zWpmUz58pYM-LCUo&PN????AbBa~=v(YwAE$V9is#4&h2OjnsjstfiZ)pEaNdwA{gD2~2)mkL&~q@#V%!%i;}XjO zht|Fa<+?wdy62>%A~*oR1@=Lg^?PgS2A%1Z#0fOMcTI#*pvcd7R@1|Vz%)hCk@ z5TvZmvp$w!>3xV#+&*r&aUNR&zN8)2MCDA;QXE*k8A6G1>=nG9@x0KF#OEIp`aNMZZ)Fkv_F0Ly^wFM#8z)Kqr2 zyDtj%za?RA-!JTcK8(_pmkBXH*!?`5r#%RR?a#x+5`?lTQ@PiTy!$E8l%xsFXxh&k5T5Q@!N>5vB{Txh~qT--%&}&wCn?M zBMSq?UTJgk`)91|U5Gzta*%o{Mi#Gsegbj0W>0;`=|Y4-4&t0tS$LX#kucoP0WLZEn>cvFu#|Nbs|4~3AnK$ z`*E=$E32~&>>NeEE?yoVbo=bj*cITQx0xvRDi0;JxRH10qJ$-5zq zzX3n#`qx&LJICbWvH$V(#-kSRZ!I3}OzaDKerCqMW%D-(m-lXfmKfL2_Kf#Uz+p4M z{e1!zTPOSR-vRFatRJ7SPUNGPuKFVO%vf*tdb3oXU6NJAk>r zwwkaBpACL1*8C&VlNK3d@@6}SP$}2Gi16xijc0RX8OHwE7D*45Hsd_-d^=yndb6+M z-Y>C-)Bjb($DR0?k7=6{#Z@cIC`xN^8P*$v(m)oVe{336$LLJt6ng#Qe#4rQq!)^7o;NH}ojC7lSeBAK-t0 zZ#YR;Q#>9A>#Aw0apc$RGyu??{GQCh)xQpa0`asw`ElU+cB9)9Qa|qfi0_UjEzqApAEgEP zz8cL41I@6vXL#Q<){q#F?bpsTNVdP=`|v+rL%PAzXKg|}u)4r9VM0-U<6eM9fpI@8 zCmK&3XB%*D8wj02BR=#L& z1~6SGWCrfnPn@UkF&JJkkmG5j8};BH2XxEG+2&-ONw=RM4$mNMHoE=D=vLic#C?yr z^D(i7*ZiO&>HZ&}c#$?gL!1}kw;p-1 zZvP4Q@;t@!Op*s3Qa86AyF5?Dc5&7pYj(bEiDw<~tf5iV{@Ub>RI&`>S&KLq0k=(v zM?7iVULH@r<}P{AA$U?|vG20az@m)3wlLBR%jMw0|3qP3ZC9>%D_&JITPR^yDoi$# zIeb?z!2UXFmzG6*S0c_eDC;`JBfbsr6W{7Q$9?DEG2SyOXa|1dxn@gWo#%KqM-tK@ z^?ma%?CWtmkS-jPakgW$WP9a1fH%%@z>kHBvBGR<*FA@_V-j~#>?@4UO^pi=bN+C? z#+QYU;@ljrpNMspD&TB5gpENuLad^(h(QuW~pt}75_YTD-Gv^Un zoNlzx{-^da=D|6`=>Z-%H??dY#ODme{SN3A+XYJK$epenJ8i(A%l9;yV+2Su3r|^6V$GfX-Pk0;P&vsA8IfzTU^hau! zy$^SG!tV#eTPSpcg4Np|dx)`}ZbYZx&Li}u{@)JlDJ!Ge==g}y{AEI;*ls}n#d`rW z^P+lcJud)`t6-a(u+f^d6xm!07_X(av5w<<8^(3s+s9X1h$H3ig+eD5jIpQIp(PyQ zJci?nH5VB@MnDhZd_Mdvt5nZ@Ju17{MS@nDaEamha^Oi`J`aA%wR7!lCY@`>I+f~K zSPye1PQ!_C%&jn#=_QcFov^k@Z0B)+(U@WFR`)niX~3{`xL09pVH8*XkUGgcp>wDn zrhy`_xOTRg^8?s8SvLJWQM^a_t>BMc(1pi>G^FDm!$EH333Q#k$jiw);)8pvy}gV1 zGi^!6o#Y)6WvsCmac8gNCE{^N@!~>>j7?k@!M&Y_N`zRMT#L9*RxP+>p>+6tzz!?@ zaP}LohuC`}#ODE7>zo}QGg~y9`v`1ZW4GzvUY9Rr-J30h$-SDG$+>vU z^I>-m3;L1_ngKnIy0G!N*=f9?=FSwb-yZ`dNR#Kl{RsP);opHgA2s^AatQlduD@bk z1-B^6)>Wn@{F|T%u?67UG)ew%ZHk;ySVIiYs;=b(>WMxxu_6H#InQ3vmEr4f>W{q4C( zLpgaH`df9~VF-e!yNH`cu$P{LP2fi!?4!>1=Jus5L)dezJy za|9VLKzDnh*nvQLnU8KjTxhE}@4&N`N=J@8gtK2!#3=Q0q(8^3fR2Od z!l1tw(&z}-(7^VA!JPwL{eJJS?j!9*7#C!-Tq%JeSna?@M}+Af({Qc!dX&rhP0m7# zBTs4F#Ovy{8F5&zccWfzpCIc+`ndWq4t&v#__99F$Cvftnps>QzADWtqYJ&6u3i4V z7_FBNOLcXnae7^G*LwLdsQ}vtoF;bc7oZ&C&z&5}=5Y|z0xGERdfXM%gZQ&u z7#6onUDOFb>yg5j^{8&s70zHma*%^PG66x+P6r{aqKdbg2*bOt4s((Jgvl7sH}`^f zo>oOHB7Ps^64V24005?M6>wbd2CnX}UAgvzxREAlq#;f22TfStE~~F=XVQnX*@hqK zLt3$&d*EmMUW@Peo$<-*{IM?l#dK|mwp+SBOXu!@a{YsGYk&{1iUut1pv8^%O0u8l z^0_5_gRsiI)r7H6@H}J8H#Z|s%S8rh;rsyLct4AHq|dj(aLeoi0QVJeAtXmd7&bf; zco4GUK7fYPsjt!Q9ongpJ@&t=&PN(x=Z3eF;3a@L z89-W*H(rV_ucN;K{n-C1b!?w=qj|0=d9R9F2|vi4B4pGLLb~<1$+Z z*att_U+&*zUC9sH{;C@?xYhAP@OBsD*?TQB?u;4ZLI$WVHP7?-*eMd|Z0oqzL9?X6 z7{9|{7TenjH@kd-`4Z=vCCuz;QNG6D^{gsTLPeg0B`6SY?&EJD`A?<%VF+LS|hcTAwZGjeL za_rLaDGux1+CSKx>%|RSZcjD^M;Jad;A2=GItIsaIFKQZ=q;+xB*R!=j&qdjl%Z3= zUpPCDMcXbMT8+o*f&+oAWSpC}y8a`K&3F3x(axMr-(0{I&NjBH{hlyh2jlAE;t^Kh zF(O-kPQbZY!EpC*fA3_2*#DU?RXWwD(7aNQS>V>i9@>Kz%NB3dYJ?Ef0(EDbl@OOU zaNb){UH0;9CU^uVE#rGgD`3bjlvm_4*Qa%ysf*@O4tb)CFXh`?tv~WiCq^=T3mh~f z{~`+JY<%Mx1^~RpY^Pm(Us;U0vVCIS(fA8UfHxX})M(k=!^QFsJ6K8kHv8}cl5atJ znd>V@f_>Sy0-p!z58jbxx`zZN$vhqp3oLoQw*$Bzl`_QOEpZ9^4D^yIoadGaGHB1T z3I8nC%jAvQ5!g-wTjA$0cZLb`0A8~5bEeM|X6Am}0D`5dIG-=TZq3Mr5tLCVj$_8; z_iM16FG8l3aWED8N->p9zCZjW-k&pThs+D|!ncfTAZzUbHirEj<2`N9f)~hF2a%5R ztY+vu)z_Vw*S_LRaZY#bhHtFv%F>;+~SD601M0N+NzH<_6X z6ibViGKlvp4DZX38SgYu*@V4w+$B_!os2yg^;*!z6x=;!EI4NQ~E5LnpbTp9Uy!K;s6qt+ryW8;oec*ip z9cupsk8XG!O1#1|$+2yFkIcMm>gejCW1EF#b1Ap4P3suLU3_g9gLmir8v#0o89d$9 zol7YnHi(w(;N2Upy>|T#%!~AZ=#sYlRY#Bg6UixDK>>~)_ZU510D4?!eUA3cD3Fnt zz$b5|nfzgzR)(AILOLRO?dt(|f6$#cA}vct_Pu+p?5#-5JuI(<-|b;}1Kb=pUY_8s z?LGY|T>QLbj^g0`y*Y{C`YZV+2xAwuKH_Mu`7P}WZ$$Z4gX!V&s2ub&6UF`sfy8~` zu+`(GsE3=gQQ!SF!1-gi8z0%vcz)_lfN^~M4SZQou5psrbq0ltvGUojLhm;0SjR4G z>m#N!Y1m*U-#f_LUBmuk>7XVI^)jJ`nVzKStnb_y^qt=X4y2T&)|^d=s02H{c{9?m z|Gyvl(5n)-V^=8qsqGbJofL0_=d-(AeY8IqoSQkbgZ|D|#o5BJ$KR#VK4I`c4mh3e z0pKO=hJzju`+*!#fW!Z{4F8vdtIT@oNo^Y?@s5svb|eOudRz59Iq@44tagI-oxYj&l)@oR{`%Xt)wsWNMQSLwOZp%{~n8cMfJf|Fwj0o)56PuJZ7>AMuSl z^7`+RweVSAUXXq4?p`3^P(LCQSet69bsH>;M?$J|B1um z`^Mj4VJ&n7%*`MCM^d*Bb} zpbaP=Yh|*BjAhk=R_~QKj7Qm;%y_x7C`11M=}5Ehfo7zKD?6++>z$N8bI9ocsxx$Vrf|>=ec2-A46CYzuM^IR_4R5 z%+uAL!##4?uME4Y>cUJ1S{6qZ^c7O4J zF6XZmpv@bYX9jzV4&hZ<@X2!9{GXqCLdbWtZ&98lNmqjrlWU+>eO$wZvUA zY71aejmt-+na9P*wXbHwFFJT&%OD(cH;s?0 zFe%qrF8AhP{^s}Qh4jA)X&%77NbWcG>rQ|jiN+7X+#(Y%=5ZZh58}KInZf0I6JQTT zle2tPFWmFD1@MP4Uxc9;mow>nk?nj`=nqiE9b7L){9{;`!b&L9fH`6wcqEF!E*bG@ z2i+fC=Dx4TPjKH?KgxQ7^~JK^twA|Yf?o(KfW78yj!T@M*0xRD36wz|5%0e`zy(BX zG~g*h%Zp)+5>}pdA;g#PR-cCVuPR+$1~~5Gf;kp5RGeOBT=VfGSe{$V_qJ}fZ7{<7znyJ}?h51skIED-Krm-P2 zF1s9ru^3lx_Vq(@mX%xNG;tV)^QxF%bBor}uzOHvd3|>QXp@z!Jj(FHHQKS=UJAl+ z{~6`03y^l&55$kiy=Ee+1jap}56WKe7{>Gyb@CpN@EHB2I)*1tJ{o+7nnYT-^jUJY`xIlhEWpN4VkJjOY^~9{-Ki`gc zpRc1Da&Q>i>;&IA#5-0;ZCCN3|FGTdMJUU>4X|Ae&NdRq1vuK7{ zphIYQS1i|DCK~Jx*)Z5>#C~4F-CvUjaFdN15j|ZG$(>;vIy#1@CWoP-J6f?`iw!vM z4D&hhB|YwGAYUf?0Bt0P8~9Wb;Yr%iCUHN*P`z;c;)- z826tYlzQ+Ay7*iG(ScJk}8JrFjednZ}W+ z*%8$n*mj2-llML{zxx|`&hj9n3i_|ClWKg1Jt8ui<)$Z|5V8d?%qG z8zM;;>h=#da?e~mrZMmL35;8L**i4fw{yCzz~s@^iZC~-x;nQtEtEuqoW$;+Imn$t%!7Z3yxW_`<>CO@ z9u(AJT@&^k!Qkxr?ne=~qiMmfg|Y0-O|r)ow=l%#Cq99AogVHlJP=xUpqf2Rlk*s3 zcszsJw}pZ%gxK)$w>Qan3gfwBOXUrw>1&#Y%It=x7~bDB zIy<|668o^^R&8I#K$C3I^?47nEpQbmcfsOiK!48(^UgHs8*tO$am^*p|K=v_bCSL; zBeTyh+f-iQRq%!K#N0wbmN(_PQ&-1a6EZ{n3d8fGlap~B^JrVS^OSqAZQna_7;54r zA>gX1c#qYNCd$j?oP=?AdU&xkZ})r>zAJ!(qdcy=Jsda%@RtaDem}@E>Gs?*pO-dG zOpak9l+fD&-_yi;7Wj-H5H09dXX7uXdzpp{Yf@vOSgscD7RzUrlBb8(wZ zIyhJ|+$Z?*CX_voeSSDe;&9sEL>b5njB!O!koQ!R?gtzV-gKBof027tmDN0t%oxpa z{2crc<1wpnC}>G|3H%Lx(cc|Vm`3qI*|#=vx)tAziK|>azH?1-hwh}a1&}WDO$R5Z z#zu$d#?ajQs*lI5EcGK>LHRfkud^)(e0&(|WavvV&Iiz+aZjzT*9CWWvYdlq*zi=z zja>{o)Fjejc)l>{$7RBAYbs5aio6pvF5~tlzWYLXA(H}(_Fg!7ykF5o{cL^$n+tHk zH1{VVy1ntjd|#OyALa`-elhG@1_DPI6?(d$ap%d=)q&@AA5TEw6evDz&*N3`f zoan{YMYVK!Zzt`4)z30$njpT!r7i5!D37+V>ui1ePXyoP_p5Mix-|;s2=K$E*nC3Q2xuop$V9y8m4J8WDKr;~@6p7cg@ z)gBGnd2dvm-r19NCyS!*&#Zq2Wq%ewcV^wSDc2D`4>EKA^oF9 z&S~QPJB-%Yh&!!a)S$ntYMg`KfRQoid#iD`@Ij}*SX|N(_ZdUB;j(&zvHjZ+_YgJ? zaATWl!g{X+&lY`A@Ixg0wKpm)m*aQ#nJ*ze>;HVjCr|$|+~n!%XRT;QlAb_^?+0J8 zG}Zgu@KkyJz^EAdxF#EWefqCj`s%jnj8j3F+Ib``+lcgF8$m|N+7HhV(7zY{x7z(~ zjDsCRpd?hO<$7tt~ z@s8~X8}#HDww$ql(U12r{T?u;+bm}kU>maYcZ79DV^d-+GCm=!Ct6qnL;o$z;HuBr z;0!L~?gHFKdMTH%y?{aObYPG71mM&R-N9Jm$@nF}Wh0CaQGJJDc$WaWkDYwM9iZSD0zL_UEAkT8?a;SiriyKwoNKmW zoRRq!j><9~`)+$QskcFy%p-Z$MSO@>+k~{gl4pObyc^Ns%Z|@{ao^hJU_TUjhxKm) z?f)jA{X@ET_pItq+4-oo#q(-ZcK$W|q-}LQg6}lI;3my#Zcx(gmEt)%%t*X^XpeON z8uLOU)jk&BxlY~#S(+Dd`j+AJuiy{L$G?N0G(7})SY1AkP42@sH0f<@?bs{r?Cu(B zmv)|0hny>98_B&M6UW6J?yc0$qp~s$2WLpl&#~0Cc2Q9xvAC zpR7KAgSM>RcG5L*{}UdW@I6($Qn%`9V632(#y5E2M=I(7-$%LRW9|)MpVU6iz8vc} ze7^>3xBhLQA0SO@q-?}A+P5*;p{?E8nf(^+%-xP&PrQ_4h21m4bfh75Uec8KQ>Xc1 zKr6eadf7UYZvSj_>!@8$Mp7r$*M3Mg??e4x?)Qt}zDMlC5nCX4LGy4F|3+qW` zGP?`u-RUjZQG-(*1A3?13YRt+F8Hi;VX_s{zXTz5XmnxOp#f}(+3D)m%co${ym^cXXLRKvEqHG18MTK(d1mv2EDjZ=vpL;hrTxUi_%cavs;~DY?q1T`I6g1Y;pRT!%eojY2bcJ6B$`|HBRzw1 zp@w3fH3yT5({XlgO2U97c$0Ykr{UQMJhQ0hQhf(+I}cA!Qe(SKED$*Pi&Yda8kY}7 zA&})Z?yM(Q5YIVovo1NL^b1Ly7!iQE9-FtHrA+e z=E^6mL-!U~fYScEfbXiI$`j8M2%8X?^e3U`6M!A6(IKC>vn?O2(a}PzOI9}D19-TG z5P8T?_?UOCKPfP52np_B|1t7xt<^k2JI-SLH1r&9s6eMJaP0-(x!b%=t{qjsN8aU% zbw$EnC$OdVw!`(h<;wBJ1NG2}D)wUlmFP&l^h+`9=suYOFXWN>GyI)FIAjb8N`^nE z;c|(OT-akYAum2u59^EDjbd<)VGq}jL7M6sE%$I8t&jI`xwfMocMR#BpX;EH)F;+7 z6YHRO%d8Cja=H+#gK~}W@%ng;@h9*>@A4bm)Tc38Zhz%{cdxETZvKr z;eL+J29U3hNkp3my9(^NCg{ zzo1+1!?h6}pBlVfS8c7fcE!>)*}4_rOVt;A`uY{dn-%be6^>?*DfZqbb*^5Fhc)b+ z_Sd*#Xj!`r$GTd?rQPQ_80)H^vE6BFXWiVJ%xO&s5PjtXURUFZft_82u0HHJSG`O3 z`2!ZbA*Xx%0h5CkmFF)2=XUkJ!BqIZobK_rylpSLo_PT*x4kz5ey47z_fG(p&SnP< z2fcSf@|C;Fsrykk<+#*<`g=-BFBC)c&P^3SRFwM08j`i^#y#D|1A7jPmiF)4GqM2s zfMtsFdoVIj?U|n&-GlE{*B3UgFLYeB>Dn8{)?Yt-!`Oza<=v7!QscSD~aF0*%8zvuYWCU<;_1QR(TdoZX& z1@~7rA#d1&v7bo$IOFs{$KYLo6hPz&&Xt=52jW2;BxHf=JVD-SK^oTU8lhUZ=0#!D0H-F$_8AhV0dk#w$N{w=BQLaMtPH-_X2JRoNLs(k_R z8NLJ4930@GY-CzJ?}D(dzQG(OID~0G0Bl<>m&)`CO#6X{(F}lx?zI1De+a_x0s>43 zEJe!DzJc)GZd{wLWi-mk9}g>Z_io*aBO(&N$%XX|;<1VzoLv@!gM>9F!g!bu2Oq62 zEs3z9oXc;OgAWWAc%0G2U+v&HZnDD>&S-W@GK{ID{8JNfGnQByoS)Ekk^FF8hflN{ zZl}dznZDhwFli-BI`f6xP$n~&<@1c%E~h8s`k?_H;oLUh>ve7%F7KL1RS-&E zJ}(aA+n{M-C!_KCE=;b%70wWRFG#?XZG2%O3~ekAsc4&BCdpl_G^e(=tQzcE!%;@c@XUfa_^X(6LsTRXLN9OVG6rg zY}t=+;?$$_*TV2P1~>2q;aeedF%RZiQ1CFfhLIMF$uLn>UAnt9jMGcpUZU%RO!JWt zE-5rWt}i{TVP;rUIOn-XT{*frR@&keAbm{67q!!~Z6A$F*cOT{Oh&g3q+ zIvg8eM5>iVXN2+Z@yHE_GQK(wSVnD7YmhJXwp(Gus(!X!My&D_cLi}DZF0m+!jbFO zynUKni^G~*ARu8tQ>&Zy6V>H{ut7Wm46l=;I+g|D+XjYs(mWo^f-od>>2ypB!UnfM z9^hEwCY9?tz6Igipz!52Ovkq%EHl`b%EE7QM8~%veCJ@_RtB4V*0C-K&q0Xt~Z3xhVF-KEbmxb*CXU-uf)K8m!yZE`K4wBB!R1hw5X~uxoPxDBRGj@r&c@5&` zA(PzOyOb+C5pP%UZtgz#?~yZOMQm$PI!yrf5bU#|{hV^=VaiF_&Zsy}BHqzp{p+{j ze?-^*M844fsQPu9Z@B&r;E&_JA3V|`@!kUe6O`vx{^bzLkMP`%`M(VRt`?oMIvoEL zu)Qs^7f0mmpTR%TGCV(NY5pAkQVYf&J#r^;z7E*atKzvyJ=^^ZH^I?5tp+S}hU(j- zR~!5tXX280zF0A+dwU<4lf2Q6xRiZGOiVams)w8Fitde$ zwFu`~Rkjsx54Z$=oWYm5+ofDzdx-3ZlT)2gs$42&X zUwRRBU|AYh%UWw?UGB=_%D-$&_fv}FFKi0u3vwso0AJD)9e=R~d`vm4cO^pmmWwY6 zfVe(ik1ZCew@4gJD>8!vIW7@Gbuqb8zewAJ&nG{ahepYDHsGw~)Q90zfz|`L5aZwn@)0!et>C_&EgUT=nV zIA#b4;yiar90p>F+O@;id0iOC(L~f%rP<{nzI}su@r)GHuq(o}8YU@Sdps|s71T{v zRY!{}p*#7pM{jPjR@eNmT9O`og?A`j`m4k8rEfsEiFr)ZUlWE4&li?RK!WkzOpC`)KL%_J!z;$mP}Xe<NDN79=YeV9Bc_2}X1!EQ*9hf`Soq#2hf^Go3k|IfpZ+yYq}^&U)so->-UR zc4q)D!TW!{|MR`$vocd%U0q$ByQ`~mkE0SiXDMFZ{!PzYGbx_Fy-?>56rsL0m*V7V z6Ts5$5*c|f? z5$U%y)FbLUXqv=)HhN>;Nb|MEG|v)dOZ=in{BqapY%~E5t!H*%JwbCun&Z)&QJnkH z+JSIv@H5OE6mg};dr5o;N&EyI)bt@=;$?uq zi)f>lcyR(Q(W%4cpvIgtzH18e%4T?Hb67A#s~fCl*yK7lFBNj};(~Z$UR?1m<^@*u z(}MDpbG&aX8@{I(*#a16<$0(@~T zq7Nr}{265`bl71fhOdL&a@D~=(4+Q1>CqY=t%nQ3HPral#QGMB zcTwswx^x`ea(U_-r6R2_;gb06@h;YRR@sraN2cN$Dl{wv$A}tFjM&21XT(Wh8a6zz z{@z#yXVX2_hbi*Fg-A$;jT8ECHoIZ8ipXJY#52#LdN}rBf&#>iXhx@)7$%r)q*VCP zh))Opa`?P>dAC=?@GYfXT!eWCVqR!CFD)U$X~qO=?rhpA@LN(A=8wKQP({WQHDN&- zcKRaVm6G5|_p?fi@V4H1+iYbdFhM#jPi19r{@923E|(WBMC0>nCJmRIiIvX{7h)03 z3i_}R53EGmW227oP*H^Q7VT&)!(>-Ug!5H^;Z`=lyruc5BErf188-NQg?V~a8C)2d z1o>5yhDp}v=6X10HJ&OqlO_JE=Y`8;Vj&OL=c7hmxGY{xX?U<2Q(Ld#a1VbqrrG-P ztMwN+QaLE4c%JHDKb(B9>AaBV+TRJ6(y+{nW9PtAVP#O~yWs*AAuTH@p0}@;Fok3^ z>Po{>vgDX z8|5D+MCa>#V<`^5iemM&i3lfNB|6;JBAgwklHom`j*SQxO$-WoZYsiAeb*CX^0JkM z=?SthJ25OUh;JzZJ$n(Jdo?43JIKSsa0(fKeJZs$cXX768@A0!UQS{dT!cYLY-OyG z)K_O&IIGPpnBq2*hOrY+zPb~FCcw){OuzYG;f4CC?46vM{9UAY%;^Ua<=4NiVi=PQ zJCjA%Y|zhdA%@c;O&`LSQ%f-{0PA&)Pe@Pz-(R(o!42n|twlIiRBR2eFG8N4+xNnS zT1K*Q&yAxmYMzGbd*Koq9wH8%HDDr6bUj5_c%ZtYhHr_|HM*A=4xcDw{hZ=>i!iSs z{n@^c2vhlog|_!(c)lXckEG7?=_kTMRcNRrjm}s`^I>W+jP5q@i(~zHN*igI8k<%j zJ}S|Md|PRlxZ-u>%fvswFlRn2Kn$Zk!y772;W(HV_CEr}Fj}2-_9hLBkN`EtTj88L zNDTK33hqSa-hHq=;>FjkU@=V90r^n-wikG5C&GoZWxCT4BCK~hVlEVup3LjB@e3aP zCssUc-q{H_v`2modR+#eK_31=9{enc$_Cz`#cx?3Wz55=C9=Ljq5l@pgtl+O!$~5N zo{%q}BKd_$>Q_-d+*8GNSok=_q%aAtDGz6os0TUF{W_X6cj4tghK%%5pbt?75rPa_ zVqV$^zSQ_ULtO)VL%wj}; zJwmYA#Ax6=Q67%z95iL9N0;eEV1HkZCrr=S##e9OEq7UGc}el9yQd98RUp{Y>sA@)$-}XA7l!7b!9EOTGI$eZL3KsX1NP`315)|% z!d`!SQ5Qui$%nTptc@nj51KB9vjWb9$ro)17is8?61 zxnV>HIFixzO;xsyOG}NgvyBjp>)_SK*2d1o*3r(!HX=O{nv+RMX;7PFeVhiob;r-N z?f3Kx#T7Jl5BmGYV2Hn`oA=&MG@Uz2SKNBlKM9b*?{fkO^Ph7vp7T%ncE6hYGm*JrY?t8Tc3>!J{)`Do=_-XVc<4?bpz| z$m=Ic7rDtR7ZYwQa4G&cA&w|>%AY861&IP9M7DrCLBQ=M*s_SmHwQfqSg>K|`lM@t zd-bqGgln~e?kuH`d-X7D0G(P%4dySl@%wT;KnM5iakwt%GvK=c?AmH0lW;ME$B75b zHkS>VB*379(Nh~8uZhm!?~e2a%pE!nxEfBLPMKaqAHe*Wootvt&;WgicNwa70V5NE%{@G@LDNC)g%e$(ZSt4+UZI{)LQx4i?8W{PmkEoX z%tP*-ArJ9h?=0l!uef3h0A4nKizdoxwjiegxYSTo(3v!nrlJnYS4@;=nT&Gd;Uq86 zONGUVx2AoNe>i4n!g@o(TJAXT8isuctj3|V4QHO1+M&Yo@l5}Ur@ZlSLLD09gEMGV zFdx6{U&WV-9BqqaF4n=ha+&AhnATi*M4m4eBrdeud4kO6LgrtEy2+pTX{6`Eys9eV z@O78Y0OjGhkHhL7ucw+j%#MZecP`{%_Ch>fPc>HC}mzA+0jyj1{QE?5EXu-?Ifz39iTl}3sv5x(K z_%!BBY6btM`g~!dkoJB&yfvZzxQ(I?rdv}QabL`c`%bv9PiLGfoc0oF?+g-SW8?~? zN7g7|)(q2H#-;vKG?l2#R&1z=M-!p_mbZjhaggPmPOR9sSoA8y|xi3s{d zC)j8+aQ^&1apoUo;P?CU*ZlL!u7-LBM8<2`&Ioa<(I2)oD7<6J>V>O)n$S)G9zp)0fcmL$3=AbCA2lxU;TuO_nBGBq zILwRO^Py8mEB3@xPYlE68?HR$3F@E@bg0W=F#7g`J0=%1&sbrxsYT=Qt$su;@nH2?&Z2}{CBkS=YXo5(i*na=*E76 ztGr<2k|6Gc1Z@npr(Dg}ka2zF4yYMPx&&Ph9jX+oHdM9n0v%%1$PSK5Yj~EiZmzTr z2v%AL+2a?dwD!#eR-jOqJ2yjMn9`aoZK`>%+^ID0dMo5vY3&0_(a5VMs-SF(F(M!? zIz^YNi%nCuk4sIDOi+fVrN_kSgziI^meb_ogsKWdMd_2XBS^m!? zB2@l-smpgsW%*`1rdXW$bPV-s8{ufvTx1j5rT>7|-|VR&D=2t#)3I27iF$@(#wxg4iMM7boO6!gscvpb; zBjE5Te#h|p8Najmy?jxpSZt;G=6lVTw*KUJpx23GmIJMF+9bNaePv#6)Ss$GkH$Tm zbUN$C@fq7HDGov_P$4A#?@hfstCaveE?ytgZKG4kkbwstk7{Gxp?!1R`lS6@zh6&obGlRO zWc(2BTKR+OGtK8eJ|u=ODAAq-sn+qRLiAw=v!g*75~%Q_``!+=B0y8Y~WM`d5~gHkvw#8X^PSUPIbI3 zn9v&6uX6K4u@y!Qz?LJU0y_?Q=paMDF@*>k;%(ukv3v5;!J!3ktRRAV0-fS{=#*qQ zdq9Wyu{iTEGB2G{45uox*IJ-cG7lYimqc3QkQFp2?vcyqih1e4S{QIHf}bV=ozi*e zlw~+~@jsQy>9Tt_j zW{eKKQR@7oWc7^Wa7UOu@FFKb#MF!EA+`bzr-!KWKsw}su!_o{BITiZa3%?mVxUZQ z8h$(l2;E}hA*%!k-Am#j+XP5)J>-Z0DXWKE6d+~{V&xxb*USzz92J#lC^$e|oba}Y zePQ2?L7ef0D#vhmNHct0kwKc{>%9!(f-iCsPLx?J7#D&SR5=8x2gxD!ST)Ka4)EO| zhoGrUkVC-q5;+7+Uywt<^h+7U87#)20qXN^*9;t*N+C`pjW(!#`dmPZ31=NL2uUMW z3UNjzxNI2&nc(KgAk^Mh${>{1HW`G{IxK@wS{GyxlKf2>ge3o53ZZOqUt|yno-2t= z>GRc$_-QDE5I@ai5aP#M1|fbzrI6;7)?gWg(#n=WNIr995R%VI8H952rxar6jKt1L zOUKR`nO`V{*b~n#XwZnr*E)ORxxEzPKoFf2V&@D{DRi?Gi?sp=%Ee46jstP{gA76v z+aiOIG!DriR5}-A5X#prDa4V|dLe_5#Hf4H=faUBR#pZfern1f#E-QMLegj{h1fX* zDMp%8J7*wS$sl&fMj}Q4ed>00$i@IU1lbrTgV-Y*v*i$EW2GE|Z2TmLARB+kA>i<> z90CrFg+7Y!NvKfE$RXg_Tn+)x_2dxnY%haQF}IdOz;hcJ#0eax$RN$AQ1R&HLxN`y zM9tSa2P&`b=xq=Yc<5JI{jrros2XyFM>s5BRDHMrDTIoGi}$FN09cd@X|zKSl!2ET^oUmXSe7 z9MxqI%6kJT#E~cuM?c19G9*<;qTE0VVN#{M5spEseo_c4zm8If9Z?=CgAnB@G6>0V zu?#|qZInTX=L0ebC3ap0AvxcYLYSOi${-|XW8__*3wwJ&%F7_cPg5C$_;Hg#h#wkZ z4RnYfjTFLa)I=GC(pn&ckbKt3AS9o?QV8qEN*hbka->|;kV06wcSI~Uholl@{c}|* zga|WBW`x5^kTS|)63${V2rFf^6hay0+Djpa#v|JCfL28H9K)A@IyNWPMak z8H6O(Rt6!ad&(fhG|l4qv}`h%rDwqSwFp*8?49HKl_`gl2lFoOlWd4p z5g`gAw(7y#x%g^shFI@~SPX}grd5f>B9B8f2E=DNeK5o-1@7o!II^@V18PX?{9)HM zhFF$DEQTXXs|t%%j{e85)sVoEhFHyoSPVy&R#jPA%}x)GGQvNx9MH1jAAr`}trB#!~66;2h#+DoWLr|6FT+anwh)Wq$kI~E(uzs`{KOFJqY#VX7&LkigC1kfCdE*nYXhP% zYRf|4f9~{{hJ?XC<%Ac)k;k$GL_q_zW3b}k;ke7h{8y$AH9Dy0bwy#SK)q3QEKHKwv$Fr1!G>7lgjj?lk41f=!bptuZJYO6L##zY zEW+VmY3(IGays<^Hk4_=!0ix~hE=prt1^IaN0blM+vs6I z5{*NBb(3FZ)uYLc?TCa$-8E8jj3!NAy$v7nW-7bYEq<^o+TsVhBQ1Ui7g)tl{tB}G z3krcSvt*T?M8}y{V&Y7-(u(!*xnM{%F3HM17nH}$4drni^2N;!l`^20q?7{#P(T&4 zz;Z5N%3-+>`JCs%6o9!=1+nn?5~&JT$KBjCp6(i3Z+~}aN_YqOwheOkbaQaC#}TTV zJ+rgxW^XXG>t;`-=VqUp;?4;%Z9M~n13grJp6+@Obn*k+1O~P7awo$&2C$!J8*jB= zu)jOq#Lf<=jP4rSy1;9 zF(XTJ>mRI(g6(~1)AEmWubLpVQ*9x%UmgShLybYY&rI-OU(9E6;kk3=JfwTgg!eOk zbJSRux1le7J*X@f+&wqFQlPa8I9vUBJen)Gm&>2t6f7gV1oC*r@FzcdG#)Gh&W7Mz z^dz$?3ZZ#Ib~_$N{NKHtt-Ev{MQ|D^mjQ2sfJ^fghL;b$Gyjm@ec-*yO;0l3QMx2H zvk-bSJnrR!-KBjfg)A)(ndHW!@{shSgx3?lZ~DHNAb3hZhDv2qLB9xE0Irs#3J?%x zDF+7md$B7>mP#6SUf{P7zbMYg41fOGpmp98UQ*2XD`f>VZf#N@n`j$dR4>kzYiY)H zr)5Y57`PsmNmF9}ui;p>K}bVo5M0Y7#`S{&w$c+vH{^_k@#$6+i#4v8S$WJg^SPiz zmzU}yxH5vjqbn=w(>4ZLHK57VHNU6U3R|uWS*Ej@2U)JyYAwY1hq|q{0{TB!Z-pY0 znMLj#o$3!r*h6C_CE2)C|CdsCtn z$7>QQg>XR=Gj}+&0!0i#7c&orogU-+nt>vX@9PFqg(N<|qa9cc!F3QUQJ@nQ>nu1^ zR#)>?#-`gYW;8cVVGcyo(AS%?S}4&0&Qk|@E#|VotbmxzEH_zEDkqQ%*F#DHLZ;(` zVc|4{B~=>{`qG?7lZLGrQ#1O8nP@MrK0c_TNz%-cd zu`kSaDWgh63D*mkzC40p$5s`nXE>avPsn6cCAfVM^!$lb8jzWH9At+=d*izUBgF_4 zE)x>rl92oa6MvKsvDgJJh;dfvOrk`XxZtT0oeq>?$|1$mFxR8bj)IJPvm7!Es!$~I za9l-YX1ORSV%neQTKt5yTrXS$pie>>VS8aH&s6a)(pEEcdt_Ne+K<6AE@s%ZYflv%dzI|(}T>fE@mV)U zxGmUywdIk?$2&Bi)1pVG7uD{9-a>}AbENLmm6-=`*=+H-Qssz`%WH>b7Slhka2aiD zQDb?A{WLPfO7xcBvC} zYqmG^`-(I%%gzssDEb|-pVtkdxjTVG^3o#>X$XQ zY$qrKeJ|8)e5%p;(q(Hm8{R4k2So}>*Z0-TM&-?JFZ*29RcUv5N*}JFlSj?I*2~sN58ye(nZhR*6?)y*a z_pX?Cb^FwBflFZU4TpAr3=L>A&I9u!hUZklpa>v^9L zrz6JS;w`p3!)80f>$RiLqn%Hp23@|gY;{B1fcZ^dKc2Tp`(?<=;t?Zixpzic6fZ*Q z&VBdr=FeLq1~}Cm^{sQx?WnEauC%joD872`>-ebkmroQc(c9?`QW1peiIjcaOb*J(?7HrHo(%tquIUN zvsQHD9xZS|{bzW|B{DY*i5=mx^T5}6iwCr-;e7l0E617>&Lwp>dpI{F;0x*>nv7C0 zb<6LU>n|^wv-o-Hg$s+%kLbO{Yf!2EORreAxZJe#2c0A8AH&P|(xvy(g(v4)n01SP zIdrRQ%}vYvnpIuoJL^EA>$;{du}}V#;k9YzaBu#Z3CF*7QqFqN%g=1`1#5>@D$`AC zYxjRkKJxa_Z(pbX5prvC-^yD4eN^A)Im@%X1jiZn58&4UE3x}qZ?v3q_kN#5sVCmlQqjYV=ZMW@qH#)RX zd9>YdWwxJp|Hr@ammrjip6yGwwn^D~py#VP>%Mgwazy*dVnxx+eZ|Tyi7o2d)9n=6 z8>83oXye7!e^fkJ{eAX;pLcC|SqUnPJyzdY@ak0kgrXCx*KHaNqH$?2S|Xf0$@TnvF%E$r$3$?-RNG8U#eWW zux?oO34K1^J-Or<+U0tNSIX4KZCB?yD@NLMh@0Qk_FBbLtu`+$uDJ7grAwm@)2!Fx zu$|%gEIPMu)?R0S%e8&K?A@bjme^?e%L_R}*B?-yyl4B~))|NCw5(8=-e3N>WT`>B zf4lo}!EEi@dT*B3-8wqB(f*9%Jsdn6{FK9SGZ@~Zc|W^WD&^mI?f&*BTKU#*e@?ee zeSeMhz=7AJ)4E)E(-{YG4Da5;u@{ea`=I;fwK{u1xBd0HO-Fx`@ zh@;D!uL_u2cYd6vUbYhb5Y~uF#mnL8+kY8;{#fIMPUd&!INgk`u{QNVWd9MaCsvGD znAJHFOE8A_!0TvAf=6oNJ1_4|(e17p-I{aq*}x8uloR{DHD7vQ!({YB46jx~_dqVt z;m0|D?z=E!=AZ3<9T+j>M&i_@euw+bb4slHJLZRIBTB`DweNOT8}VlN1KY4@wWs6f z@KwJg=G>j1>QlevlONxkLw>;wudeImw`HH3_O7HhvW-mlt(tjn`?p$m zKDR`gISg;(y1wy2^6-TfR>Llx)Zuhc%a%Jtfh%dZ@_jP-7ac3Fn_8#2`Y#}Ua+IlVegJTu@-#Vadv zJi5JDp&WhGWoo(In&FLc{^A{M>_A#eqHl&uj*I*UUOW1=wK-owqa#9 zbzPNtblHiVBGYVd_>~#CMZGP@*tbFUip5#x*RV6LV|ZU}Qnt;vFj_rWAYDAqJYrEJf zzgAuT>EN+-Q&+XV@oO=U3B42*%mO@YtTWHOeHVeFZH8C%c!){m4wHxNa-LgaLU^Z& zS0d8;7V9##Qx&%(ySzJvcZZ4+!+ZJ1rzc#Hp_`YJ{o2Zlb!j2EUH{Q`XXMNI< z!E+X(ANR+kNvZfP{(dRrOQ+TK$_yXbwDo)!)+Wn>UHXx*^Y;_%7K{tR zfp$ffZl5ok%WSNBi#i(q(jf}S{-q{Y`+ z>u>$suFTGorlnUN3*eTU`n^as$#9$c0`-95=}cG5ywp6qV)cHn-d!tYcjuGkdeud{ zQvqMX-p(p%(hKeAHN!I+5&!X1<#vh2r=#lpVP39Yu^UxKD=*C&I{hbQ%~wAb|IBed zn0sQrwr1-7Pi21TP`UWtCj(EO{j!W&=lMhK_(bD)#o2itD4bB{t6O{q)C0C&I2wiwTUjsuJ+7= z(E)~6spnwNl5hO|ZDwS}dKK>*-=*E_4<&E(d2!=?{bDO~Xti*d;VGCNR)INZZYqEgYUyZe;>#ow45FW1%nWQCwxY7yM>}BHuOa)X^_9eAs|eN3{nz zZXd&IGUZ~Au`8a{wV8eHgw@8fH|#=^&h-4X*x}cj=?(pT`?tY75qpeEMg7Gm_W#g) zL!Ak|V@o~B3EbJ^;Pzsjy>BLCObusv!=idrJO6m4l}pftx6OKe*%v!v za+k&@Tr!7lU0Y+&%A09W24r{+(_0x^+&gTg84%oa*U*tab$e9S?4-@46^p;Tv*?l$ zIUj0r3~y8PFYoT#@4naTl+Q-93m*>omYUvsyI22t4bIdo?elpr+DFT3#9z@9t6hUD z6#ephm0sM6)?K#SEd6a{%P+Cf;b~6w&&+yy1oIb$w?4$=?T~;P{Rb>>xVeUE%Go=8 zEnh_K+i=11!?e9Kg4abu5s~3F9TT_2b*0^=GV4DNAJ?M&w`02b{pa>^_4>nmy`smi z@#ApZi*r-V6XyoFJ0I43wBJ&-c!!XO6Gm2^koj=R`_mhT^gn80w|O}7%kX-hAD+#v zb!gCZqjq%JA+ayFTho^(eOW3wA?jy9~ZU{Vd2&CBkh-q*4qdeKMf ztf>FOcyBwS*^Az8^ICIp*s0j3RvE?*TXfyks~sE^^TkkJ_@9Ln1pHHhx zwI6-#F}9>Jb}1DzYg8-d<8s2eLfg&7`kZJwWI*VNvt851h4@VDP|belNj26149}$F ztm>&YljbTqe=S>i(Ie}d2d8eH-0pguslRPU4XtV`J!1uJ=usF{zf; zwsp4qJ^8KvO zP=|r@Kh6ufx^lbGt{UgeYX!f*=W?a-SKH-IKOS{Dv<>q=hIh1N(V(hEevy^BhV1-0 zCH3j~tMwLEy761Y^l7dqGQD5EgW4HRpp}Y?#r;RyeR94R)JylX?hln~f4g3O>*`dR z-(**0?NjaQX&s5rm@;kb%}Z0K6(76yIWCAW zyqw$3lpmf((c-cB(*$M)Ma%Vkwz!4qxA!BXB-DYgvZ=ad*)K)ED){6hM9m;^UiNAAYbTwA|S?5gq z!6o0N=V^8`}FVs@bHKMZ0sA*K^!hhIcXc(x%#9$|bJ*xJUQdc3OjAr!sMe zI?T+<7kPTy*=K8omDUschMd`=F72dVc6r^LcEh{GSnR^# zx+SF>c&GBl^MT%H4qu44yUEXCYg@-Jvt6bSi2W_R_}dFVeMo^}Uxqi{X`c1BF#%z^ z)~C;Zofds#>Cm>{jvPB$^VGy=f7%RMi!?VfyyjEJ?Atr=@-mZ^v+EeGXtTH3Tl3|c zpI)*YJ?h+!jaRyDf~pb52BpGd^sV+I`;>KjQ-99jB0H+@uby#rM||d;T@H!6eZIt( z?1v3MhNtmcb1SagtGc$gv|;JRPfUBUaag4{uN?M2_Reao9Ip9_i$M(U!R?s%8yo9v zoiU_M?+>Fh%w2{~pBCpcdBdF6QBCK}`LLSf9x}WsjgBws{OAYATSvT}KXMyhs+e}Q zYDw|f$cIngsuma9-Gbxntcbs%H{2tBTYhNDM$;TCb;_hui*J^1c>d0SCnM4iJw0;d z8~U_C3@^51;?x`UJsjV(D>Xf!!wHwDJufnUKYjGm$*$Zlj~(6`<0=rtD}Ulg=QROd ziP1Yc)wpMIqw|_&L%nXF+J54vHr!8h?f*o1nAN3pEjFL+S9`*tmYGhQ?KVXEd@kFn z;l&o`ro3p_sYs2eL)jfLKV^6wr*ta4XJz7~D)GPW>M_lK`iDUidi+r3_Wa*JWt{xt zbO&pI^$c(KvSR0gY}}1oIr?w+Jn{S3mx&LS4sKCa^J83qvTkp4%wLS_QMxTA>wdlW z`T9}Eht2O-Ty@^1(cu~am&TNvX!0`Tv!-i3;Ds~1`jY}D6>pw4xBSv`_f_kDiK#ZW z!(v~n{nsueT(GsYx&fR;4DarH-aQ-gxYly(iQO+3t8@72 zCF~zCyoqVI!p3x;wq$f*T>2NQP3q=8?cBAm2iA+d5qj#8_fL2rqmp42#}<@#Arv0->u&#fr8AC@S5tJ7w?X)@44i5#ETNm`kZ_p z(|@+f^%osGq(pqEaMoldREn`SQ!0jSxsdYVjw&P4&D(0n*1#>U3x3G19#`bq@9QF+ zY<>)Wf}>l8_ifIz33s=x8uIAf?3$~~Ox3=9zIt%~ zb?wIz<&Lk~><~Zm!kX7pQ67zmznmEdYfsMzH<{k^(TR_Zj?Ht+uBdU}kkaJ-)F<~% zoOfZp`j#UjQ~X0toO%}Jo#4I#Xc}nH!KCae=fAndN7mwWeVrX6ljC4I308m#L<|=p zBcgS<9hQ=&>6@B{>!Ssw$c)+bh>0sG9VuswF|yGV8`qBu0>_lhkC`B1EC)L#^O9eT7T75fEf#N^|QX<9;O}{O+I?_;jHj-p8%Dgw1T#8 z)JMLfD7fBktRVG8KX@p z_*jcRgQ>C?oRUy)<6$O8n;;op3)cUNDwGA9Fbk|jL0vg5HKyS5$3!-@PjtcQpm$Bv zCZ_3<$s|x_p%sBJnYH5?{O|G?*8nsIMkKhhClbh zlO1S6k3Cga2u(dz3yHyyQe<*6T74QWH57R5$j@sqSx+hi*^$0J^|+{Tg|H#O%9Pon zFVLD+I))}{6Ll$>1#MrsC`Kn|Y6?7!VKl!p8~j%-fe0}@$HL5I-|tOS|21p+pBhq@J8N?)G$&sM#5gARrZy_`WX`Q3pF^tp&?S(-i zf~`WpUV1X@rbidbWKPOlLADlCGn1e=Ew1_h`(Pu_WXy)pifr_qcvZLg~dxD zWVCR4IqX4@jeWA&uZ{T!TvA_Q}jZm z$^ws1)H+*464aVY<^{dqXUR|j1gEh7iDPSfA&f=1s zBV%F;x@9kpIQcFo3vc(QPjpIp61yS5@81+q1dMB81kZ=m{{Y|lr1Ed39OBY3E%AGM zO@+sEYGi(UjD<%ZGk)}UDcYpy%>U`6`d|wnws5Ajh6BCASz@H8#U&KVj7sciXbqL3 zD`Q%^uU}I$*(N7K{74;3zglmx%3vg42VjP^JZ^Bk)yl zLOes?>$m^SD1aIkr-Q5tVHuVf0Xpz-m6BNq)e5sXvRP3G^-8~OMYqBWtOI}{CLywq zp(XzJ`kok(7@bi-hJ>y)t&c9fz^5|O)p=o62<99HbLhg6S8|H3&{_~XI4>Nw&=`}L zqpt#O#oB=xo(L^WeVhZDInAhehys||_Aq5m%mU+Qe)y{V&e5%A+ih>-jYU}5uIEJeL6&#Kd1j@k|4H@RD1olgDlto zh8Ev9C27<87F1OWl#sO)D3lbif(Y4*ODcrT3sF=_Ndi}e)PdlXjCv%fIWyz>MR6O? z4mzuTVwX1%m6E;s=eQ^CrbZuFZ{EiWzBI8Pj?#O&$tT?KYL|+ zTR$L}-?;aFBle}Ky~Z8%8~2-f+-bjY&&R#`hMQPGyo3;Ki|c8TLq2g?u+h<}#r2fn zaTf$~s-LVGfin_9>DzYTf&!?X^3N`U7iM#SbJ*uMF2c&zZ(M>^bH8zER_=b|23Yy| z4LhV%bwjd8AOEq#l_&N1m=Z70e}~<9NBoalId}`k|7F>m4*&C^1M$X(PSeAnTg{cn z&jkN)od>^kWVi|ELx}q4XS_ixo>`V6bzlC;^3|q!C-ni%)@J0f*9hi8QsN?`611?4 zp)zYjl4DN|B%v~Ek8fOK!Sf?G7s%xh4c7|rM5V`)^$CVm1>b=T+MjE|*$FTs&Yi)M zK)D6XV~8ayN$qXX^7|;U8GXef#iviZzOo6Xr$SwWI*O&!YzMPU!gvV5Tfe{unn8YwMvjv3Y z6J#WjkBb?fOaAVvF&9Jve~Dife&R!NC)H}Ii@1fx9^8z{A~B*SWf5<<4VC4Nzs>Qt zJ^s4jZ!G@0;cqYeCA{JIOL$}O7nLn*GXDDE?+*NR$KSp9i|Ukh6n{Z8s|o(%#w7$z zywh6=E?f`mq=#wsusA&ox6FjN6ZNnKde{;@Y@Z%>NDsTHhv5!^kS?j3^Spf2!^plb z53>;7N^rgPFsi{k&t%n>$D5>w{cp49Oqelmd9yzN0oifB-);8gP=Wa;iygc0dM>CJ z`nLa%8huMHK%WHlBttX z#)q+K8MHrRa3Qw8{~vZC#$2FT31kD}{=4qO!wll>$uLP&W#nB6zVquts0%??pnt?J zgt~WX*7USR6Q?f3AAhMU2*6+J3h0|~sHpj-Pj4l-P(2J+lvrp9E?N)kp@;pZhh5Rb zaA{JY_goJnlg4}+<%G8qoKg?7(!)ITFdsdP%m(vu$&fS8-yS`TYB3MHq=#MA!;H*J zaOP>nIdgdFFb^xnnL8Hc%}ob%<~Q)jmWk;8+KrCsT`S9A}n$YTb?tjOkWDT z3nTao(OEs2iK58@4K_4nQCx!21c98=*A(Iw#XIW;$Pg>3=ioS(oST7mc^V)oj*JG8 zK<-Tu&s?BUTuOuNzQUPS?);Pl4&_IrTMFNl7fVnh-smsUEe$w1(kvt3BR~2)O1rB@ z3eiC}oKLC)RKDK4|7ndHX3k)$ikzyFtwLFtgT043EX2EAxH`mJaPAE=c5)oGKY4Nt zQHAg{Omm0BnicG*F-wkW-$0Pz9lMsxjTfkbKUQzJ=nf0%6dVK-S-eA6lPoH|Txo`d zz{5H7vgf4=Q!(BNFMs~w8Pdl)gfbxJ5w2OiLqgSXARVA;6NE2&KCOIgHL^G`%tu&a z95p?$croIHOow#}_69E< zHJ%=#W9Dy+w%R|yJIpW0O9OwFVVY3*Y4>M%lx;FBCpysO3zWDCQ2S~4I3ev-0w2bl zJlxyQ5N4Vy%mZ{iJ^X__+lsVV-dP?rtUkzO#lxLpxK=DLURFHZCnP8UzP=hJ%H>S0I0$CONp*1i%h11RsJLBh*W!Bp=?Yur``7 zzwp4e8YU!?HD|))3s1lj=agqv7g$PcVcfu z76S8zqe`Q4>FZ0rIQ~H$__F^Sqosl)=6q>*28E+#LmnOyr_7a*hy0C8@-CV4qXelk z8ITcGl0pBD9JfP|!9TK=3Lg0WKw>a5kD*Gru~fpB85zxk?-lA9tO-;3@^bp;R#JI~ z^cdGzovVuc{1sQc`AjC8zeN+}L{?-;P6MzCDk?Zfm&qx&u}r}xYaSWp#>;DumC02m zr`&P!H^$216~GcJi(ghMx!mctSNW^G_;HWwU}s4ktS*;%?wI+DJYOuny;J)nbEG8m zxsdt)I;5AH#?9-Hz9!_QySD^S-?MVd_pITe-XR*5CuUwWNMNQE>K*9mE%q5?C70?iIlHGhrZ^}4 zf5ACAvj&dw@PD177hu&Uw3&b5&HI0yqc^wH*jhU}xy0E0uXFVOb&mf3jC1rx7-t&e z*91Rn{A}~kG=Gm@hPtL)CNYI7angMT;~0( z9uDiiJpLwrd!{wq-Kxx%8yTf`{#ZTx&F{;~T$pxfn%(f+-`N!tC!C+(w5^Hf@7d!Q zZ(%!ASe|nKUpfsZH!Si;>VSpqei_lOYcc%BRQMCy-Lw-Yb-qG7cW~Th%;8{)e|TqV zQaW@LsQ4Q?lzoK}xm^+I7#yWh8sY;4JeIx}Vhv+)XpRRQPU-}$B#YHX2;VpD!AvYsg)iDar-yLl zZnjDRqA(&SG4jVo;vS|n!|5qUz}E@iaVff_L~T-9d*Ogp#qYlId%<~k zV)a|IY+F@yXeHeU6+A!5K!V>Vq0|Ko;Y;-M1TRa0*d~Hcnt$r&si|Xgdt2rWiU05K zyeHY&+q&2~5iWU8s=>S`bva?gjT3~FpZBD>(%MdV`FKw%g<5eU7oK}Q-jn=LZog%~ zoYe?EK`QqAydAAT!&Z#uxYcxoj%Nmb`FT&GDmn@WpbO{_6c1IL{OGL*d=qe@7vcpE zv6>$}FTlqwgsFb~=%EfLKYA_E>pWeE&Ui6l@zpv%dX!GKfWr{+Uw-uN06rOb=}UMl z>U{E}N9PV31RNeSe|pm(h=WVvEMqy3MNK?EdK%DM4xFMZ4S4zSHy-rb1LxLi9uJl) zd3yPHiz>5*#}WVkp7$v-3286jlAQDNK1Izu_#e`X0AA0(p$AK(+{k}OZ!z%J=BAg+ zn^il|JDGs6+!m_+K$8FmO9Xvhn5HQAfTok zj!!&z7&%=!0$4sLOLXdFj$k@aL_6}wIf=TXCM+mS<pkVKi0CgxGY2mn*4}>Epfu^6oIR?LhPiSo(5MjeO~B})Op zAOpR8a9E`Bg6ugZaOe=!K!ndP+s(p&?Tw>b9>YLIzz7Tv@PGs;oLBOY3dRth3X#GM z@!7UnunK30V1RN#yJQ9im;ep&skjKi5T8e2(xJrZ48stc#B7LcA%q(uvv3LPw6kxB zO{GDx!Cjagt0}zyI5BH{I18ktDbP@jq>=6QkqtFTAK9J>jUpRrlQgn}KC+=&=_5O^ za;4321KVP4F=U*$;~mF|tm|=@;H-pj1NZvy4(dR!pbnwla3NJ2ShPKBNJ*%ChJ-}N zXc7tY^^-phtRqk`q$8marV4?VO*?1~@W~iNl?TaQk7N*89wY}nl0j~HkQ`Z+qg+Ya zrob}Kke-U6m5Nj(vZ0nwi&iEZz~M9t=gQu!M<6&82oI;SV?|1ECJ6yw9TJ3AfP-l2 z$|#UYfDaVQgRx8NdPzcJWeH_1lv)TOwdJFELp|DN+d#mV|@>%QGl2 z42lIzEcS9zB9jJ6)aekCgpwXfBt+GUa3rG8;~?`?^QhY+r4wjBhHBUWKhC2AgE|DV zo|Qt3Bq8dKtm7syG$MrvprirUIO9eLcl;JjV#m})?g_ZT0GKVFYoqhPj3ycE&$^PZM*lz7S{Tv-NkB~O_YwE*X{W+2fTg$o|a ze3LMs{gR7MHld{1)2|3d=c((fO$o;=R&>5e-N^3%E58wj-2$kYTLja*KW z;~$n$GKrjls|BWJt$~DW^Ef2vlcJzgdtk|6YBtvpCss!nZc)J@Uy;w`6m5#Ow}HQE z2)v6ZB>Wy)T%V6bVX{Ji`k$%UE(B3AhK7Yk;}RE!T2r%IA}zMIGms)N-9{L*0T+Y2 z>6+N|q-eAgQ?ol_6kfVfJ(3L3$WdhvWCHgQQnazS5nyUoobr^SjqxL6!CEF90)=X$ z1qjusyCTh=scETXrO7~&q@at{_<%G6Qe?m1Y_r@HCTS3@j=*BgOXF? z5+hSG#TrCXSS%zRr^D4JR=RIQX5uM>tX3~a{GPhhG*ZFP*8q*7you09FoS$2MMp;W z)UvAH1dt?c4_#Uu+7;_EsCqsY`HRy78B!vw92JSTr-q*-s=~wkG-@x*&PW46 zh23ORvv4rSIx)&t06r4w1|u#}qxQ4LjTTH*)E}wD#P!gU<#Y5^RG#a^d{Gh5%`8@N z$0JE<{3MekRtst(Dpjg*mS7LW3TPJ=#^m@!XnzR@f@KZ2LU-f3t8Bys8^>tNg$ zeMD2eJ_8JvBFy8b;`%4!j&jFD{`6fBMl z9aI-UQTc_QnPf5rywdEE9P?r^$k#s7ru|O!Bk$ETZTnljI+jbiD@LWm=aL#o4j?HQ zCJm4%P=m0NY^9Q2Effnn z0CbeBU|4^LZ9(3Bc2yvq0+KMslk8}uL}MaJ;m!psKvrNhTs;?4%$*pOW^Lr5ui%E8 z7=De|tl-i}otG0D%Fah0;{yJ4WdhR zV%3j zeH#r2B(^`r{3WNO1?W3Yk~yjW|GgV>BGLu4sWGw*QP!ZDFsYbVgFbafa8k}YP!9%x zO@F8WsFAW-CX{&^tLFQF5|fTrMHYvcQ)`HT6a1W0M~raRK4apT>vLk^1z?Pld{#g# zv_AqK+)&5Tlj1To`og5B zRAnTd)@cj&uT-?zkYI^8yrXog(36PCL~)Wwz3D9~Fuu$2fCYF~VRHyZt&)Zs)|XT2 z61VIWaTp=dj5ae=KlvOjMr4yQR3H)~aeyU`=)avn?Z5_KAXJR3G^Poh@m&n1*BIIJ z)al~m_`b1$5Jx{Ov!%jIu|Q&z5+h+U$56MZTZ}_!OeTi@II41)8vLh=rV*Vl4yu0H zkbjJ>r+%n?g($3>rWqz1?x%OocmL}EgaNY?$h1V9# z8sk0_-W~v`eFyNZgm4y9_7kJ{>=Pghj0UHtXw@|Npa!S~KvLA&q4 za@&#^6V|3I9?b{z6^Bg+NOF(~=LcQYaDTpMSPSZG&_k0Krc>l5mI;$;D4Wxd0&P~; z(h}g0fQ>l}o4WM#R5rAN=9{;n3ql+=RHFt^rl^62z7lt-OM5qe+^L2>wa1ZGOl0zgW4BFQ~kD^IU z(4jvi=~Wc6z}I)8)*FzJuuuavKUJU?@OSp=N7gg4x=x_# zV$EP|GbSl(bPXTEAPgot>eLxoh5<7C1eC{UPh?rQPd0T~)g^zv;VB7x4^KHyrvi%6 z_7PeKQsww&OEq{8YKecar@n1fpt7Zkg^ETEl3F=US-o*v$ww8S#sxj1$woxXX1&8$ zizKeZ5}{zK0Gc=*HBf4Flkpjf=9QpDZ<3Bx5~~Wyh@@|&G^OwlraA>rzW6oARZS!O zRVu81I9d0!#f;dqquaG>`t*-6-+{H6IHIBqt>3z>Ji_n{fT^)J_U#Ha-ArC;yW==aom ze%qM+MinQ2X|IDkzA!w?17FVkT721p@iqKkHj2FKJ|^LI@wMe$PQTpd^I-f>fiI9_ zFsM{4D!JFE$EH=6o0o{sx-r6S!S1Uqk4!$^q4}H^JvzOpb{94&<}kdSBXysy%shC@ zW{c02Do1==UOP0inErW%%V=AR8p|{6r*YhEhPV7C7v-s3@kjaQlMZv^PFN1vU%%z@ z(_J>4pZQ_bmpz#aVIBZ#7D~muR`1rujpKS;yfbCm(9mTYMywAT-`uY14eO9@TY@sW zSwlsI;Z1wqrD~On$KM9;+%@=8?@_7Ke|Z^S;biu!km(PKed<2TpW`kvyqnjS#Z;QJ zK8tfLVm@_B#wq2xxApe*tn_f#T9fXXc9pwAH9X$XQY$qrKeJ|8) ze5%p;(q(Hm8{R4kr|%5U_tnfs<;`v{`_X>G#I@!_1J;kaI`DARxsZn^SI=oUcxN|$+a=3!!V8`ZPfGt=f)?5%yTO}O#2>zft_{KsA?kNWq7;SK(w(aIHXUvIdV ztxNyy_4ss7M_IBW|Ru`h6XvC8=nci`~Fko!=c?DLj&53^MFTlhIh~Y>XaW+n>6#>`u6gx3pTE<(~>6oHt%kmzCF6beZSwA za@;kB=Ut@2Sl!{(E`aIhC zBx=y*E6Y|lv<;Zw^!4L;i?m;ctSlZeqLzDS)aBs}Z|=K?H-Fv|F~F(jsBfKfZbxnX zcBP$#L-EyfU&lwSzkC|}{lf6}jMN102}pYQ`*o}2Hev(r0)ARS{)6-K%UEI9;-c0q&S@n&Y-|;Ll<;mVXuZ=oQxOM;@RTylZI z2Ubmb==AwPQU6n?9=WPF%{i%f6JomU;GhOGGhqXT;m!Io{SfqMl#0tH6-R_Rl=V7&_}cKy_)dq5b_*!cqxSD}T2FZX z!;Hx*U>PHT;U$;I+%P0|gv-tYU*|0z(5i;>?dz``YfdiitF0&Zk`ly?m zS5#SDshamY6PG=sXN(Zi=U@nxUl&A zh~8Vg29?^s^onJR%S}sv&^bb{l~iFA8DF~eUb^t)Tnn>q@h^vNb*;H+nP0Q2i+pDt zNOWD-^kr#|o5JwgG;_E&|ICErUppyhJ?Q0UHu-|J!zz{OrnR+u$Ik1w^DsP`GrYPR z50wFw@7Q?5s`A$uj>}|tet*VAI;3`P_2isI zLd#;0e2$l`KgsgqCgq2|zYZ&5Hs}P$9btHNQlIR1JRH4rLGP*VkDV=M3@Ev~)TwV1 zHXgb^q0{^pXSU)75@e`U^lV?cwN1*_13h2WS@*5ekR#ep7AuNo?kiSyNo-Nqo^Gc& zt~F1i9;@#xcy+3NLeYuU>@XfOysy{%N*-#sqVvx34WssVJaKsAiz)~A z9goW1IMx4$i8eR)!+cB`;;+miC*@OR#$w)ylHM;u+=d{w~Iy7S{S z^|CR(y=8bWho^7=SYro$5czHc;Iz3 zCBY*#@tv3Vrs#H8jc(03`D|c^N6LwP-SgA_8QbG8D8Bn&zjWuRJua{KIJ<6^eU{M`Adf`-Wldj0~FbJ zew)^*3fc#zTS~=*weNOT8}VlN1KY4@wWs6f@KwJg=G>j1>QlevlONxkL(Y8}-ojx+ ze2+&5H07o@AJemD+Mz`Q&g`CB@2&sOEyifOPHgGGadcjwRMd67{I=|K)83WTMz*o) zM^oF}+*9+^sZ}%YZU0v5&gYhBLnSZ`R4O*E>l+_b|3$*R9CI_Lgk4pm$BmpcXuztI zHA`(gty>v{`3r5LDizmn4X$5)`~4=%$GZDDriLoc#b2p?Y?bS^AD3S_ZW-&{5Nf>) zZ^%&pA4eoR<@D+}@yviT6|bzw@#ywqg>v*!m#O7;Ylb(*e2w9qnsWQkgx;Y|mo2}# z_dr*RFToR2Z2GuVusJnp=7+bBTBKqvP?6H@e0k}PK|5E!s`U2Mu+*hL4*x;9XMUsN zMl&W%kAL@TL(e6+WytUz$Gc}A&k1-^GI^w1Pu*klX4fjrKGJz__UoFLdsV;c_nPDG zFg)9^GMl=t$~?O4L{5=uwm1CBjNGE$mSgPOAbZ8)Ec0tM&`)9xs8oElN!d2v!f5qi zm2>G!qeA$m|4yFX7KeZJ?I!TY?PC$6vhe2n#o8fNcIx?pZ) zQJK=++Aem=uT__SI(Tf|)K#r-{94RoLN7%Hvj7hp>&$a+-$h{M!tkmd4>76SVe+tD z&T~sl2=7$!N<@0!VqK*sSbJEhisdG3xc=FbdotL4W3L)&%0 zM^!xkmqG{^APF_}01-kpBy#yBb7wbNG=crB?1vJqDT=`upkPkC?FzY z1E~rsg8IXXpaKz)q98@c|2wn$-n~l>e?Ptak58E0*)}^nJG(o(Z`b_Zx`^kCbLRd2 z$f`4mQ-5iBAt2p5;`z?+zxTLj-FzIi=6DUCSYH}Y@X@j7E59#Zdvew3rIF{4)gPMn zO!$|{t?qg`Y@MR?!FljNkBjEKmGe*9{xYZf4G!H?XnCvA=2zD~{#)0y(-Vx=0c&w~ zc^=2R`@v(j&LhtrGJbRFXy~ukKO8Xr^6N{omo3UlAA7X@$)Wvm44mU_dG=w`x~>D( zrupn2(fX&Yj~4uRbaA)%%=K3%HJtod(ml`z&7t!HJ%+Y>;J53C3m4Ce-TzeAz@-Ow z{XW0TrlUKTU-{HF=hwr*W*9*^Uf=C!hCMaNv;Wd1U3gr{3JsaPu9< zF85yW?VVrtH12yR=;F!tKd&F(eb(@zW=mHp%2AH@bi&y%Put{s0qx!2H0YPtIPpEwJtHuh#nudXnSavth~3 z8x6l4-K^dRXYc=X)tO6=)c-bjO4+;1KXm)7BK{rdT_5O#K#z9oKYaT0uiHF*Y|x^- zeh)qO>f%$2UTeMi+KatLwe{aHWtwH-G4NJkuDYS+zWRo%L+0t2YSDR`O7|zH>5J}dGC{lUwG=R`MGPRxBGF; z?$kfKj2&Z|o-$`<{e79ca2pcF^gxg9i@%uk@Vejb==s#=2ZA>H9_y8q|5^4|b@%*X zUDm}sY{qa{h&W#7)dzOI)PGaQN2g@fKf5CSok?GO-}sHk#=J1^X5yR=EC{O)cC227v5^|dw+tUqqUxW)0_NdNNBQ=#vjy!Vrs z&HhKO?H*Qt*_5}VW~>VStZjpszdnFI7~Y=f^E&X#z{JL0H@|Lvud;5)-Ea3?^Ph(X z-^@x+vGwWv*^}q?D#{X$w=v1{%7bxjX3SjMWlJ05;zK`A>u@n`$EG74t}XrGiNx2_ z75)q@(BsYpIWG)c-|LNr8~>VHF=$lP{(@&_teiS9>c{Af9+TdEqyl%8b>MOb9l7UP z>++3VyoSHu;;TMim;c=4qvF96e|u!zr%Pt8`07i%HqY^vtc(lqyT^Jx^v!^JqmwEh zeW=-^(<>KW{dDt#GxoLawPmiNT<3Uim3b7Ff0%t}<G&i8#V>(ZOwP5k7(PTyt*CBC>NF6uYTg%)wV zeBTAVR`u&Paht)||GA7d!@uj)|Jh~ry_zq-(JZy>;_@dHn*m#1{G})6 zLw8Vq>3ch_>wMAugOP4eJ%8n`s10At`6TOHP^o+6pnKlE_r7B&_a2Uyd^%y<)0@vH zkI8ScXXo)9?JS?hti09Y@$=)7uS}lYKCenq)^og%>UP~&@cYtEv;G>NX6SjH5 zHahv;1JC{SX>9#b^Y@=ols`G%@jq_0+WGP6PrsOx8F$~jciQynd~JWy#)H2$SY95{ ztov85<4eO%MBnl@E$YS$IMBE8h%I%e9=P+tnaKwZ-D9grig|2wi_mut#^Tc?j^{b% z$yUWZ7p?Rdcgwfg^S|~uzH7;r$4CB<<82NpY!PcZt|&ipyx*r>ToEA zE6>-D{=+olM8d|>%o2<3q4i-y@r`O{D!1c=i`zFR?^C86AF!afLywS-Z=25kr}LS3 z-_JXYZE#~?4(yy9Z_b*D3&(%AtDkY>_xrlseD2I=FNTuj(5E4NsL(&INp89VfR0CeO1DD>)&>Jx6S7*+a+E- zIpEuFw?fwTd39f(-EU$1<#_viyb=Q3OsP%pNqXnj;^K3Mzw7i|(_{Y`zijEi1Jk1~ z{i!HdIo=ob%=3HQ=zB8Z-hz(`el!l8(d%B*>m8du)BWAl_MeRGlnFa4bbg>m`Qb0j zI|CoRdUDd$LGRrC?EAMi`YzsFwDjTQN0%(E_wZ}yv0mVKD}L%1cXf~+$Wv)`Tl(6$M``uZR2xoF+$n}4>xyEOF~tlv0Z z;4{;2zVk-CDYk}VH-FP3_n{Lr8?HLk?YEWhwl6MtFNi+ZdWYj>B=1|7Uy_nt_nA(o z8=VPD7=NE}#e&hVwCL#d+|(auKRXjA9Wk~Bdc5-NuP@IXeE+)7@892W!pu3dW*qMl zweR8>FTd>HRuA&7x{71V9Ph;BBTb7vKB_!)WOd}iCheY0e#^bbeLMW!m)te@QoG4F z-p0Iy<9*(+pv}4q9X}hj=jfjw|LJ#n=CC`WHjOep-?sZ*tw(;|Y@?!_>~+UCStoVgJLl19Y3~i~|154E?oRZ5k#+Qq_BZ|VUcdf+!CxUu zgA@BS%-KD9d0FX0C&CUZ327JyIo`-wpMF#SY{Ov}=FSR#LCO5>^y!|*+NF3+ubi-C zT*aY+O&E_j-rHMWJlFBTQ{!T`HeTQ3v1v)4y&2n}Pwb1|y#Dmaxp!x@eiwFz9#n4p z&&@U;j*tFq&yn%JykQF4I->W@rv@yWnf0HPdRLBYyH=zqV>sR;eOC3TS`cR`81m`i zTT9cAt(iTdYVZDiZ9jSJw+lTVcnxF13mmWi;srZCxc{3MJ=Z_g(QV!E5BgncxpvFB zqaEhY`+WQ6ZzsH=D3>{2hvz~X#CZRB@vroXU7J7J^r83hcP~u$E}gh&aq8?ngMa)P zMtkVCK#vXK?yaInjlMSd;upVmoIB--2Nw5=KHsVPjZ?7+cDt|t(Ya3fBQNG&==tG84J_e5=Jpxf z>b@JnGg`icgBu*rYT9rj$M5$$LQZ5_O6nb0dU5ldrk8&Y+j%CstXtq*>n%lji{qXC zDP!`n%^kNs@!;?&*XEbD958#?(wvybH$6Qh?ars4zV-_2z#&xby5%?4SVv8`@>E&x zkJepD82jAavl}PPzkcDp;Kdhwe>%Mk<21)hY4^$<^;%l82j|zhac=gy_ahVBK0WsK z(Wpm1`f7D>E1y>}PIJ7)T|a()+^;Y7KCw6I{I5gj)~}oSit&YdS*exht{7L>eQ%JW ze9Q4>9}6G7Wt=F#&%%eu|= z?>{;??x9nC?{50Yo>|MrjjvPo%L7mBJ$CnM9RA^WSw4A7j&+XceR*X4WpSeq3`l$b z;`FaS-FM^QJ<6A7!mhZ({=)GZ9eB0xhPbG_^zCEYoNRq;+=drtNB#84+XuD{SGKJT zy#P7&4yAHiZ#i^d`$u;Vp5A9muT7~jfBD|k<%>a|FTU7iY@Ie~yBCheJeK2)SvZ z`r%7?r`OCHrp=_tf@{5wF~OHUG;# zS6&S6kopDs`0y~IugT#*vcLaqMst|(_q}oL+`90V53hgg=P$!#d@FPJ!U&$Suk)Q3^QTcb~8Gd-J34!7qQmv&s6&>spmI z?$)$fhkjm94;h?)`r?F_af=kk8*{H^U|!%8SI>A@dnH%2|Kx+xk1pJ*Qz!F}wMTWZ7Zl3?mt}(xye{ui$&Dba5cz-O- zdLf|X$ngB}?!UVoZFOJirSWeM`~9nvzfS4;#;7gbABBCK_2-Z-m)!97+sv$qr+zd7*Pmln3lsq@>{uc!9u`D)@>=qrv__4IF#{_@t#5B~b+ zQ*B>qxa7T%scxt5A5^w>XwZuImCIVEVqAr7Akbs=Yr(C4%-XuT+3;V|SAA@3Q{gf9 z&TFmOr#}%msBM}@c@f4{j(20=Yv)5p+@pMIxc7K-_wRP?{2}wY!SCajw}eezeq_TR zOVA!1Z^aY4+Ak|j@m!Yu>w)WC_pchdu!%K%Q&IO*OU|D1?E7wgMfn|5{CWfMpUW5B zswW;?e4&6IO(>Yww>RFfaQ;wJ?Y%pJ{O`?k_025xr3@UDEOq%23;naQ^t`XrcOn1z z6BLs&Tz*+yPZ<+NXF;-ZA$s$#M+B3vizM`CTsY_iG6FRu(Vudjt;k+P!#)4Bx zwfC};uD=PCcMwa?AT!y$bqMf{`6<0W1G=s_<-d_XxhFE9ogvG^b5rm~VM zUn`R#Rx0AVz*=b`Kr*9TPAcXU#{Hdvl6-#=#xYcs=XwN2r)+G+);pw!%) zNwx5lw7ny_%DKGpSd8Ts;92`3*C%qA81iTAuID7>7T*x&XXe)0+zp@7>8}@a-M}-Y zB&U|1pQMLaZN(X)IbBnW={>SBF1fneC!-U-^_=Qz{g4l49r)hJR!~@wTQF&QtqF%* z3-)rAXATbn@JQ@xj%42;Ei^T?76whULQ$qPIQ;u5i}ntB?KJ~h7T<&x7u142E6&7h zGRFqlD1>UW;Ui<$<(DUEJn3^?N7DOX)S!@E=N8z1G=1cr#jpRk^oWptqM$b;{d*y) zmScM1bgRoVZ_e{JtAu~VHOh!TQ*^aC^|hR)Tfn%cb?M93+N7*FGqot)z+84e4{o+NdFH<=R}-HHy@4P6bu2<%PL{tCh-s{@ zg^CJcX+Q^Xl}ZQkM_XX9axqIgfw=O-^_Q=;-2t$!q|jQBpI$2+t5&MYvzdI{mr*FU zk6aTvwxMt}U2FngnyE{wJpSn4)f`pTQ7cPz*bwM@WI>Z_JS#5DO{K@sT^c*{#^+FH z!rcgyaoN#-Z_LuZy?bCHmQgURxCa@~a?*PgW#-b_X}qw5)!xn@f932dqa5b6M4_u0 zQccATIdlPr%SNvn^ua{$Dv1tx;?^$Q9Z|b$ty zQiFrAoI-7Eb~U%0{Jylm>ngu!yyES3CmGeAk$q}8T~&nK$PN|j;5QloKX8Osy*43r?avyu(_z;LaX<1Qi>>j}z8=iZ0=!Zey(sixg7 z9_Bh_s!@tevl?}-aZJ56Nf75+Uc79eNoiOu$VXNV?&`D4#lLR@8uxH1S*pv!e%^Ru z7Wkf3Q~<++tHTK-4XlEExGooxuG(lr%-?v!#C4)X<#a=(Yr-XNLvx+1oC36<>n0Gi z9`eE6M@7?XLD(^mryIj+sZV1_vlY-SjIMJ_YH511me;qgwIN-U>pD%CwB)8vwJX4X zuNv~k=cSjrNRS*DZBq+MYJuN&bDdsFUE{jAaI-KqM`}RVa-*wvU1S;h4jqooz=G4> zimp*bhJf0TP`ahMHkQHYHx5eK6&V$$aB4|6(4~d7!6?4s&UHD!Ad#Qz@`N6n{J2n5 zZil%@lznlF#Z2vt@zeopVUPf?XyR8p^^+6%-nEmPP*&-f%*b)#U(35>KkAA+vv6r_ zuC%PWrXL*7S=7Q%ChX+J|J_boT$DZ@*3KUNtoG-(`=t)Z2<@4U$z(pPzUjFo8JTRf zrHEQT|JN*pdL^q-dLC{xuZ6B9&db-Hw*D>#eEQPZKqlIh8RvBV)2=-Tv3vfmO5tSnTYprP{OjWR|8E*1~)PLg#voRozq^ z>bgZ*2wHxoZJMhedmtxNtq6L?MUj=&gXVSJMy|37r+x)h|6YANC`fw30vY0m&v)_W z5xt#c_IGQ7yTBHV5AseKHQHz~rWi*VN1NuH4T-IIvVUVmi4Hqws`xdo;##cl>!(c> zt;`k2qbn{)4VYZtw|p-?kB%D9t)#W7{G9LHkKyy(>SnC?qkwD;as3P^JZuex~vrzH`6Ax4Y(rbqKdT*G*C0 zehw}XrDDIS0tskvfQwrOERm1#gsX;E*}gCBCDh4|PSByGDNg~e8U%te_i4lyx3*?E`%NAr z0=2ATD?Tw-BnO&3MrHf9Q%s_Le7Aafo2qsi2SypHN*bHyT=OdVWnYXps)DA-4?fe` zyf8l4xD7l)3QJI+%3Z3}940=}FKR)yH?`&*)5LIYyM2+K9tf-408UjT2Y}kD4;Lf{ z5cA4_XObUB7}yY4(plCqyy9b%2c$zX!h}qSJCtE%21WLL|34x|LPnrpm-Q zSL+qGbW);iaph4&E2&`8%ZW&0Rpl-qP3e)INas6mD|r?+1zxFmWHtel$H!I2WuxJq z0l|UCsJsyY3yp4~)f$x4UoaxTR25%ZX+w|@s(UFf@Wi;y3+bZfcXyLKK!?cYni3nX z-KwfGRXmVwnzPT#cdM_&+gj=RtMAqXH&fL<8B}sX7p;kJyKr=S$MC5Bclwq;k9=hn zAq}OK-+>6wWh?Q85JP;q?)!k$N7_!2eBa+UXUCB_S7UtVjVIz(_->s`&FR3As0I1n zXYP{XcBVHR6y;1eI7oS%=>P{+`%DWsJjvk)2Z`31x^RFsRIn-~XpBH6s4vp!8gg1& zCk^R4chAkLs!AV3opTkP*PV!lIQo`v0A5I8wgEB~X!3{`jE<_<@4NlS0N>da9Akvv zoY;vh_fZQ>&{y2?O^))9TF6#k23lF}pCp{FtCmbgH(j_is0LUX%8 zqgBl1m{I+MOWG`)T~$>zYtGf1(;AWRKNvfaGeJ*WkQhRQkTN9^CDv62qTukd^C74u zWOUzOsC@%Qq0)0b90Fgaz{%jVBz_c}O#FAqNl(0Q`NxFeUQ1N63X`k|p^}lUrqU~) zp}0bal78SEAFh#O>1}iDPdSo2sDnhM*`8x>@Pc#fUn9pkNK&!iywDs}$_f$Oo)47h zR;1Y^*}Ar-PIVqM62B=f@w=<(ZInU3Stbw4YtFTs)0(P^kJV2_6wnKd!FuMClvcig zyzFXcZtM*(_%X^qJ<@y5)jGcOW>W;6vS3-9o9mdY5hXhU85cuHU`c&Bgj7a4L@e(O zFLLPVTYl_1lH38WOyWB?z#;0~_YncP0I5{oL|0O?-UK8#sZ^e}BYo$73y-cI4~oRp z%9T4PNH5qS)y5xH&l@ZD%z41u-FNAZIXk=;M0$c*-j%Z*GA=KMmn$$gN4N(1mN%iQ zjH7r$hIXJ-8i&o?>_!m}UHR;_sw(JJ48c@ltjEXPycmup0l|-x^4oAYZnb2&w!$xhY& zeUSn1&{QfAg_E;#68=|PMWZMQNKn+kcka!rRaH#e+~47<9H7PSQPN-=HS2;%@5+u^ z^iQ?uyW!dfJV$WXk_{>OY8y2?CBxkyj&0gav?)lVHWz9#*X=Krv#Q)zzJX9d-UO{Y z3tVcQXkI14hiKuwML2cvn#?$p;m|VmkP&sPGjUY)l3{jHJJW=jQGW7IDFt>BP$dGA zuplx~ZT@mM`ygkm+KYLuY0w_u*{v^wncI;Gb!?7HQwq#Aa2Kai`4|OM?Wvpxn6(I) z+WUDs{kb{Csz`SaPwA`!=;iHQ_g~XA3pMGCKTn0)sF+==@jtF^0uGn@fO4N5aXVN z3zyX38P~ILO=sL?xZ1O;0pztKyMi@WZ@7XOXVP42;2H>=hw=(sxNrxqju7OTA}w5^ z+zD{uiXzbRBU~NWH5}q5YV;ypBImtu4d-0GgX<2CSI1j*g=nrk&9zr^g<*m&xVA`h zZGbD8^9%J+Lnpu$%sJ153m4{q<}$eGIvfvWE?iOUnh#eryB>inhFy!`8pf`raGBV( z0HH2O7!Znm#JKzdu z*KWARv&#?n_>5pz6S&Om3Vuz?T@p=9134ZrihWW#*{Y;33<+MWZ`Nk@`EE1+k ztHZ-@c$;PjKOE;qZ@bb0+lXq{>mk{Hp+wU^%TnIL-!`i@9qYr#AB}Vu4hB#l4oCKLY>jdL9Z-j zK-~sPA^x7M+g#aQw~6BB-9#DZ-Co(}?WY9QtEcQW_$rl#7K*{AD_$8I!jBTUDX@d* z7up0vMrsrVF+)bfPrV1N=W`RK64OTO7-B#!)Z_4&6UWa-{9f#j^||Ek&GGYf@u^hm z`*<7@pX=eNAx;&KRP7l%)~Bu#=R>8$Bb6I;2K8fVyL z;Q8N$bziF+r+9il>DCOz`YUP%!@V0q54BXf0uJ#X#Wd4ic_9~MM*1U^g|gPr6NOV+ zGe{Qla?~eX>FNHq`wVa5s=%c~pBeoFkfM~+x%-zSD9OkV(K zQ1kItX1i~5Z{uBQ7=bsigxupk(>y^1O-7n4z*hT)MKGZe2`E}v*tA&$j30;>Z zyHJEbiHF+!lt&Fldnr-=frvC!8Ry>`@CD@X68_fX?=k#s#NQkEqZg>QO847<DQ+QCbT-HZ{Hf28u|3;T|G|k0W~oFYG7*Q99AQr(Eim^h1QHygPvYBa_&{5 zULiGd4(SJ3(er0O-|C27)e!xw#{fqi^XS{ZI-+`#zBQ82+md=Z`i50UgjPpXC#-Ks zwHSQ{R7X@NthZzJvr=<%@us0at6zE)F2PMs7yN;wPDZ0wf}8Aj{@iy3N(}2w5RLjP zz4w>kW*=HbOp#+Dw1tSJ`Wwm2(PxlK^lG9a5PlIys!Mkz!T%DFi@fol{L$R!H2l8M zhjS&~V1fR6&60el&7C*TIa4*}l*+y%HDa5vyS zz&(Hm0rvua1-K9J2f+P+X8=D3JO{W0(9K;@Rsz-oTm{$|@EO1kfX@Ps0DKNG3GjKq zQGlxf#{j+vI1TVsz*&H=1I`272v`BQ32+JEX22DIGXb9lydQ82;9S7%faQQ60zL$I z2yhX(mn8ze0yq}% zb-;;$8v!!_Hv#4VE&?n7TnsoJ@NK{c0I}*VD+gQ-xBzek;G=-=0B!+%50LCA?*ncJ z+yS@~a3|m{z+Hf3Jlzd=5O6Qx5kSaR*_VJH0g}1(W56E(A!}v70Db~^3h*<)-vAE* zUI07{_$S~|z*~S{1JZkcFj$ot0KWzF1^gbcIUr=UtTo^wvEUq7Rg90W<(^ z2W$ZNE?`4In(Fuh-U9RktOu3n59kMoK2z2NunAxQU{kyGa0XyEz=r|511<*a0r(W)oq*2(h5)Vw>3j02%>l8zcho zXTV6nvw+cn7XV`buK}6?8^9`XH(*o1@qq0Bt$^(TCjyQFOam+h%m6F{%miErI0^7^ zz-+)}fH{Dx0CNFX1LgtJMpFskXMoTVWnTl90-gq(4R{U^yDnuH0LuZd06qkG6A(J2 z49h9zS0Lb{@OK1!46p~_BEZ3bj{`;mLbsIB&gWBrwCe^PQ#KNCCEysqRe<*Zt^u3~ z_#)uFfG+_~2V4tS2KX9aIp9XXg@Bs?mjG@CTn+dJ;LCtJ0e1mHXO*1<+z)sL5L?t` zv~K?iup!{jfc}7|0Q&*L-c&Xeko4Cuz$5S{0OC#1vJ}8C0mlP=1(*u>AHd0g(1m4r zfUt0vEd_*5EL#BxomjRC@G{_5K$5Q?0B^y69Iy)T6d=qGWxoMpg<1AHpgUk)Y%X{K z)(7+k^aZR3*c1@DwX7u|dZli|VqTzOHxcwRqdRXQMO)S$w zmrC3%4c7`|wxFe*bQwseNnDtQ8>!(^G#qq}j0Y{lE`##0hJ$91IP_&1?_~}5sfIhO z;ZA6{lNt{FK&GWxh2S4#RN}}EEN~VLH%7zJJVMkBvj`av^9G5l)No`G7V)lWxYig8 z1ujs!3`%zmM>7IZ?gkCFNyELT;dW{`8iPfCl^U)N#w&rVCtU`mi-zl=;piRQWJr&X zazVNb$_==NGpP@>_YIk}G#D_sUsJyrOTis z!xhW8(b8p5GT|~YE=Rfy%2c?9G44L;GAQ%lieX%ZbQzQta78n2rF0pT^>9ToZi93g zlEcrf45OCx&D81mKT>u}Yk8~N72)Jm^!AFUaF7OI2vby*vqovEB z&`}*cV*p&XbQzQYjEACsw3aT^mjul$&htbqjF`A^`1(p<6eN;6Otjjh6{aWt341+h z_sDAY`T*eQ*BE~j{n&~BoY?EFblruOFXBKI$N58ZDw#+?W+XLPH3%~jEsqt__`$j` zDwEd7P;N*res7^ra%}^oaf|-MxJ535GGD_zB3%Y?W{*zl1)3^am@2NB%D=VMv+p;G z6I$DMBEG5Oz-a)$@j*CPfwqNv&h9|#u9k2SZJtVd{7)S6)-b3q9 zo!Zw)%(dFp}S`?0Qj2-EF8E4uF+i?_u7-B+%1JynMHxu6xECSeu8@ zhtTe2*Go(4%-J7)rd`?f;*z=z!a?Yn#%0%&IkJyKWDm+3kpmsDo|H4Neh%0=GGlKw zV>&2f&)DD)*-K{Z>3{|GoUywD7SxxPc+T1HwyW&At;DN=8~O#DmXbQCTs^o%-86}L z6FeED#P|bfzeZpV{Ybx&RbBkbcr&RPhjh z8>hD?5&IHUB4#W2HE{cT{plyAiAsTy6Q$@RiDtR#kLV^zqOs#$iHE(fjKU8CQdN!s zHV6Cykb3J^fSm#V14#YzC?NITuL1i2ehWAR@H@ar!0!P~fY63zaezMp(tP4Lpat** zAkCA00<;4D444LZ5^yr$DZoO&(|{#_7_iu;`77Xq@Sg#E2=FXm1>iZrM**>RC|eGA z9&jb#1;FP4(VNO%0{k6t9pE2;8vri@z5#dzkmUYPz;^(z0qzF84v1c*+yML(@Grp6 z0dE3+19%G%b)?f8WvBz`f-=yqU^}Y}Wh?H0C=-pRl%Y(;0}y#DbpVl;@kp!Gh2Ilx z;SGpC#@7SHUs*#y10cy6{57R(F^#MyRnvOUmT@iv`oH&s-cE0VIK!+thZTo2#s7FXdLS78i}^Z3xb zz&*CY*xyvXWB9@*ezCq$Uziq*P7L?migVdU6Qk=B`k-k+LU?RNY$A>h4`1l%57chc zf?;ET3dhkgg!V^*5PbqMEF;8Zs`$iIv1$9Py3`}Y&>Y6H+`7wD5S0J$J zNcoNu%bZ!>?j;!L6UNXf<>vB$FsDH7pzI3N*&kttktrj?=U%aOK}Lbd$h`2eGR}FQ zY2m^EAUMXEM)ueyc`7fK3LhU7ZmP%)0)4iiL{r7gpfTnJ6aB(=(2Ri(LXY1?V%QUZ zp2}AIeL#JFy7i4lsw{Kmm`Ys8fB)Twwu{I20H@*Pjv@|d2%K6n{zX$xC+3&&rD7Z<{(1e0c z5JaJep|j$bgkh2nD-7{p&NYVqotDmN=m5kW9H)<))5+0DMCi{EX7gY!c4pHH@-W-U z~2h_Xb&nJ7~*+?8}poYj!Zz& zQG*0Gm9GQ*56FZ>j?m#yU&B>7!v_+$M;h8^C8 zbtifyf-pV;MUZ~?;Lih^L3N>-l~l&L89Wt3Z!g6V>Qx8?PrC`ykGL*U2^XcB#5lLM z^_8|ZAEj-EL1}BLr?l2*k5~0*-s=%ZU zx^zE>6JugF-gBrir6xK&T)A{HM)7Fm4nr_HUb59PHZj_o5pQw#LTCvP?PhTx$z!QnWEDHh!3r zhI+Wmdej3=j`F1P-JXu}bt-zdiK^DuAnO~8`VOfo;nqGCV#d zE&>gmrK7q2ZE3ES=id@tJuax0vfV(^9S^z()}Wi@&Q7%>uSJ+KDVf-OQO{@J+tTci z-``T~7}HL#pQJb0DWADd*a?>X%T1GS5zdm2Fg?v=Y;!Ifj(Pqq(bb}=ve8)5JjN-H zsn6O;cH}XKNvUw8x9M%^b;$2;$#slr=W#PhFAc6Q*N_R)Cq!?eG0D=an$8np93Xk` zuJK-)$HKdNrMU7Kp*EQZwHb{=VA7&N02Mkhxnn4v4~MZMHn)ZKcjvA5C8a$4+lWj2t zZSe$TtpVytV+~F@({#|9kyFG+^axM79QIgoP8W0%j`SrgZdl7I>?d7>$!<|WNufgF z)YoC3rvvI7PO^=>aZ`!#lPuu$6mHm~shYqMO-M66k4l1k()bR3c(n)KQ=2LL_wk+P zRvnOr=2j-;*g@8h<_?%jW2Pa>!=ZlUi~P8(Iy{~SaU6usA_n7KMa=i-Vb_f%%Mc8>P&XTA}fcvh`mns-Ye_CW27#eD~>Sz z7}*WR2i{XrDhvwan!14U`dFC6i7L8mvLf@Sms5Er4q@HhnhCYY>hLTV-k|$j27rr z3iFg<@d*}dL`tmLf@Erbb!1p%LW(&GDh#Wb1oJ4G1SX6bE7N=3CXOi~SzD*otriEe z9UmQOVg2eY!$wEPCPi7X>==cW2PT>3v7+AfWO!0^T!JOqYK)AGPENK)MaRcRN2zog zWSkgFB1cHHSOp6tjXt_?QBI-}nTS#(@9OK~P$9^JRAEAjMbObe7p~tivMrL4jI9hZ-$pVH&CX+uW-Ikz zl|PN0q)&>rB#B6(+$J(kLIm14+7cZaBI?~#;zy#&^&KGSXe;p~OVrI&N~o{2(}k&h0_#;&-!AKc)$$Ds75TQ8 z_#|WeFg+hTNIdf~5uHZI!;Ug6IoV7@8}%6(D%vbahDU%cST)2m=Riz~oV(m1!$}s9 zf!c|Qy(AsX!%i}eIm(!5g+Q_%z#>GIozD938h zEM@~qF|fO+6wAKSvwFI|f~Gqq-ja|2JsCe14U6#}Tu&C^Au?QADy<2LR5KCQONOCe z0xg5A$z$U!#xW`{L#vhBNAfDHI=+|4v$w<#1M9#(6B%4c4*RHOK`x@>hhZi_!GgII z-nV8r$dW2i@}Qp@CpzAtPxY60RC|=ZuMLoRwVnI)6EqG~^C20HPO@NZh%iUTF`a|- zVc61CZJC25J~0})UJh1J`>`>xk=#{Pe%&SGkqpTB5b7J5zy>~9k0CM+%WrJ_D5E(x z%8HRw&10wxCy8gfNA#G;=;$a69zuq~WjOU?>SvNmETcvlmP|aN00;!;U0UCWP{Zx* zKxRalg~&fr#xW<`zcjZa8Ui8PU^j@x;J3_}}@QW;2cXx8JC zqDQJckCS-TYv`WPvS?zvPKuY|vW`rPU401tBxrea1?5bepjFj(zVAgN+-lX7Q~;XF=Y{L`0}BEym_$F~wri*WaqkGfb8=v3EBj3j_b1Y|wLP;b zZ(7&TC;3D1cODy~J)Q60!5+g06L{B7dO#f6Vw~;w@wK>Q#L*HtV35*Fv-441sjKlu zA9qIT2V&i!;l+4J(=6E!#F|43m-Z~dXR+?k!lI%_#bPXuFek_{UaUQ;hew)>+MbsK zO=MV%N{q$Mnk-waJ+$=6$TwQ;Ct}T^g+(REd8=4&Xn3gwm5ZT}gL+a9BGCrKCt@5u zm>^_9j}h`fZ5Acl%olAoO0I|LgI4`|nEc)ff7Z{oHuC%FY;)uf(Ann5AE?+;i*P)S z>Pl^k<8AISC` zN>*+vFcgRQk*%bO{c7-oa2*k+5ID|VhbsjRR?iHTZw;ew47hAbI3;7~D6YS}{i%)f-@ut2aj%kyhj#&9|JBY4EIML^G z@I1Q}TLF`7*-}+DP4Iw=#1k#Sia=3+Cb_MPdW{2K{f$v-9ysB?QxnbYPi=KK z(o-FmAropV5Xx=krMQt=L3?`pi5qla<40Im#f{H~SmEYgQZsM)@x`T!2AoPML>_LS zm-0@Pc{fAeu;sI^q56`3OG6lyCHk(Xk`8}MSyl$z>C_`L(k5Bc)lWOz_y{!7M(K#> zR8kgTCz);%+)ilJj?fcLl%8Z0v~qs*!2#1j*#Unq{A!&iJI{|lIN{GG&~MdzsLl2H zkiLx-fu>1qq< zM|$V;F^Z!dX5kd@W~aP<6}-GaWrK~b~w|5`IJK#tv%KG4(3x1VQdfM zY{hy8^Qju)YFgNGW!SLfWSWZW(qSGY!+18%AvE{H97>O8QV5SZlparH@Y({lT8YPE zPZYrQg?(1TlLc9|W56!!fXAYoT+LT~_t%j$P1aDw> z)rB$1To&xD)$mqW5ye^wc2^k|l@Jem8LbtdY@CQ{tMx-FRSTwns<3CcmN5g{0vO2zys3dbU%R~;S0qWj4a$A z;IyI-1#pd=%QNZVS+eXoNa%dM!Tm3t9stI^vo;%&2(abS#g{NXkqklO@e0-yJ%(im zeS-bw7$F1b2kgh@tWj-u$Uo!AOsd9%%rh<-W;Zn+WSw!ABw8K|8wF%skF!R~H3nqd z0Z(~TSWmRIy4OD&^^T-UO;5I;fYTwUy+_s7+{*C{Wp491D1R>gI)G~p6_2KcfF1GY zuP7Je<#!`+S?ydF$jN5Had2*_owyr#iD#%rPHAoCbuGw*XPQV$5@&2fX?V z6rVCsbY}Qxjv_-fhZEouIk}(^n7m!zIT;;Z_i9BPPK~HQ+U0y z2=#JTfa9@5j8));`{Tf?KR-pyzGhiE-SMxV15samP#?#j_F0Vbm*DRLh#>wy2Dg|~ zxcfaS-J4~-L|diiSj93-Tin{ZSe-CUFK^$A~CRA4JeFUXZTi12=d zCpOcag>vmC*1*80r{+VgYG+QCfv!L`zRcqZ;DQOqOCzy9roOryc=ZQcJNW-JY`o^gM~bP!L7@R(af4^7v_{m(q#8DD*a+!GR9W6X$eja_fiB zNwB8nege(uzEW3Dxdzlag}tI0ise@)Q~&<$4}RlaeUeSA{Z@gNXYdyx>$nhZk}2vh z)K1j*0WPZNQ9Kk&QhahEOum-LM6@T31)dr%B}&EB(Qst-BRyw73%42>YWwJX9z~a@ z)6;MIaIizJTVFsvG?wDds@v!TdVh{(k;XFB!~9hBF3GK;6s1lR(|ztIg!9Jzk8%m1 z;jot1HTqJ++c8R~<)%?az+4_OgbkVZ!cb4^wTz!loziJiC>9au}1fG8o@S zjPt^Vr;l&s`GBzB>F|Acmz)n5_Ju6anv!(M%iuve^>nVAqqWYCLv>}Fzk>K=W4!^M zjg$TGMfhQ1LR*V|NPP}#_JShmr!+yZ%Yc_$0L`VSje~V|0P=_6EA-;xX>5C<_8^qm(TALmSyX#Ix5tYX>EZm;F-pu0Y*Vdx zm5ca5^b5TW9284B`XS{Fmbh=$(d);Yb)I*v=@ZI+DnGBzbDcL({uca^-k|yuq(7h# z?$MO!CO`B&uhnTiP5K6F%|_rie>p~Rs68m&HiXmML-3%E@;3aWi?_>kl;=Bet7VWa zzys-2TfloVUiJLnmuaf!{{irn{|=ds^4}@r0^s`!r~MSNSBN*RGwk2w6gr@|J=3JT zQr%#Q5Vt(b_7pr}C4`SOGHTdG{cs;~IwXJ&d{X;U`~ZQ26sF_pZ(%bf`bZD$2C?do z`ojN0AIa|?q$BxF0u!n3yWpm>!cq4jPU~J=oNHB=PTJzTI#R2@&{w)(d^c{zj3HBw zC9oja^W(70Nd>l?R2waWz$;3RxtU`e`j`=>e##?4H_m(n+N;IX7DuCdI|~7sQqO!W z`S1hk{-~yBb!n{X8G1cVoR4>)&l+ki%1q@|9MSHfrwC!wigLJW6b9R#y}%sKMy+A(dxW{0*%^nAN@qu?Mu|{_HCMmR|RpYr(L3n5IvIHl={kN$dCGP zl9X@aoqjz_<-yV>R@-PtNhIsBLkRO$WVUEOlI;+r=KU4;i9V9&&pA)Zm*n1oC-h}6 z>CWm%rjKO$Fw&AtpGI1e>HTn%Oou?Go$n1$R)s}5d8tLyNw%|cCTS%&qPdLQ>vd~d zZb2F+2IKQ@yg5%7Lx}ni&QrzVKy|6alRkt^ z%2=2R^R(25goACzNG5+hE zb5aJad0_b_da1nrN_tLVc4m>4w>bpOgb&x_dxdH7O-do&+l8{8oH<>k6JB@Com>*I6Vx<^k2HFO@ebfgqzPf)0demPj_c2Fd|GPdw{p@?Br+)SaGI2hi zjTAZ{BF9$Dnd$uK7t}Y2HtGlN=$jKfge?8YblK7ir3z8&O?Y=XC)0I)41|J*l$WPM z1{t2Hak~+&4zJyd1yaW=FPRsnR7F-f6;$<6UB!m4UNhx9)y_xS@1r@oBn=k!0vd@m zJys8L35-^@0b@3;1=W0gl+;`_j04T}Syx(Z1y=i5N?Jh)s8MNeqvYW+g&a&JN;O=mylq!7vaoA zou+r73mx}Ef%4Z`iTp2p)T`ME#HW6aJB7K=(%hW-EKs*O#}Y~7lz4buXIGX8^n9^z zSBeaT?LpWcr@?;`e>DH6bprMFQ-CzyoCd5OHw3y`ANN-o_l%6I?s-wZlwSyPw8!^Q z&H+bx{{~n+Z(FszFUYtTWn6vUL~}T1uE_X*%J}MDrplAX z$ltNPp2{_u=DJK%ohF)3P<;s!O@GPwH)VVZ!yE%YJD;m$*j72NlidTOM|w6+OsIOe z5;)kYGi@b>s&LVu&$4O`$9)8$Ocpgjr?h^cg)pQP}3D)`v5=tFS_z)E@ z*8`LX;rk;GLXrP6{NX}p(G6A9bu_$5#H)c%1fJBM79h){yvES}e^xFMsN4Bj!^9(q-(HO zGR<5t4U-_j8^U=5mr{tf0*>+r+3w!DdiyE%44vhlWZwfyEGmFz%?pgd^s_iHxU_%Y zF5^dI2*XR}fg><`8Q&{JduqN{NY9X-y#|Ez?$tA7ytLaFi}%HajTO)FCPp_}-6*>$S{x+nf7l$2lwazJtzCRLV~MqlwHhV;w+m)|so$N_z9DvXv~Ni}z~{|= zvp5nWPq%M zUtQaTplxnfng6A(B(Hvw&kcM8pBqX(t9%eIxTF_lW?-R^lbWlZS8ITH-qbg3bW}^o z6V3av$D@tilo!?>oYE%8?MA?14Pe!)Lx+1cYl1Y?H*+usldRX29UgP}q!(vm_aX<9OZ)yF?eXb# ze{*G)!G#m7q&|Bp9#yLm4NWwDF0`Z~iZMZd({lo{X)%hD`qLJ3| zEfGik$$iPcq0y^ZE5uJkIYCIIj%P$K%{fR%65Z+;+Xiuo?zVtL_kEh(Cf;I>qodFC zp#@F?pqF12TS#G&@2YnYtd6DYN&PE`-L=V| z+`~rfAou?ta<0lh*1GwHn)uuGcD5c*$JD@AN<)3HQ1(IM3EgWG#C4>4(wM2TfhAn^ zNcqNhC(N{C-`2`h+^C=dA!)aHUR-7jhHaiuEPb#p_ zMdy&!cJGYxxuvBEQ+E&<3naE`W`bC5|6ob$-JsR^n5reQ3xS#mVUSV0oTJ@N4myBm z;yeK?0Xo@$3^L=|pOGid*P_cRafo zBHF%yR+<>?i|J4*r6c@woKK#bneR00J`o1P519;wj8U2yj91rwMVV7duz?F(3AF>x z3b=Pez13eC){wI4ZrcvjpS#QUT!;4T>Qp~xOwY#_086fLvfReVzD)e%Jp!FBW!vB+ zyKcokd~R;K-H&st1qEraRkHpO`u0v8?SYE(GBF<4&OKZrdu*T!ofd+!d*QDuYT{g{ z(dj^%JTn(m5A(r!eAwG2VV^}7||Dy#)!7E z&j@~}V+L;DUxCgfzmvU~e45)nnM_uo0%o|FA3M5arU!8n^4DatTBqg4w#cTKN=GgHJp_<{-|H{L|xGr zQ4R^5kb7FQm5Q@Pd8j1l7J2kT+%kImumA@=Q9Wu0I)mRIc=b1*?4Gx2hgy>*wFr6E zdjQHGh(Ee0l-iH@P3nbhgzA8m}agocKo&SG3A9O-^lpOc?IgX3^d zh5Ynwxd^Yretb&g5FZCJ6Uu*L|dIR?J*WS4L!H#bz^0FlGJzsXbFXQPHoE_)KxJZo-fA+_X zQ0ZzU{85%TQIE##x8H%+g#GjpoA_j%c-fS3OczHaTr$9POjAp5Bf zB7S@J6aB*9f&DnYBJ=Ag($i;WJio)7l;?MMK`x=ZbX#w#52^{eIKH;@E3#G3kq$wb zL-E%I{o#bvVZGsp=5x?V^U;@KpXIF;bxyU2zY!4qeK69jpu0Y#{-OEmbL7u}{SaqX z)p2zV>?8R$X|<4Z2hwXVD(SXdD-Hl)A3=@#l9E0xgH1d_*HE782$v3XtIeM0tAyhR z4eev`24z}mj*T}R#mFGbYL7f#!`M4bXAdDAu#s?VCKq`SZX0YQnNzvSLeC=Y4h6>4 z{9?ST%tt^NPjv0Z{1-&=eO5$2;r0t0-(RKT4hkIKS4BAD{~_JkO!9vr{MKU3KvWwy z>Exr($+jXMMjXP3)*qplvBy(nEfC*IQT)@&XP0 zz1#WtNplcf$jdT9b#gwQio>ev0Ic~Sw$0=`gwiTX37uc#b1{?;rZn!+Iy%H2i+v#1 z=TmF4PnpWGfNrR#SGMWmTj%vEF3z@-qk4Fr(AP_j7iCq+$tElZF=nXuM`85^lzt2$ zzx~|5y9lQgNtP6GhbO)?MjW~T1Rvo_z3<658fWafrjCZQCL*T8Hv?XdVe^S2vtXTBl2jFEDH7^mS`ySb+S{Ugo%CEj1PnC0^w}E3A zm*3Ei)2c`L_&VT)UiGu%uz14943cmDc04bzD19TwCDTBueb>;~j>Crl=0qa~bc)-= zj_1Ko&x5A+Fl}(uhc~l_i-A+}p}8F&A3erm6@h|B0roIa9*L5yON$y|(fskX%HNhX z!sQjNvfNhH!!caP%5kZ6^{^yyDJ=1zO^vWPEnVB{VJY!^Yb>Q}S3QjCGAbrnr8m$X zjvH@c<6{!kF_UDA+lN2ORqtKvV2_Vu{PFT58Ns)X_Aq%}jJ=Nq*~22yxUkrOe3_c) zyu)d@prw=3FstC4W z;hJoBw})xhzv%mU4=3R)VzMqh?ctH;gk;UGb*CM#UZudah6sFQqE*)DwEM+egFEH$T?s1o^E{?0KHnS6ezxfGd~b-H?+wS;gF!_%-&1{J zzE^8&psC1rJpSakHv;9F@ket$vZvOx`I5ECTFl2+)YGKG%VQs{o8pn4)=eE8>97Y$6~z=2j3VVKQTw4I5anHuZV4Mo?^=U zh=)PCc^mnIxxS(~DJ|^{cSl-VNop?NB_Y!$BW{Q?rKG@?iS5kHJUxy5C7x!TWJgx% z4A0d9{(fhM8tR zB3KOvsiXEEjeJPvoX^#8%1&nl(tJou_Ds?nctI}?w_EYVjQnoW&zH>&L${afGk1ZH zG$tA&V$IkllVh=mnjX_Oi&@NXEtq*V`HS0LE3GrH|#56BhUwdm-%2n#GyHVzN z{Ix@ic5`NWRF%5cG*cNI~#xE-UK(liEyiRyBBV%v%1$t=S@gAPX?a$+Qc~=4<#3V z;!&QAukI(R@$GTll>!;JP{yTnR3??9Pgew-K3%a)XOnS1m17psgAo|(=A3l(oLWBO z&>0k*GQ&6^^dRBH{+1m#1vu<$q~@n*<}z05_7dQ6_erJ=A8!?>PSVC7YP(?EXAtdjL+G(oI7et~cx|`Etl0Jx?|ZoJ+~f%F9g8mi86G4b+|Kr9G{wC|mu7 zE4P>JQMF}95<_@uvF`4oX`rDLe-l9n$-5P9RVMC(o7(DOO&=4DdVS3PL^EB@1%8r# z!djW)IOt2Pl{FljSz(c+xL7X}9?PrfBvOWi!+M!;kx9n5xG3#gBgRF=4ub`du(GVW zBCdwV=jO@kcW78EQ$Dnz%lTrRtoqqV85);7Ow9-DWD0XwlVW{r$KlP85z+CS57x&z zJj@9Ep|hwv*2ffT5jb zBN+xQs$2)~d`k$nifc)BHx_o$CrH*?b3C>laoP~z+R`3Hri~(Nc!md78zvBM?8V+lYHK<0S{{cB*q3;!vHZAr74_E(E0hjQ!b* z9d2VYr7>#0ZhlDRKSF1rb@oicEu^~Y=$wFbi?|g;-RTS#+aa^;_C~_JtEA^;NL%S_ zq}jpyHMjyw@|N=6!)H5-OA5)>i774dm+*U)+=59t`M5j2n2w#YJx&eVr(oJ>Pr|&W zdEkD!k3Bc7K!4W$kczY7?k6_g=HN(+;5Y3R9i@Fj_-VdI`=4`wQ-4=^)?lAF>gQ|3 z^SOviWBf2Aa6aEFEGP`Kr`LRFwQnGoBbx zQe>i7mtb5YKaWsCF4<3ZPz{IijN)jri!qG+n(UGuAlZEkJS5)eWLNXns_as(Qg#=i z%*XLZvb*;-vP*IPo9vP-EuwS2^g@N4_mNyePBD54y-j)+dqp+moA5jNESpa7WgZmv zp;BVY>hC;k7t6V07|9@wV@puJ`rFT(wac(x21$mOA};YE3JILcaFMN8x0cp?Xc)(H zB}EW*EDB^_r9CHaMdEnFN%UcAZ`fX_Ti~oPK7Ns70yMPyavj~U#oV^s_}bECRD_g= z6)5{j{PnmkABywR^lTI!aDm?BQOB6%xCpwmSG|xFmlsjraD&`Os5rWQNX{`apQZTG zxXU?KwFzK83mmRymU}_eueG$ukG^wP&w{N4y((1>A8ATTwJ$VLUaj#A1%hQf|67If zpTS>C@Qmg{fq<&hufJ01ED;Q|ys^~`$yIpl$F@v`Yt zlYA_rNcWRo560Szzc=HL<%E3E{II+3{z=L!1oI($=S;%Ma~Ptrzfw||TYv*MI@u(A zIIs5{zlk;xPVO;NoJ0kuwWQqA`1?H95drwYu6A2Fq5ifSafxRg5ZC#cJY4O>AEjwG zH0Tj5Z?x83gFI;cDLnN!8d7xfUPpxCa^e4@?MvX~EQ-FL*&~@H z0kWLok|6{MN5byr1~q#oJ7kYxj~o!0>@k}ivb!_cBiVpx1VL03RKO^xsE8mcQ9&YJ zfCoWQQB)97K*bl~RSAj$ihTcnRrhnuJhMCBr{DZC+3D))>gww1ySs{e@=9Zd3&R42 z`5HPi6%MP?a+E4-6WViO|M3}=on`Wk7j6(m{O{>Hsha-b7UX#=zQ-Z|GtGEGm|wRU zF3Z{XrJiyRnvX&;MVI++Davu1q-A>6qgz9=;BZ4I40Yynz-8XtqrcDOy;#y?yVTs( zYm_h#wDm1oT*BCoHSrrH%)L~N-zZ_uv^9LWggLp>@cT49222fKCt-G&8ou7d_Zs@# z?{d&*V=5(W?9&o2sw?gFW(l)ol);R{(QamZ0kD@mt1Z@MZKyw#+kwlw%=Kl3Y_GaE z1Yn@g>kYf}!EPJ+B51M=g||aCACT(BYd-UIBme;wJN{88p^<#&hefH^$KcFkVpy6X z=-~B|eH(BD@|8WL5q%ZR{HYUn0B%3B7c@=&|Gm8%6jiPzLfJ7^Q0MLhFJHm86%4Vz z`7(Y}R+r$e1N+~ds0-XgMmoJG+k!Cn94Rc=UceTX_Q!7r9A%-UG|_`A5l%P*@_^O< z{*d~E_so3Ps$jf&<=bmJr{X*B&D63V2uQy&kz0#In*B%+)?yFdS3%xORAW`7$%K-PAkd z_F}vMr~P>8&s#)d%*WEXN6HXZ^CR|+HWpe29z&WdBao?mesAC` z@6{2gz3-f8cZ6qdYV(HWCeDo!uC}~3K-eu2&XHwj=0Yof=Ceo2Y%@|l;@#A}5nN$1 zvSD~%1b577*~ABXG=d{4ef%u4`3mr!iO6$3H~dnBdf>tC0#3Aqu;81wuLC}(gmVYg zjr$Oem2f{;!}lXxRpQz~5#9S4VA&ErAy&Q_zOh8APhJjF9@O=Rh?B(IpwS*l_jBMq zDlpU+Z9^FO5}qh^)3Y~Wtd!*m#O*8X<->PZ51ub&pX2E`<@8c1bpY)~Ztp5zzXv>8 zMgVL-4v!^q=Ur2oe9O_^=a$*$e42)^SlN~|?!pVtq`jbQYbuq+RXsESmW}hH6=js| zfV-DOSZ$fSTQm_$ZwBZ!mu(&G#a=AavR}NVj5Z;*39aK1-d8r3N^MOJOpNHbBeGMN z=^&IA-zPj;2AMXPrzfTyCjkCrnY1CkSHWwkC9d8#GM~SnSJlu30n}QYK$#S zZoyGWHjP*CeX?Ogeq>JXvfzLU_dokE@OtWvp zZ+6ch%!4kuFr)KX%!y?Nn&kPZZ!U}Zu)=fhfnZLoaGVzyv$ir<#=JOyPf}bPVot2^ zu5R8qAz1J+FIG6rozbD2czQyg!Zes0=g0YYi`w``-7Bi_!Y=&-0x-|M?JO4#FEG#- z<~Q5I5^$XaM{$<-11%ihw7`069Cx_Z7#*9sZXz$E zOum&CE;~ltJN9htegkz$>v65VMSvGZg@eX_ZGI$EJM9bY+V`8t|6BO-9ZLB8v4MA5 z?8zU`5&Qs|gNC0gYbo?Oiuny}Yb()|x^s=bI+XfRn|u%+Jbu}GQEH2iFuiN^ddLoH zFYBjoTiM~5N}di%Hl1sb&Ho2~CL%nDP3M*0LEhiR_dLjrZE!oqej_iKw~yI#lKX`o#~))?!i?ce zi#-ZH@WMJ&=juO@v`o)=Z+M+?9{nKjSl(XXz22Mqf|>e@(W54zQ-Wy zJc#>1vSxKdz-PU3EN8viGk?~r<%Q?*{7riizW^TbA2ImWCWXbff4wwi&M!@x$4nZg zxA!Wz7e|@?9C3K5#WO7#A0I_HiZ^+;D~UY0{MYv2SPZi-@f+m*1ir8ZDRTT7epBvVf6?4f z*U)SpDcdp4z*@Uoy5iagmpBI230FJlnEkd@e+!yH+p0dAp|(~1@lXipGrLn0z{rPxzfi?TWcz z_bN&HDKPuOe*5l^{Q>KnIzT<-mwL!BPkjG~c_^UE6cz-fGF*e9Y?s!=$IredI z@Bt-X()wRR%g=-5<4=go<>AkUhrgI~Q?%9b(Uh9NkkT`RT$$&7lXk?^$qNW$Uu&5A zt#-ai7~YD~|B!1VjIcR4=YXFZsW*nPZ;P;=&vAVagY5x(4ou!@4|OLuULj}Oe*P-? zF;DKxy4-nHV|e|q-CY{X4)yHx_B#HC{9nZP807DlN4P9GuT))?>##NiSzc)5$2JI^ zX4j}|352TLygKVyaL75X-axC?={!hVLbtA)JBu#Y>G>KU0Z`)a%km5_as2^f~q zIf;&mYFqYYpDeMTV!2bLvmx-xcJc~vxyOSyXHxEG@Y~;K{|jOA8PvH_=T*Qdr+*v# z3-Ml(Jaa#V{+73-b*)BTVe=T{sp$kfl^joE9IJhH z^a!i9Z(z+>{TyJMWiKTK$@Pj}lK(*q<5q={<@3PJI&6i+RJjv(Qelc|>VtK<%j=Vb z?mqzABYu6PX-T~i5Bon@%Xszw5@65hzK<%7p-I`+MsN?zELH6OAmNRKi>)@FewcMW zCW`_xtkS)W{k z35A){Y^SLU;$MnAC)k&RK^Qm(Gjb#R9g%*q8N&V@cMeNLQ32=Yiiq?f!hqL_c>Ozd zKLR0go^%fIsmoUPrx-8vK+2uTOAswd?TnRy9@|d%TA&j$7)o`h6#!u=00EVH^c`Gl zp=R-f1fC_^=#g8`-Xj)9N6s28Ye$UPiYrcX8(}Neo8!*}KRIKzpKkc59l!unkT+!& z1uc%-SC+sRxyxtMhD3E$mAG2bYXD{~V&HW=xg&79S zS#62q!5f<3qtdKVOI`T-_Kvl>&gFX4@^&EdHJ0;`kuv9nJy{-P_-h7#;dkKC*2b~> zAy#}b)|x@a2LdtGxjCRkoeLkQ_;gA(4}^ppLh5B^oZ>zYS~xAFN;_m2{{ApA@L=qV zVJ}w3CFTPSEjbkV+7I4d7tE*azjaPegRN%1dl>Sj!yTT(vE3eGWH1lBq1S;_{U1E> z)6#b(Q0}u`eMltawbE*|v-pej1{kbqvH|PNKz}}w^ z4map^9UHB^DD3~`#o2qm*#C3m*t^o05b0sx&xP}~2VvOzb78U*guL0O@~#_o_w|q| zMdRB>bAu4nfAK6GnV2?wGV)x2?_%U{`y#@y=5X(ca9-hm??4@gpDJ}Lh%#`TX8Su; z(lIUDfLF<)KwePlocey6$$JCvM@>J-c_~H~cm8=IaCm0V`Hr1)5Qcsb@1({>r#a6d z4E9+tYZ8#O#rc56)CMe$|FmB{39y7I8}%MVD_IDb{S0dFL2mQ(o;)uCF6GsW1Z)TM z@SAP)@_-IwP-@goK~H}L=HACsy%iWcZP5?aSAjLiG{W`6OT7`e>=JP5L0NcuD{<~! zK9-64R1Mx(kgYIm$il2&Vne6`q-S|*OnG>p!S464?_+!Bmv!&o?^yzTmV2owH-Fpx zp71@?WIDs!K5X~;Q|kX{Q{SWyZyJfAp1#yz24@`DXC$2n%CHi7*iY06r{lAOp7?*Y z={V6hI=-n7#zFBnxnpd+Kb=AAQ2Cq*9?rto`XF6l${jwp6eY)m0cY+yTkr#<+_^I5 z{F%Dzm+>luDc4$)mwm@%@!0PuaoV#32^%{?Rd&EQIA$54ckRC67qe?oABGdFKNbawh`JPFEBP3`nh97 z04(zJk2fH>pYsT5|H3d|Lu%QmyYM?OG0=;XJ5yf5<`BkHV*^_Y-sF82(vd%o(=CA6 z&)kT=3X9=y#u2SZPgx{DXA-7+vLVS3?#<#g%AIA1M*O3-1b;fnzu{pk%VfRb+ z!zqVl%v;`>YMl~xJmwTtxCfEi>cN%+Z-vY+Js8_!t%GePBf~cWr`Z{B_XpZR2m2kE zUD@q3l{MiT#3p$V&VFRG^gzM;-h*PF#?w#YWqrPvsNa)0zVg^_@A8dFafEl%hm$ll z<>PF?ZY0dNo@Jfym3s(SD)%!&ZR4^1LK#cik;Z=RiMX>IsQ`9a0SGjZx}HE9*6$D! zvYpzwQ20De7SSZdAELwSjLx#I9M%D@K1wYZoz(GG;kd~x_0BduNBq2abxk?V6`0O5 znLqWn%U33he_X@|@@E;kfwKnnwg)tP>s?GGb~I&y_JnMltu3FWxgB@X2O@+{q2{McHft&aIG5HE6MHsVU3GH%>x> zKcsB-Jhre-dHdolKhEsjx+R~b;B%{w&$;qODwqfP90Ja}z~>Uf=LJ*p+0oUhy3ZfN zC;Ke6UA7tQDC4dzHfegqIJmTFf)|uDbf&h!tD4yhCG2#C$we~DZ&qlK4#vrn{JhBT zHsE|1{4N6y<(fg5Z8coyc<&rKMmwWYbYIx$+_*^}u5)~wBMJFK%6r|kZQZK}%7tSx z-gfk5&0YB_@QrsI2;-olKbi6G>mJ3vBMqAr@QOYF9#p$h2EQ6#mrkU z@{gmvk{v!7;=N`b|CHe*aNh5e;dUc~@cjqa9rCu!Y(Qjjh>?Z1KiwZA4Xzp9;^PDF zrV7#^KNkbH1^i@9onB=4317$HT1^`)QE(*HpTY}uVV6nwJ;T?L!h?7=5?wrA!{gR3 z%bO)koi$^-gn9p4!~GIwzop@{g!R5Q>vlxKydSRdV-n_la1BpL7&>SAnhQF^X(EIPYuC+3dg%e=1%w}fERnG<5J*qU;2)cg7$DTgYJDW_(I`tNHDzaafcY! z>3VeuZUZ83&i`YmFZPvAiL<}g$eic0{(S@LFZ>0-`#YW=nsUAqJkG}6+@Kk)DNE^_ zO8}!;YBSbxT%U_^op$@^wS_#g|Gh%w#C$OJlvuVzBW%F%IOB+S8F}A) zuUC{Ac`K`~?AZq1YxukXd{UP$Lzw;A(Z)BEt~I?mmCmzp9%i>V4Nrt)ZH1vsjX;uj z!sa@1*VKzJGG<)Nl--L|88B`E>?-t6^ugp059)(7G3VgiZ)A%`N`J*O+7()_mS+@80SAK0;W_q#}+X|po!1Z_l&$ZXA5CsR}(8ai$|J!?K>>Ymt@fN$>Say zH!zwRh7UE{rr7THK@yb7Rrvi7+n3?L3N#-z^0oO8_Di0>;t&N^l;!Fw(-Que%_HY6 z{;!<$mJw{vuylSpkL$QkFuZu^+>3O6?R(?E@NZ0doZbtcggs&NlIIYff2${HBgCg8 z#C?iugWhz%zMRl~_LI=YuBOn<=NTt(il~D(RMb6bM9;wX_I{*cKe-d_Eqw0KjgF@= z1xq8iOV7c^7X}TsQM>nM@1=0PSO-4*U;o{hYmq0@U5CHYw&5EBeT3}ovEKb(f4bc! z-G@y&t~a>n=*S&A9?B%UVAMnQE+Zby9EAF9g>cti@J*a&zo^tp$GuUU3hLRU`YDz) z0%r={?{sN(!d^xojruB23N z(aU=D2H?{6**;7*to%9l5YBeRKA!dAm*d9}NBMsoe<^>CSw1`LcZJ3}$iEDJ`1>ZMi-P z9G2^5l*`@|WVzVS+42wvA?GIiWqCf0zbp^W%)Ii@do)c(C*z5R4X(WyEteZt*U->} z*Xzo=mdlNk0dHkA`E_CE$7nz6DDIkeeU`EJk55Ph36mR zDwG30002{81svDE0AB4Urdm5CZT^-TFtHebY-@}aC)&tF2A z_+K{oR^N$FUFVl&;n$OExpSvU_Z5@Q+JLg{gSdK+xWw6OaKCDBy}OcZ=bc@hd2NHR z+`H9;u}$zjqo+4t15HCk25HfJAHeGV*MUd*JOza-a1Q|5mxMt`j*8gWaFxIXffVln zlpn(R8uz{Z`_v$h`|mpEqYQ9!!`+*wtnoGxVXxl5g#_^BIMO#X(Vyy^=vD7bI=qAEOZ@K{{P3|%T8i!?xiXWW$ZMXFiRzo8aW0@Tk^59KMwXy_4@kaRLhd=BJ_^!h zxxNp4mg{j-u6>42d;Vg}^&sHEvXwbM1dL_-kx4T}zraNtHywQP7~kUu@fYx{gWHm39!LBt z12fnz4=XGk-+GDblUfV+&52lsW=EWeN_x`8J5ure#rk8JHo#^;W(U{6o~~2Qo8_E9 z=Zl5aQyTzqwFdt+xD7P{W$S&3xZn7IQNJt>+dj$xx_6W_nAAI&Pl?Avl&};|DG_KgRy0?c!VYS zjL4in2jDz(HoUuV*Y0Gw?EjN4r*t}>LiI{HehJTW|@x7xR)Kyyun$GGx!Z z3BM2LW#Z$u7k4gvdxhV|+8JAz+u_O1T{C@$Ftgnc3m`a}^5}dQ`_@EG_9BmDY5*%H z_r3=6`5yYTaXd`Ly;3Y?gZ_u_r~RCad1Rgx58pDbL98WDvNFtPpZKhvUKglWPaz%G zSqEUw6MpVY9omu_Nx^Hb(J$%5^TE)r7xup{FjnzCFcFQ-6Wj%69>}WX_db53!f)|; zkng7r->(NT+BDF<33umsOC%}RKj`SioWWUmTRVZoEu{|=!A0k_28L<@_s^yO2lSlX6L`3(ERXMMbiDZT)&gm}C@M_y6iw`08Dp35s&gK*oUH*);_J@U43wETuE zrtFs}N0(Hq$0`2Gy|o?;HQ zb&yXt+&Pp4MK6P6+uCMXd6}i7EsL(bOk782oxRtlW%S?{U+cxd8#`Se0Xl{mcvC}T zXPxR{xy-UHys>8K((09@#kn}TE~(4?RvudigG;!i0<1hId6?(;jQsbL9p$WdgF^@6E$tb%3SH?w}qFHzbV0R&v>6a^fOx&TL%T= zwS`wqInF~l?3#`9-IoC8m+^LdWIN;gseb{+@$pssWjT4qNnO_!6bxf^bu=X7Yj6`D zx3EncQN1#8?TM~J2xs z*#19{`OsSfyyI3V+o`!L%rYt82Hw@N(UwQsgMsrhXGgnhvsHOEak!jk(`cJ8a9=-Q z=X53DOX>{|JuqVU`T+%4{!0!27eM5)c0|KD5z@Z`XB-T3UchiI){=`bchS1xStaLS zQaCe@wJ@y^YxlgwvGB&G&W4V7y_wgRx^Q?|XzzCCyJarivwv3Z!e9z`qw4ew4+iV3 z+CR>8VO>pi9rP)oxKS65`6*0o!uBs7o_9!}TH(eaznr)O+&K8}Z0~UOZKtrn%`y1l^I|Cl*Pk^>`0|pmAqYZ2^lic+ zhK^ltABwPl4a&P|I4hGoWX!7svN}v~h{wJ)NVrg5>_ZPnI?C*6$c*x^dHc)EatHgL zQfDsG5&tOsRr#s^V)Dj0yeFR$=NN-~ticUGLlmCTU3lCg;L7B6CN1;iI@h0P3~@pJ zN}Ll+p7U&;hvisE)vZN$zdL0 zOdq3fR3E(s*bBl`)16Nfr%KO-%&OeWdxh9@^wN{PTCTZ$HizZ`)+lEuGOLoc0AbC_ zivYU9P2mtZk}KMA41%2+>7LWV|(uO5x{PA1}3rHA`36lxDl{h z@Lq??VCmir*d8aHp;tZsoxjfkz8C97Y!t&dldcz8&-aM@0m`w#bqDbG;amzQp-cni z@O0oI#{=7B&YqXecgq;o?&@$?6=LA&-2h1f|5|LQM1M+&o61+25bV| z4H^#ZUv1|BA}$*66``TUxTwU9XKW1lC47#XhW1xgF82ctTU^+V#R?U#mx(Lw#)BD_ zR3<+L{sN7YdbV{T?Z^kuEyoJj-qI?zQuJh88__y6g%q7ZHh2qa>^PaS5!NDhzl_Z% zHcfv!iuCmL!4;!T#j-F>S7Z>knRX^qJ5#-QaWp30UUSlJfZZ_hEeI_XH?b~~@<}?I z_+}LT4&-5~kEhLq52XiS2@y|oP%q}5Dbw^v#Lr9b(AMC&|6qhGMh`~ZY-A|2BRQ5$ zrTSq&Zx|Ocy}ZYLam>b+n{9nk-m>zFoF?|i;k_!>*Sw;YA9n@HEZ%n~z&2IMWDUMdk35_*gs?cY9pkceh$WO6uV~9RSE0_z;2Pd-X4tU2TR2tkmwl0*;2*_VUw^4 zhRa^C_@??vyj`VZnF$)T&w*cI;cgO@7t>tr#<^JtZ;abrs`qn})^wZEA;#TU3I!0e zcOI=?p#X8z6xG*3;p?&dVNPkc1 zFwVy_?)~`~@V-;ZX~>QqT(c8?9|zvPQqFdjABL|sw!H{tp1%WZL%H1>@o)ilHkac% z4K|ACn>n{#^q1=p>bDikGnc_~V?)*-ZDhoDo`vnN^mbUX(M?2Gu9IRjtfs1}XDAJ~ zRPGqXa_uU|duME)lV8f?igM~@unlmJ;B?4fiCjVH}F*A3wR~-z{nSurr`C z;+S@W!qBII&EYi6>EcG7jIfIHZ=}1ioPM3K)|J6S;Vj=Rez@t#$Tu0^Q_k@pJ?p5k z+XmPj0t?E0FYKS~kaExjo%gOB**agBI52~5EHk>(AZY%KzenD74y>+b4k(C#DYT@&Ry%N^)d(0=8dRPhT1ZlmKpLEhYTX=-xM+pxi{!?Vw+Boeos$!1M^#(qxfK&xnL(y;J7^UBPSVrC<3KxB zF(8HmR6Mtad2ZEGb%SYID#kEn zw!@PLZ>{LdWVWVp4@<0SyLq%#$Q50ec020=ra*ZM7OntYJ13-_s8Anp!_aZ1;?X~+ z0{5Jxt;@*l((9-gpP(uDFc;_2B8TMSs;GH|t zNou@(s6o4m84|O4OPtLW((j2OR$7Y9;4<2%*dEa~Mx34sb2q@~jX!;_=Ao0M96jvQ zICRoH+R;c`ul*HVV?agalAR~B6xyVi2=d8epaT74FRTOmWV@vTwnKg4LFfZ(SZ~gG zb(XepsHFd%-~|=Pdkpvd@RG#xw6%hLAPpG9M39g6P=($H?DP3_7)E;$yQ->cu8xct zndA96^ugmJqi{^ng77T#8}miic0h6%+57U|R>9?#XB!iyTwQ)gE5wFw+U^CguEr{M zq=)+ZdPe(E-RjlH#s;yM z0Rz*#p9FN{tiqjVXf%5joDcF$;v3jkn~yQaey*tKp7O3I_tQ=SKKIjFF@}Yo z4>ia*5y#a<-RW|JwcP&;f6Jh0eE5RPy|4wyk9%Ru%=!2!!f)aGDm<9KTXhOws= zuwxQ)#st82&3N4H4)~a07FFg>lU=(JZ-s@8>l~c0S|>O+BMf&@WR2^uhXm{mriXMU zX8V(KurJXEQ(b<%4%mL&j`a}7T0gu~_Qzz{l6u$uEwOQpiJ>=U#=txFxX_)ZCz+n| zMs<~(Dst1B-t2_SyW_uQlSSEg->jd8yidp1zFD_*%5#K8fOEcxP0IZrGv{k(2(L=S zFMlV>wT^dxhx5;96gI6bs;|Awj*ep9z`@KLI}U_x;T?7YV{j=)*fU1o24nRG#_Z<; zcM=x|c(F}q!fIE7Z;PsgKOo@~i>fRO={ws@HSk&fvw%;XJ{iBM)8TKexQ`?)fj``K zu*9SZZ*x6E<73BfTU#|A*s|6`Y1X3;Tr>@wBO_i zOnqj2Z*Ymb0dOXLoTAV7klatv!f)56Z2ZX3CDuk9<7ji?e&-O!Fw@ zS18RhzBrp^C5Szb{ulLz!B5M1CSb9Mfyts!>zZ}A%Y}RMns-F<*G88`ur@McH1d^2 z67~IcXtQUr5ax45#HzToGaE4aKI4ct0GDIjZk!o~x0mkGp-wSJ!}ekWZd;>GKeq2T zA#aqR#OAAi&vbQzBFo}&0}(05kUC7#=%ZDE_r+uP(? zb1udiS#RN~Eb-WOV@_JFL76^}edz*+j%c+`DErg-_BX_DM3tMj_vVZD)>ioLLs55F z{tC#x&L{gldUjV-`Pp~Yo4PnHqJ3vA!jx_JJc522u;C`vYJNkK_O2A)(cyH{?H^)} z-d`gvR8q-mAD;`vA4one^0dbA^cUy{`^P4PDbq>xhvEHme|ih9p-F3FZF@nfXKQOH zCiR>i$xe)8skIeTZLJH^j^fPCh4Ur0iKB0WIr{Dh3NaqI$BQ@gn9pfjqRzxH53;^D z$S3avtPPaeV@yQo1%*$Ry~ULM4XBUs@k@3VSxWwpbR$NO=TZEQw=c_ZnUhW9xX9hV zB`oUnY{z6t>ZuB0zLB*4=@~vy{pqkUF3v#?_9n*h?h0}tUnp)#yRU3`w?IG50lrwC zgelJ>sLSxWlcov#PjE8fwp0m9*}~Icvx2)cZiV~8NX0ooC-S8p^KJ;+q_%OkWp93S zBiaQ8i*3ZQEGvaIf9eGutidnYSI?dE$JI6~@j8(@}<;^HQedpL3dS zpRA0X>Vjpa+}0VnRh1O#BRMBkZ$A{98$$UnaPN!2o+Iwz$X+0CLGy7G`VGAkW8&&M zH@4xX9Ij@_y^IptfMgonhiQY`dz*}D#6BeB8rwSIlL2-znM&!E*>wK68hc;N&}^j^^25Vdg~-EFuMv)-1i!ooWfO-+q3 zz-{bm9bn3&p;-2Xe*)a&1+J*aNx+N9^WKUd~bs$)#Ez)69o+HEd{K5YWbeyRjFTo~+^=Vfu%D17|I5<8nt^#R|1sn|Kr`Xxaa1P$FJpDDv<6nu7|ocZ$|_;&6YPIJb#Q+6Qm@)xHlZr4~i8kwLk zH|u`N6B@yt8V+h%c#v}C44;vhxOn#Xh>QMS&au5sO&v=ar}aw`9xUd_wGDZ8ZTn-| zt+GB#nXXD~JbU@_jSAQ4{=FLF)#ABf;Sm+)`7&^ zpmuCzm)i2iad9*16VK)J@xG}8!ut)rf40j!8j;DMojV)eSeC4Xak^~i#DR;o8s?vR zrGx2tmiWBDJbMAm?{7{9dyu1}BNvDwO8(x zh$BDIW7=AOUSPNo;;->Ece;CWF%%D7j{gX^q+^PU9t%$~*j&P`s!{gu@AbY@~~2oP@D1{Eh8;b9UCqyUCn-`T;Uu`GPxFMiYce*bcM$KTL4ciHvL3t*jV;|b_H=Z0#30-9@=fG8;E8%I#C4QFm@Ol{w^y)V0U%ckB5$OkHu z8ry`Cd1%wvXx}FMUAR2CqB>c%aLLk@{ng8RR`%B{62B#zhSI&8ENx@|ISU@P;d?x2 zbDeB$`CbCKvVUhhPBCR-Dq-|t(VTfV=JP${Y+a_^b9|aBHa?{XlYT_*U~mql%V~j) zfj0Joai2)rIB}XW$Dpl1c0kk#u9e4y2lBx=h+hT5b%MGzfix`F8Aubprb*x=$UQ}{ z0nw>&U8IENaiY8JAAlg`A|o@-Ik0~S-=CQQNnw12#J~^s5%I26NVvYmcKXU^-nP3) zRQlX}SiTF9hVNZIL8FOfcD=$jkl4WINV--r;rhD9WL;w;EQWL@`9RF*tF{H;GkzVG zIe5UszL9D5y$j+RTG~6Yz#&ZA0bpx7JL?j0foVH%VcZ6QqdRSX+8%syaG!`R1m+@n zXxl)1yb)&8HIJyg{BdE)#`x;hcp@VB6*jJ=9nLD6@pf4@93<|5KpY?Q;o+kx%d9|L zcc-N{+rr!0lYGu-@ej0cJU3Zq1!rV-P%w_EB>#g0aI;xr(%}7s){D@?dmXxHH@sDP zafz0VHZ!RuEIPZAo!yBaMXATeIvJzmarlSdd&Fbon9rGiCIC$qpKOF%yk=c7 zI8+6Ma5fr`mCZaGXZD@=ZWi-F*;9B6`UYy8tTuv{Ph1ek6!s$*n||a6C77$3wZHaX zyb~3)ZB{1x-YyB5ClD9@;eZ=lC$LMSjs79IV6Oc;VROye(|>=L@EF#LVlPu8WPF$h z_yS#bbAqRv)X;5?LyS9J^7Wz!=ek1tdzq!Le;vgA1F<`1-ig}rtk&6)nHa(?7IW-J zIC*N;^=qm_ z@qB5o#+i*Zg>#*IkIhFf$4XsHg6VxSzUV$Z>-JG6i)*2{!er!Dg|v^${vgVLJspmX z*hDIM8w+ecPdauul=0ODpfb7#wF|hMw{62FR`}a`8L`HPcq@qaXoDkW5Duz8b@!*K zwRo&qj}8(WXu9jB?L_BtzPNTc0Y=dFqdJ!P;@7lw^QE~rmigk4(5BNd%@@~RkNyD9 z5|?PduH&08ehnskT^gt3n=dZW-cr|ru<1v1eDlSxZ*N)6XwyIISm%rHL?=qm!zR6s zcmDV$2na86>)JXwC|Ei=_WAJYHn8Z@XX)7Ii)*cKYGkb8LB~LUd{Za(G~3o19&{}9 z#n)qcji61h-ZXOj>3R2}xQBpwFxF_=*L_{)!0ab9%su^>v{_!MLr-VkR1hxx(ue_?c1oYd zcw-k>oAVuH7y2aYdzbynyDYxyyXg4%QvH}sF|Koo_w3Ui3i^suKj#_-hYiRPpl6^%f|M1 zt;weolqut@5%$ZNZLJD%lyNDucS@Yyz?o-c{9*i-dgCo&i($eIViW+0~WbC_Y?gg?<+cL3l=gG zfA5wgJ<4J;%9f4z;WWye&mf)U;}$;+Y*q;o$kp1a(V1tmef8=tE<zCLN6cTx^`)}=upq9ro%mtewq9Zeo zxD9!K4&T!tMJpr9_6^Vh%K1>pi*-dj-m3Tl{#rTTj^C6sYy?@tz}5Hcq`~xlz562Y zt=@eJzmckM5PE0*{#bnerA3lEe0kl8-=ar&E(Qk!GS9O*!Myloy)r*dU+UcD%Wtpd zH_|tpb@}(v#My@W*znV|G9XRqf}m$#^U?ge(j2F4ODhu}&7L6)JCyUYQM+%^+0}uq zxMV{UCN*}x=Yu6-2!6vxnahn%!!A&CMqk9)NU3>f5xZZ6jchd;$Y`bqb z!-Zom)81+qb3$jPjWec?m`hiC0}O>|KCn5jWoc|$7l-jU=3QZ7O>GVBvazVR2Us}F z5G7#|73MeGIo+&4Tno%(wAIl7QL?K&DLWXZT(f<6{yE`+7QVL0wQq8e4`!qzWjZ(j z*R2!sJtrS-k}3a{{&?TM(jmEUlZrGCb>lkflPyi_FxeFz4zqBz3gh}jJKVxm1qAm9 z57y)_$B`CJ6C#)-uW3@+a|7@u>?dId$jI*~e;oQ63qRV0cfxj5U7`*fJ>>tGe0V@6 z#|GowavYZr52SmYKRyx1DxfjZUEdPNLddPZ2iSw816n}iYv$MOYLwX(7?Wy5$Cb{bTX?~ohHaMx&Hh#K=lULt8 zsD&0TTaq+hqjVNoxHZ#b%6x`}i@v+WL|#>aIG3QrRol3>c5Nw!UX6v*{13MDutSFZ zzqq?Mx;Pl$g`K?CWOqm0wu2>scyH-Rc`dbZaI*m+#n;t!H6?xex-1Yc+APsbyWAfq zyNIgpL`b$aF17iummpQdfG-7S>sZhDvFi3&qp8xQ*leK*}A*54O(F_Q%EHQ?+AtowdWd)*si>4nLW& zGj8^3TEgO%X??ZYIQAJ$I40~ymS&Hn&Bk#r_1q?&QgpP&G2WWJ;&vO~(4N>xlc}rY zO)ZV8TL~Liw;tt)uUTh!Img0%_X0c2y!Km|AN5aUG0o$98QBSOgP7UM9>_hw;X3oz zI2-ls?$@`p*Xt~abpwxzHXP`qN)*nPD1Aez8#ZXBZzxkZCF1J|wSLOO;(YowL*pCj zXj0$Q=}bS&hZ|M6NaFRF-}8<-=c4zi9B2%{l>!4+2H!R^cmw9zr@|kJmKjGL@PM`k zM(|te)^sN0I1FmBbHkjt#WnSD^k~NToX7(EeYxo|s?~SE-LL2|_T+-`n9kv}i9LGY zYyoFFK|C`(!ywfG9f8)W?8|m>#-4+VZnR--V^e+i8rL5z@vt5W(iHw-;0-etTF+zo ziPK>Z>u`vDHbXUvDu0uVn)`s#_bO%3sCRk!Oohx zL;yqU!p=!)?!UDThlTaF4ZkL7<1Mi8*4*BR7T$mZs#YBD2p)^wiHnoUcZ7c4P@&AN zHQt=mG#%^ej9!)G#5Xm2anYQ(deCh^v%m?P)Hh{s%a9a#24p2=ODnp3Fs3gC^5JzF!S)EOdIZ(oVfjWLJs#;XNvT8~7qN+_3!?=AgGQw51^l{$IK@1qS&tYt8J_}YU;nlnF^OWQ;&)D z`go&Rzm!dh-`LrZNOskk^ZS`o;$puh-l&~0piF-ycO3J2D3 zWP&D%My=_hQ}L9a4s-F&c5Iblg{kQeo+`axp5M1{9+TY=XCyfnab=Rfc))T=BJRAyJw!l2G>IFRr=Ey zIfZ(^ErjdU#lxV_GqJq^`?d*KNE+?N)_Ve{LcI8C#yl6^mKnEEIv7Nv;^!=v9HF21s5kUVV9Y0fk@k~ ze_?d&>Nh&hxu*Yvb;@=wDBJ6slASHM6%tSI_EOT$ts{lv&0N1EC!XsO|Gx60$dgtf z@VppjWIF%0LCe=Kfy4QCdx@SwSib>0kGKw-o;;7>?=Sm)&qEpux3*r1bCeJM6(7F! z2SuD?eK@mxzrW|hw|=;YZ|yYmxAmRF-`1BAe_Q`0{B3x2Kr_nYSy7H5u+&qsVXbA7-6ZGOY9teinid4F+o*^-5rA#f(KkjHxIzJ;TyA?Ssh z7D}~t%_hv7Tf5s3TGz0tE0Y--+tiAM>89!>i>u#Sy=ZZD z^`_qR$fjo8f=3pc`0X27l$yl-S|9EI>|Q0#ad?8GCt-{FI6v$4_%2L4yv%Y{v!S(T zYf5HW4Dv)_5pJlszq9?lI3tLtY!)`wcgI_}xyyIn4q6YZGlQItj8A;<^5iR{dYQA;T%xqVhi!snK$T%&J0#8jyK0~44CR?yUJ<4UcueO>!BGVnW4;< z3{*)dn_AO-qnWYHz<6w3dTgR+DAqYX(VxzkZX`2249i2~ zJM;Px^damuPCT-Czqg@BdFGM)^aj2UlF|XWVkj>I(~o)f+k+*KS&}XoY1H zORpkmO|yFI8y)|TiO409{{NT^ii0uzXs7H5%zvF%Fb@3_-+$rzD!%{5_hZn7*YG#2 zeu5I5y3`ns{tLzK%VsU1u7=pc4Llbu1@C_chyTF$C467T7p~nXN%#-*)@jk568F?~&`C{@gzvt@!KN@A%8b1HXFP?Du`-k~>ei>+{e3Hl6tUQ^$4w z;y2$tcJJIrzIgGwkKggnMT>8E{LRlS|KD3aF!b7;uS7rgXl?c3KR9V}`J>4>$1I-z zy*K}4<*CQaerf-{=RPua&Zr&xBbEEA00aPjvFh=Q*#e`=oj0Lf9qFXIq_dZm9eM)P_^wnJGafRJ#_nDZv0fw zo!{&~?~fzTFZ}*L|M}P{pSfo2!2=%u(p`6MoH+RQ$yu`fX$XIP2Dj`@eJp z$|;}PKHT$Pl5iCz~K8wWW_WVwQnX)u8TMxf|c#CMfVgB$4LD*jbPV;Q6Tk&iA4S%^wY5VD5 zbqkzZFrT>&zxXM2sC|Aq43|dc;(zA4_2GHv<I678pC26X=+pUhn7TCbd;Cw%_^HUFGYint$RQLr zK06Qm>Y98y5FT)@LBYuxKeO`azzYL#lAuGJ;`lKIc=?XyJhYInfs=_^H zf2x}0)p#xHhb&!*RCoAOEkh#b?f?XdoNospV8?kd09g#k&jXMpfcz!^SqjMi1R%=* zc|HJPDGo;ScT2IHsdoDzE10Sqjm*VaNe({~fDq?pKcu<}BKrzD1UFU9G8BFenj0Y^ z)#@r_|6@N+bv26mryvBRV`z3Ro$4BhtT_ll;olsDfbwMl$YS6;7l14Q<&UDPaVgg< zL#hP<4q5SE@#9o4K`DL{fGh>&+31d3I@PSyh9CraZ45xDV_ynFAo`~QkQJbFfYBe( z%<2^o{VV8W+`MX5unI+@MtfO-@_`tk&xoXYZ~}Q9f>3cm!X$UD!~clbr@p3yngfSwo|=SypYY0 z;5ds$J!u>cXldjeiABA?ss5dg>5CyzlZrScfmBCGDl4@o?s#T_m+AtOia5bkM@lNz zBR?zNRd%YXMPae}Gl0#X`*ipuBcSJNN#QhmatB2F+BPF{>Om@Ibi<(GJ=zF|@k zCzy)T#2bIKfoM08$!3cOjp(KRy*jH^|Pv%@5+}&ts`}<^wu9 zN9rPgHC`Ht9c!xC;9zdkH@J0d8JZpjQV?K=1rXApcUV zfOGD(24V7i6_4xta&A>B7OzvgH)!)g@bZX-E1d6yT(}jxDCR0{NJ?reEr6#?Qe)a( zFmo>#_vPHIb;C5pf}6H(*xs6T0g{2-1Exnx*erzceO%|H0eS;9SBUkh_uOP8-AzZ`napmzgse!pMwI9&;&_YnBo{Q{l~{Y~*$k74w7 zK`>7OXY(tHN4*H6w-@l6{sp%HuPWXQ{0XD?B=ZH%B(^U2p3?ee97Rs?IWkW4}#41fb)S_O7E}&^x6PFcXq_N1z&#n ze;9xLi1-q4jyOp1umT9>?*zavG&uMvpD=n)BIbJFU39S0DQxTj z>CnG79u;xYW*X?W-yFQ}AiIsnMV#Y~*L+>Q&%v7uf!zw6drwllDwIR?B?s>w@b`(6 z;U@D`#pCon3~x61gI(JABE_3u0Pk_+`^7UN&U=^TP$97oIQ<-=jvY$y>}q`u%?K!d$r=RzY1&T?+1JZ z_Jtn6m!CrN8$x;i2RNN)D_$Y_#X#ejwTeS}{DjGm&Fn1Tt!0D4r%*q1G6u}+fpcF% z@#Ynvw+H%iL`TH=-Uh{M23}ZsM*+X?yoeLsqy-2-}m2hPph z55%B=`n?78?gvh0tKuCE+%Wll3DILiXm2BmS7@9*7J~gKaK1XGcq1Ly9yDc;$ZUJhOt=zZ)GIQ(VUJsyEfvy-Rw~nqSp*TobVxxA0JVAZvULaUk3U7N8C|8ex= zzfrt{!DAS`F3>ybiHI}&Tg5BXK6vPM!tXF1;mZ&I52HstSOJ{Fey?~CXK4Gl5%2_X zo;P@f+V3RlZQj!n=Oh24^a_oGA4YWVGZE*Xe^k6e{mZc&&!3Grcl}xM<`v+N<(>6> z#F>jPKm5N?dFKJ=-v+Nxd2d7dGxtZFr}5>7cwzLOM|n?pA>vfNsCb3Sn?(9w0%yhF z6%WZm=`BHY3vhP*L-7iYA5S6rA>e%RWyNDV595y}qu=`q)+w(k-Wz}y*8j}{Lw|~t zI4_lwGaPH-8%D1T^xjui;(VY&@d}O8pGNxoKy=G&#Ve#QRHqLE=i-ADk9rWs-%Sw2 zaR-+;_a3Qu=M>;C3q^SD=o06=1&Vih0ebC#e`sNe^9OwSDbydl1^ksQDsgt5p?HP* zzb@dt1e}&?4=+r9Hz1?$0B7@3#Ve#QSEC#YmX$br8x-&3;4zHeJ`nhGyu|s+`HJ^h z;DyQW^MIe5Dsg5GC|;rZxCiA}37nU=C|;rdZziHI8!U0IH0Liove=0sdH@=ff8L?fCM;|HJ6r1pdAaoGqh@S4dwt4$K@YaaQ8XPoerP1HJXYId5F? z3bnUq5PchPKDa~iIPQn>cRB=n8#=*9E>=9Zz4;Cj$q(!Oj9rSuFh8=d=Q}zijQZ99 zymo`jatK}yJ>m@;9Q>3|A$mK3ciA-bI8J@4NP1rb-u*?;d%8$^uL7^)?JAo>t{h{lIy68hUJp`wh-? z{Jjjk@=J5%l2cyNJJH}wNAEP?EuV%S>!Z6!dMV&-n}#0ygR6?9_bK4rJ`Fwg2R|&5 z-YzT)Z6lk-zhRvo#klgxfh0sd^XKOBAj=sb|?_CB5Kjl+M zUv357ozu{xzC2tcyy6?=Eo;#Frnp93k{h1I}5wcp>yQ0wEL&T~c3dl5L1_e@=0(mUSZ;HP{F^#_ZAw`v-C ztdBPrNpBcHQpdPZdG$wIb=wyb|*WeEBJ)f8?*) z;0PlAD^wpVf!9<7y}lypZ3W(rY3T8s;9B5()!VGDw5vEfp^<9^eDdvfb;8IypaCtpTL>< zzNzI${!RkU(pXK85u8THt+R8hY#xzEvc>9{}%>Y3Na( zUj)ukSE*d4(&rO_bB4hyq<`eE)!;~B@n50xZUkOx8hWhXOM&yDT)dF_xDz<{=Hlhl z2kAWloWJJch0v?Ky2LpSUw#Uem-=!RaMtGHh0sd_XCfCbhdd zr=iF4K4)<7Q$B_2<2B&TdjHhrmH9Yu>I~jg{H+Df`f2EKKXL*%@6W{xk>BmW`C2Ys zj{I03zXZ-7bMZpx&HMnyBYgRps(!11Q)lp|EH7}@PeYIGW5VD_#`v#LeY_ob@12Go z%X?dq^u7kX`=_DD`h6NWujb-~$nTgBV!s4mex{ON6L7k7@j~d00q1SGcscdU`N2mG zj%1Ag3d!%&!24nm^nP3@}x?|gLeXAzL|$tn}-(z-V;UOQ4d}#0*~(tj@hj;!B6?r z&dJYrIbsq;;GGP-cNT$nI`FKfj%aHz!XIIL>@04==yoaLvPcFb^;Podf&3hl;@Cz1fG0z~iI5$MW#<`CAOU zzZQXaDDYnYk?HG~`m(YJJl?AuECP@7-AjtVKcBi_kH;8CAX&%?{-kN1(56p2??1RnEkD-v&A z5qOl``FVKxa$)^$E&`AIZOOySmkaMHWs1P#{OYnI@Te~zE&`AI-CZQ!eMRDZzX&`& zp#5nPcx=CaDFTmrdgu+gdY@l!eBU!S4==wy<^k`-BJfy_rXuioAF;OxJeGI72)q@* z+g$`6=YJ0sfyZ(@UIbnYcrO=$$A0LjkLK1#zMMJ!E-wO)@@pvqkL5VO2t1B&7ZrgQ z1Ku@7;4J~(9Yx?#F3%K!$MJ2($EKGbUdB7IBJtuy;88B4Mc|RY_Y{FgxqP|^JU-0- zWf6EW;Qg%#JkApj`}p+oI}v!bMc^$2USAP->|d@f0*~|4>x;zuauIk(g5D2`z+*f5 zZ4r2+_qQVO765P7jnm7S#|F0*`X}Q4x4tH~w!CcvZkV;SFXeYmk$4-6z~j27Cl4=QUrq&H zDi1GTUpPOwDi1H89@iP=BJim9_vYc{=galSzC67Ad|AJb6oJQlU(CbH z&zI}Bf92uj=ga=;j89Il2QlESDFW|!;B6@akM(wW9$tPqINyCw9$tPqD8J7YfyZ^| z_lv;eKF!NT;E}(>KQ+DlIImk)1Rnd{ks|Q8uDGrUJkFawR|Fp0`2$7ZQO-Xp0#D}m zMc{FMaOh3b%a8i9C=V}RUpUWMoQIdMFEQY?6oJQlhw||9^Q9ha%frjhm-YLBBJfTF z-rYsuu|Ie^4-fq5yU#8}%je27@pd{FkM>Y}#*c{j3>NZ}PjJ`C_c;J_(OB#ZW8594 zm(QF>`^&9e^Mb(kmPYX*GcU$&em}k+#W(3hDoJcgOUe0Wb!ioQDhtstyR)coQKt6- z=S(`R+>G@Q9Pb_PT)Gn)W&V1Ga2Ir(5^K+nr-#!Q!XHtr0Y*9D*<+M^kdI5HS93?J)*c+@bnk~Yc@bec9K;;}Ws}fL1tN@m6^2gHwu* zF1nUTbV-WeVT>+yI-0~INJAIg6ds5amkA57(B0(*BaS$Mw6U~=4+nK80r^A}r!?Go zigkQK@ehNh`fG(1|Mr%3Nw`@Tmz6B@KSfy+32_4lr$ov6_Qs7O4aOjEFGk!#*)(uE z;KjhYcoU3?9awoi4=&^*3N_d>(hs$x9V=M=oGN+@);ecaJ|fBKIulMh6Cx&pA`U_8 z>*8HCuy1G)O9U!z+AOG4Ky=UMVwDMq-qu`Dxh8CA=yE|b6sx}TTo*J`LGT;~>n_S# zR6q?44KAcYk=8f5$qo=m=SH|@q+XEySps5LvAVSjUSSnFTcGE3!!sGYv?}aCfzcg2 zJuU>}4pPEha69D29bwWPEOB&WrfDq0a|GT1_AI1QAgyaXh7VClV^^zNhC>A;-al;) zhY5%tCzApA;Q|+q1MnjRj#}(cd|N|DDx5BmEa|x(32}{N;YWES1a3(jZSWysi+YSl z0xIrR>#+it=3`SIryy|b7WZ`us_R_mf{quEIM}oaV*+AHU91xX#6r5Dc>;oWvM%Q+ zRL*<-A_}C$ERQ zyB4?s6eS~A8#usmxUiA-ODH-!_zM8EwXUn78MNT+RLQ7w7R10tds|C;opcB`5B1Js z@@RAOP^T;acdm^mT!z#Y3!w0521!usnYDUgkqpo|uwl33C1P7#C1W z4Q`+Sxw!fMjaHgufimPK%Xd{o7e{p_>3`tmh)twjx^7lr6P<*!P6<*qgJUH)&Ve^C zumDYT=9^emD0-{t##{bSw$f1Y883XizFd&zk^k zMSp5NIKeMQ9OHA$ARS!`ABz3M-Wzz0JT@>G8gJt7e!W zpe`W8d4|Y*gH#U&ZGT7%x(>5Ary88PdYSbl>o>YS?J)IG8C4k^xcO^Cx0+N(z%mk0 zgey!m+^?)NQnK~D%0yA*9PN@#8ycFL8ljt(cCDoi=IP$ksIINy1{2-V4*$jQ@gkbf zsVg&H?Pe^^qcPsOHo3YRjo&uJwjctz@Xdg&th)@B$Ql}w%fki}-ynVt4TGF8)`ABe ziqu_ib5~cQ6AO)*l{dTnJ}QO9f~!p#qZpw{OoZ{3Cq2vi5UJxJSP_@J)?*oSW2_E` zHWq|sNMwu>wK4EICaQG0^v~?R{QkYv&l&58@r8YsSq$yZ@+c&$r4J&F!hXvvjl!PG zs0pM|z;_uN&4q5!rKLb-jmh}x*7iosBjCM@je;mD13wBpVp=55Th2f>A@0K{-5NyY zd*h-SMp4W3%?U^6^bCq|9IjkB8{xEqk?5*Sq%2_$a<*PV2GB zv9Y0K-}q#bmUw%6`nDoiVvj=X z6(C4yZAp!!MtdNAks5}UXl0UxgWTaKx-Zk8!fY>Ed6p$6TQeRh3gZok8=e>%Pxog= zQptgdkv^<;qm?L{(>noU#RFKcL@PfDmFZ0NHOnGW>hq13=HS@)7;G;0dt_PNZ?e&o z18|2rGLZ42DUldvrQ{OIFu7CsWG-`%DV~kOy zR5CR}sfY?1J^Kq-fzj{O*ti&ZrxZIZcWeVa{r#gbViB#p7f{N!TgV@PQ0qBeTmwZb z8!V?|snk}FQ7RlaFhX6aiUv0_A$G1rLB?r1`(UKuc*dNh0?E*Es8(qUeW}rL*1AY+ zAuF35MXG0Pr;yuj8D|U3!f%{#_b-r>)U=W9amSp#iKvnBp8(=#z3bvGTT!qsM@HNJqf4;L)-4g(re!DK%eksOe~!A@c-Il`t*iC>4*%nm+#dMCKUBY1y9 z^7L>Ie4w+JVo6T|gu?(mJz`F$ib=oG1vGO3P`K3dxoOQ?=&9FJHk>CwomHtNC!`vD zjiSp|2#dsRx%5CyI-5lQiVg=NA!0d-1i5C@slL>hunK?!hp}st*wn(7U9|F9q#Pd> zYznm7jb!?b6aZ_N%?4vTTCr8~zM%}noHIOdZ2BCspeJd{f~?hoeW4-UkyI}mQWjU~ z5)I8**>fb~W`H1}#;FCE#Y8IykkSlWtOAZ0M&Q3f40S_vf!+OT%T^(d(j!S}!z>kd zBvGi*)CHg_s>E&n9esm6qegB&w`wy^`}x$}r@^4;3>l(+v6)gw)*$DEt$a)amI?Ip zU~p?{v^NEZZA+zHu{UBi>)SiHFA}Xh8C*z_L6KclYNTKK(PmqezQKu+t>~+Koj-{j z15P?yyAsj?9R)_&sY@xirwXZLGo#}YDP0445a(nh@8XInpzn zrXufDCmx726+_Cc5I_>XH+qIRzEMA_KpC!o-3dw?Fk}Sdyi%qOEZsI+gJzN=eGT_1 zcch2<`+7$EwHs9#UIb(*5$ha&NL14}A8i<)95)kE<~f76~!QCb~T}f2Z&6gN4mLAUy;D(Y zVQPG6%*+A=+fHwD)lx>(t)T2{3|{98VlwDJuUUTfK{EdmU6_m5^`^}>!k3Q}ZZ=4< zjcDC*6rxC}LK1x(80OT}t4VfZ?$F3gvcSg?iJYiJWs^k8(}i|{9=2af>5eNo%Q)tD zFy-BzSS%cGV~wq6FU@w%;v|!7Vat|4ONgBUL$bTdtba>!Qu8FL6olffbqP1A@S)=! z8_@N@W>GOnN|(pZmHD-3hN7kv7+R@JW;v%ypcPAn>1ssknrvJSTHK41=0g>2Q5|LT zImdQoY(AN+Z%cwa-;b1SJy<=6e7Ps&d0%ID%Y$Ia(HsE_+KWiUQfrf?va!idB;oYe zOwA5M;XArIJ%*a=+8VJ{%_(+=Wk_}oM4rAq7LNPdjY4HdQQ4zAS=-pxkpXWHD#7gs z(jy|=pCL0HlB7Mes_w9Ci=ad-oC%oK6fvZ-sQbc&V6c8!yQo`YyiBshz`_$78?2Bw zfb1Y985r4gWppsobdL_{;LApGGg`GIa+$=o4y$$o#Iakn-4N#(k@Pl2*o?mmkUNZu zO0a?;YDfD*%6UC-S`rOz2XrVEl=DqAG4@)l2d+%81&dAH);Nw}v(;wB1k~$fI>UaAtSx~kI?*c)rO;_lU>89&JPR^z=f){%OM*>>O7}rz zkxarXu^r;Gne+%eeU0H7FH-FTLlOLql`g#b!IOS;>~#YVU2)DiXZ-2OcfEG{`cscQ zx;b|7uA9r2?tTpya#{uNYPdhnO;x$N&F|A)E%0E=RI-az4576AbTjEJaRiADer9jA@so zNuhx^u05?b`jzdHE&)d*6=wYC9f9Ke!T4$({c-+U>D5c8RC9l4pBfi~E%Y4{qXUE%>vpPC`uy0{G=X<(SvYlnMHL*=+W4jdNTl0YP>mW47zSH5!Ulh^(O<8KU~6g}tayO8o{ zQr~x<^IZSi;Q8(xm&o`Y++7_|ap4vf*RqtwteLTAWt%_M$rxHO_rNCI!K0c~8i?a> z7~jNo({uZGtvx2`<`MPw(vueK+tPmh&kf;Mn|)ecucq%6tlO$CrT6yr=ya^_Xxmw5 z26!AfzjMvKr6u!pVg-Hw$*n>#@y-fSN%462M5RI8d){| z`8C2kV&1XE=>;;5JHYrxgFV<|tw!9|)`zVRRbKyk z-Q=@Yk39#D{h10=B*7XvnRM-WgF}h>%jcTPt*>r;Xg5{XwbSL=4bIwJDq~{RBC(Ah zniu2i^ghj|oY|w*8=7vNw#g#iW6PvFV~_h??4EmO{lfa=H@(H@2^in%GG#xW&kghM zEPuTqO}VJT@W3yDp*gPxer$Eree&&ckiR^}*Z5I8yZgZ&T}`$Rwb*sYV~?uE>GtdO zXYaRjc$1O3IqMzd01Zke9sifj+VoE!wmwabh`Ih@i${a1RlDpuK3VdlRrb5#Lv@)F36?1L{x1&k!(k4Gg1#W*h#jW8oAJeGOuy+j^kGP5 zUAJow6C)blUv6S~_glE?=k#x1j#wVE#&O12n(1uWdDKuH33_ zyvemo9lJNn()kr)x$`wX`@{H#?Hlo8|4YAdw{EXqU*FDSN#hTBipEvE+)-SAc$2&V6ulr*~Yl>XUx;pZCab z*RR{%EbU9LU-TiwZ_BN7D8C!Eolw!-qad`c1ui6w59d-)vhWRo+A3!%_(S=5LeT(eT%1$=BE$h zUMzLO@d}LZ&_o}vLmuI|H}6?To^o!nWVFe6QxA&|Uj`oxzHSy~wFJwT8J|Oizvh0Z znpZZs;XMOi=liD7_4NmDYGuXUv3%kG&EWP>jO}a{z_#mN^o1T`e7AHfB=xX2aXEMVZsMqre#i9&c^D3{y1B6J)Hi?4 zoss?(a=`ei^-G(3Ez0lvg(q>VCd<}bY0>6#gOsZ}KdvoHaom4r6Utc+OGsr>`LeY) z_Drhluu9kVmcMWRy_-EI23*N5Q{QU9^87Drzo1=uGQLQ|QClYjB{}Us`g8G$xHi?A zKf3qcq59N|;e*X`7j^f5ky*(2?B}%6v3z>m+9%Fy=z;i&dj`EQF+0;}dishVpDhQ( z`l4K(F}{^H`Ksp>5q0@?N{4>8lPx`>-b|h=o0=NFWP-X*_zE1q#Q2^K{~0tf-TlmhpI6QDO*NO8H(3o2T0DCHaU5+AT`7~+-j-=n^bTxc+m_{qC9LRgchdzMoBa?RZ*wsX*!@}B1g&@Ixcg$|WicV6HC(^#&}_-aMJJmPTNf7R0Avz+sqTh5I$I%s_M*VJvt zo=xqyq}6%I6?HIW(xJV}v~3i%>*&z;wKo6iHz6zVn`OG*s0@9Rl|gzfhqgP5?bLAT zWYTTb->>&kZn-6o{A*fi>4(@Z>lgeC-r}L?XS4i8mGgJ2U|f>%)z5CQ!uEcJ%&K2f z<4zvf`mUmjYx^PVA1{4>wr;52v?@(dAB->aQ5D-;Q@ey2e!ZF%)2m*&vcvZ;KeTG* zv4VP8rFPaZ`wOd-(Kcn$pLZ2T$Lgo|-(Rl2-;utjk8jJboSAXTFLm22_rIn!dT<2( zDdRJ7oS65t;=Nm$CdQk_znARNPr7gRYliKe<35J7CtmAx3!g1yd}Wt6lf9C~?!MjT z)rK?4HczWvt$h3P=7g$KM|^#9X5|Sxd|rg{85?wLcc6c*^ofo71TSf9celdXHak|8 zmOlQz*2$*NY}-xPE(#w|ChfTVV#fT#&E0Em8u{b!A)gjuHgn!xo)^F6sN0#Rc3U>;NdsniT&5_tsL+m@$+cOW#!5QC+#V1=Z93KMeKBIU+p~?fW5?d}R}Q%Ru|Kv!RigJkT{ihj_Mn1@t6#tWvUgS-JL79I z-^A(2ApMM%`5uFZr@^sje32W?>Ts=kDqHWlxY+J#>aIKAyW||MC9Tk``PQJP`)bU> zaUqPa>CZdEb~ScB*j?Rjk&k@Y{E@%fy?mFFIpoZdxWunE{*U0VVK1IcTFGN=z)YQP zneB8JOq{d2<>BM^lCsx0uJf2xdr7cQomBXLeHq`o#F)KT6EB@;u&kNIkdj_>s8WUD)J_l)N8Nt^rSy0(bx<=by$#UEeI z@!1;2_uM5rDztrc*k>2l?f%{FNFFXc^LlKb7qV$1KUu6gx^)J+Kj4)~mzGP6JF>Zc z)%rarMs%6h%{Kh|hk=XLE)|#7^3hx8a(*JmB{RMe4_&YCtk!!?-PZYUcTcf4@b6LM zR+V)<=a|0V61FJVVhrko@zqXw-LTrXGUdmNFzvJFeb3Pr@9YP-##%IslcqktKD!^% zW)9hxNvCf5yuV7)$HeD$J^kG}IDGH5?rPY)CrhF`)@}WA!xszGTOi|GmN22yDSwZ~ z+#JW0q1BbgmdBkxxTwx2_mizs0tZfOZIADVGrrm_Z+$X(V=%m;o5U{2?ZvFl4-Qp7 zdv;yg)4jiHJpSGqw(Se!+qQXRh-cmW(5Le(%$kKBF!xtaoIWmY-I?mf+s;L-^+dm- ziv^|c-ox>A%k6#EaLr_Ag+p`?>BW%SRwvfAyt`q|?Nc>_Tjo^3!F>*-o=e5BelFpwD+ud}n7qdK)^tN8{CN?i@Zk(DH}Zw5UcS zoXR&kJ3X!7(~DNo*gk~4GBRoZTdVes+rR#O#ZPAwqE~H5{7ZIdiA`zA+^KUyK3}Wf zVI{|nV|;g}uHXJlv3!PX*X$Xd<|)IEE(+>py6&1+=!yoJO`10A4!gzp@dp9ebqkt#&3w(b%oCeut!tZeO~3ur zVbbzu9_<_1j=K2ivp4plFh28B-E}MVnUQdy`69!qz4}$S?Hw~xf55DMmD^<ev?+a*pqudEg(SK5AlO4mMne^@2lMZbdaowpxmII3mi1xt({&bc{wbKR!L zr$;~D+|ws?-ouMqIt+o$y2kjjx~3LHlp25UfUff32=CV|AB=s}xj~JS7t{JhTfMvZ zxD)()?6H$cch%hHelWfL^6216@24!z^BVEQ;;p&ALHp%(4;`GLs~?W-NQ|%S+_kah z5hrt&=iZH8^K|j^*&W{G7`O9V;(WD7)i&$w)A1Qy#+UCNwkY|j^1HjQY3ruPBYW;H zw{63k8Lw^po)41yIITh2jG&8T(g724ly$qkydb~z>_*cUUynL@f80E4=$z?6{{3!P zJ#FU*`@#5jES;=Kw{cqIXLO>A<)d9wBktdr*`RCS+Al-OhD_@|5c+B%<7-!A-0QEG zB4ofW0;?c;3?j|X-yWqM`ROBpDOV-1-t9X^y$^rfIOE#rh9fSI`U!o-_?~_JQ2G6Z zoSYxsCbT*`!20Er+evMllOLR}WVvm8!($aDqkYt*_s-j8bNpNT8FMYGy!?1%+f(_D z76rPpp82c85B?~VH~i&t)Cc1`Zg6JlCG$Z`_YZw$*kQ;0G4bgSw)zaIo0Twiq~F1I zj!R)b7~h~7D$CcEx5lhYJJb7@!6^NNE8lOQxZ3#Hex>i3ugw=E;ZrHK=)G-seLWr< z@OoM~NiCfkWA@A+m>B&ta^~=tAK!eL+GMHP6aFOQ+g@f#Oq1;`F4ZijJGS}60lJfi z_DFVUeZK3A@(qH^_x0(`ap{b&;)owR%5JNj^U)#YcH^s!zZ_l_qCBe)Rk_-$-{D^xtI0CrJwV`mIv8Fr9OLweDM(*3r)~ zPnO-7A3tZ0tor*6rN84C3&uBaiLIVty-;nJN)$K;S1`nNBdxW<4ks!O11W~OlxgET{%Lx;)|Pd zg=^z=r|aJ^8#`%K57bBLI`rOq$$^I377c&3VfpEvw`T`*^|!9Et74Y-h;~mun5=Q@ zphCZg@%4R}yVEA^dN~W{s!`9XrCi>5uf>C=W^d}gpLo7Zd~ozW*bl~6ap?FCMjzeX z8_iV(xs)CmGN9Xs0;8M}`8i+e>aU$g1ClQo-?{Iq$0wJ1`HigqV{`ex4s9`34zRSz zv`XuHcI5hd<8H0P@k@0neNyZ7@vG{6s=RjlmL(OW&wquvwyC0M-SfiwF$XPfe7rRY zpU+}^Ee1Q!98>zE?kUrOP0y6~eCVd@(|Os-+T5Ioz>hM6zu>PuV0>+J!Ua<}~UX?<5t`r(yu_~Q)p z^-nUs1iv9wF6FJYcJjRZsl~7#89_-i1~fSBG%9}ArfTEXK2TymAL>{p-R^(&^RuQ0 zpAI|QahuuYf@7VG=M3NLGG=kT^VQ3A{C*hvC4lkionGJ4tGwQio0W%g>1_w>ZM5q8 z#MVE8{Cg>z)jdD|RTjr>WPDq?>wcQxQEg1zn)*Ac$!A`8JhEoKU&hwUH4A1Rp6j*Q zAN_6{dT-;D;FT@cHrZZw%lAZetKPp(L@XJzXhchw`>tE0Lk>()!+&9XdaW)GEU--4 zQeUt0p(@v!-AsC1;be5{!LO&JpPLmo@7h%y$Hw?(E%I<~e%$A4)1Bs}`*hEpI#=18qqr-K~;FCLJAmVbQ|p-*k;nM!oyCaIDohTiuSI)002k zvw+?5W_&|0C8lzl?CUk&7MN@@A?V%CJA==Tu5&xk+H3U=50}@lN9!10xJgQr#Vr~P z-eV|tTozER^PM`5OXnEtRZja>$yb%1HWz+uLwfJpNeQ=96YqU#axzv`KTx;hWZhPh zXL-$@aBC#<-ZzUsfE|g9ulm{*k8C2|&D%Ii*Vj1PwBD(;Tcey7^jWmluw0p{7BA6< zI>7iA9XdT#@9D5nHd$MHHj&?bI(YB#T7#_Jjk63-UEaXmMmZaxFDjGDjNFdCxfGJU zw$b9RtrFw1%57_r^D(=AwWZUmIqg{eq!Gq97@tK}=;_tVGqdwu=gliKzVZSh)!T3(<+iZz=KfBKO z@7{hswry5avOQAn>78-QzMpe5?wx!h51&n9d=EbSta{|s^K(}c0zF1g+Fz|%-GUR{ zx14!VCM~IbrH0ow!%t*#Tcip7km9)Xv$}bE|LeUZ(HTYd-_*^@e+Yc+(8WO));*zVoX_H=4dk z+W)6XrR6VdA7swjF{9hPU;}r%$SQ7%2OM{U@wJ~lxAFbimj--`=FDgJx$XJRU2RkU zi_i0hHAZ^IO|5}CtA)OvOgeUkPT3n7X*a&4+qHXIYq@Wp{Ke|`EjCuMsM|4VjG_4o z9EZjDE>`^5u)bcUffc*l-ZK1Jzhft>rnj z)eF&#*AI#= z4?VZU2FCPMPF!o>4)VwNY7NTYx2;DuH~fK9N_0(IyIOk{FR$0l>uPebX1_AuS_WhM zkMXIFo?N?P<~iFd6AJp7)T=e8GUxZdu2#zM#mr67lj?U&T3H=s*S0C8FJaZ-RPQ^PE#zD7X4n6*Ebn~B`klAm z+gGjrsz<+S7yM{}V-6UfgZ;DW*0Ua(XO@c|Y}Kw)x8_YYx?~^yZerOWxqa7=3Gj37 zFg|6&*Rv|T+C9KnXS>HWvu2acp5{qcMNcux=&|W~(z(m1kJ{+_$fTot*pFTEb+PB2 zwRe{jJPjvIi|@l#pYTSmoz-!Yjw6;oj|lp z2YPSPr7P}7WK+L99rC5s{sBu5{oGUy8^)1&oyx&WT{4QgB)?-}jbQrO8q*;Kplke@gv9D^>h#2-{ zXC=RLUJnnoeuHw(Wqh(Fqkin)UV6B)Y`<-{Y(pnLj4QkNLW9?f4p>D;9JH>p5&bC0 zzD!!N?ZEx5o;Gf2zPov5`k)J~0ykzUzkYt)e);POt=5;TF&X23j4z-^c6xYBuc7)& z>O3!(XYc7fT0SqO&-yC0^p=gdAHOsXpM_?8>zBS*m)Lr2`o*y)$_|Q47(eDgeV6R~ zzIvuZU$1Co@aqc}`!}ceJ`A~BFu_rm2B9a1aQSlVN^j_v3SGo4v&TED9i@@+5l zGvm8hHlkYk+gj&)AHVVW)MwM@ah+3HbIy|y25tWNXQ#@lyKNnY&l zd!hcSQ_X`Gw?uy*GANUF8-MPW@yoKE-X@NBUdaW%e*U~sPK{oAqjCq$>aV^Ku@#@e zVSJ$zueRFzW!TJ*RUf#iPL1_@{5)vy&kBwXU+SZvvH^0pHwIIK6rVn%y-uT z$Ir&b3|oCFx>Bjv9iYbLCobrEuhO3`?f0{haNevnsyJudEZ<)z40Q{kGA#P4Ml%F+RtcDH(^y-de4@ zc0nykdgsF}K3S~U@#;p+d?21j!rDo)A@dAv({Bdf2%jf z;xCRfZAI_(QEYq|Z2G>o-NV41F{Mw>&fk_$@#A~@BYCc>2C_sS^pCt5-}6TSAvxP> z?V3BG^YDV?SPQ54IkSU1&e*!JtzYAX3k%lcI3329p7w2(PwzpW7N{IfrhoG6w`@Rs z`R>VI-yWptNa(VNjU81pm;ClJW(m}qtuRh6F=pV#8&oRD318sFzKgwEtc3=~e+T%|)7~DL2 zu37aZk80H0`R3Lybu^CSZA0&k&vEv?zUJ7>Z3gqK-J+(SUGbn?{Y#JIUM9sHdzF>- z%L3~f7+;RG(e*hE63ra@)bp75toeY7Q;v_H)8D(4>dCmdSvdn>2X`{QAfvEZId$7R zeC%dC$D_|_C%;4aqi&wd{&r>{cQw!clMapxW_;yNZ)m>J!zIjrU%zTkEpz&BTpjQ7 z=9gE%VYJoMW35Lu+tFmJZ^!Q@ZR%fXb#Z2X{eGpY`5jB` zgJWYDU*DPi${bo7HobDlwF5(DyU!^YH+9Hgl^-p+`7QR$k7kci&d(U%!PWW~JsUae zv~h6X+u`)h$?w9RuNvRV#AidWhphH+i+uPSu&pv_g-aiX-aS92GNypDw->xhcea?k zcK73}_CNb>J!f^^buH?H@wJ)}aqa2%d)W@Tj?XHryX0hZyqd?26w_(C@4A2Y8CVDL z-DG@qr+1xR+EKZv+^UPu^;SLJ zd~2J*Y>(X5U0Oc5&^@ol8rx}uZ|T=M{^|z$-HdOV@?p=E!LwH;cMXpDVZGhWv12#q zzz<{V1m*NN`@(h43+QpiH^2Oa;qfWSk`}`mB zpK^L{;F$}-KOLG?S@TkF-kHt)Bc#dso6U{pEQ}vMy}`WJTjpb)lkwfTm~OiBq;u(D+JUvdxmgVi@qS2F41-K%2$i~Jd;BV)%F z^lg;#NH?}}VAcSR%V&IjhxKe3CY$>uPwLa8huZ4w;n$=r?T4KJt zJ*98*+X<6w%1HY)d^5HnEo=LxSI?g5fSR_>>wX`i2`9=LBg(sxz2 zF@7fP?rvQd{toTP0XkYH%_>`d-1sj^@t+%c{Zvl(>=W%}TXSh_t*+@U_t#1O^n4SJ zWoCShBbu)`=wG+P%17S$hAl>%`4TW@f$qKhzI~#+3(8;6O~cw2#+R`3a#X=%d8}_c zSL=Pdy6$Yb^sm&a!KGf`-0a(|(FU)V*vjid@BOv#_0%W3*G+iwc|rB{WoI3<8zFf< zwv}p4JL`E}7tOKs#peSV--=E3s@@OUwW3nzC;p31$*ZZQiH!@YTKUhFwW{tXO@jSc z!}z|n-1Metmx0_l!(k69>)gpaaxd_!q3Nl0JM2T!E^quW3-!VH=FQEtniJbgch1lk zr@z{qSllkPf{*josD{sGy?mzI{D3hQ-MLcwUMyRX{l>mt%`TZ^5BI8ER~CPM(bJA& zk9ckIyYiq`8yYMA#BrRp1b=WfEf4<)VebHU6Yv7)0&fA&DaCPv1^fwce*rhwM}Jnp zYa@KPfG4`qXqmm^7T`| zrQZ9hx}>G-=`M6wtJhe`ug@I6GZPv);4O zP>PE!5cLg{b;Q<^Xj#2j$L96D`(R69#K>q_7c40EZer&h9PS?)6A%crkzJ!EPIeAW z8rgZrgn5sQ7}?yxH!?UnQ2B?*ybI4F>Kz;%;~OgLp^OO#j__`3*R-iO&Lawo2@h6| z^6uTiyJtj1XtcLS51>sP8re6&|0Z_!;(HPQu&~HKyyD-aHyV3b0t39GvEL{5Ps#l^ zam8SHnzw&MR3I%=8;PB9!4X=fj!F}&Bd*NiXdxiuU%04151yWEm^SX~O~5=Zh)REIzhE}B(=e=3V1?KQLZNY#K#bwh(IwJiX-kQg#RpY|oh)qCKTO)6 zmDPXH07Yca2V0Ic%Af?wF3c}5K$Myih;K-ANU*jphM@Mae-9@@u&kF@3xO5!4Gj)2 zITbT9A~XoQcuFFHk(y|<@k@il!n71&jk6dq!l#65fbAIx77SSl$eLdud>>7rl|X#a z*z1j*MI}<1K@m~x-u# zO%_RpFZM)7l}LjPj|jK*jrI@z(-6SFDlJNuX530U9YPycwe55LHl(IW)_-n|g8w!o zCOAOsDE#NhSkh>BZ%GJ(X4H_Sup}cKS<)#SSyHtCEsOrfkZ^5t8-^iQP4m`1uFzl{ zPvMKR&b05K!r@|mn;4Up%_%Z4FaWw$GYIsb1y^VVIBf|IeTnrUG3MIHU)!mJaQ~=L zktL!JhsOl_YbgyvIr;fwq9Hnfk4(EN^tT-fH$dC5a>y0NDWgYdn?LFhjEcr-Bg%-# zh|q{3qeMZ~Ryj_@r3w*s{g6<8v}Ya@N5!ZFdN zwY3cMj*N=H$#pm@u%xOKQi8*>q9aN`Ph)s92FF}N&LW|*mA=6^E>z1l%6EL2zpiae zET1@eG>rVjKhItMD@Tg8(r|4D{C;zQijIl@=QdhAM*qlBK3WSNd5wS9UHtc@R>TTu zmrZtblD2}u@}`;9Es{y?Yyll0R+1@;#)zN4)`K2l-oqmNL_45e4(VK_lE@+Et3_{J zyA)~8!QxY;U0mevXuVWIIg}0}jKly?Xy6cEf3m>ZYaYRGiHgMF6&irHsr*g+Q5P_w zB~gBG|CJGRUZj@kE6goBRjDMB#s6HG5#jzNGMK@Rn$!)z8x0X_dx+EJs8XpcQfm-~{Aq*?Qe4_YE!m}wl z|7Nd!$!P|OY1*X(N{=aAd=jK&M1#fzY@yTa1=XQVa}Nr}$4&~H`G1d!41toq#iD)T z(=uNadQemZ#_qKBeb5Y0R8T-AmM-lh;uBQF7t>Dllu(zH|Ez-cxeJa!I$Y%`-11!YKrPl zJ6WLbs+34U(dY4y%h(dxVa2|Qp?yigIAi^NNo0>{_DE$(xE{3YQ&<$BWe$HEt0)=g ziWE%=m}nF{x!Wa^KcRE&P%^RcO4%P?q+s&@v-=&=Qe-*87Z()_x}K zw|*WROHpI|=Nv=p(@?N~7(UM_G%Ic5;`hgvoS>j4XiFzD#U0s=zB$*=z$9SWUREkyrm5qrrE zKnKS9Yu1=*lTwI>_BqxlrRb*GPgwCHi$2XrVGpM^xkJ{XaMXg9!Y^bGDp&g{G)+-q ziwU2q|K5^*Q?>LNXl)~;Q6_R2siTXya3&6ZIL?LB#;Y=AEOT|6LnJz|LhJYDz zSAjiYw3`BE$d$o8j(Y^3nSdE`4S_XbG&=z^m_Y*DM`Qp}v`=+K7W`IMv>_Y7YcQOB4v?vIs&TSQy@FH)J+@`?~(M& zByk!FSf22s>qsj_Drya97Mbiyv>`-2C7ysndg|8$*Tl!lYWol;m%Mm2{<^8pWhHF@ zB4KHkt3Ns}rGiklRX8n8#wkEb8->&2>0nS=ZIdX}=Y_0IQ=oW$r4fhyC6Sz+M2}Hg zzmh(gBvr&~+|-p7sV>%b*)G=gkU-8obqdRXD~d10#Tr$?$Ebdrlwp$e2pkEA2O~>5 zF*XV{&#H2298=9b6(f${hMiPQl~*GVoBLHWGLlo9ZBCj*ID` ziB{MCWL`amI+e1dNII!3r^wEr1S@`Js9H<7n9q4SRI~1=<_0Ge>O_`WMGEe-bR~#g zLy+bn?R)|?X*(mPEt|5+xvQlf5Sk7`eQ2_p*Yx-D7fLjhvZIM=uNYMd%ceqoma(}d z9D0jVMRjilchaXAA7{s%tAHwdD-sUB1;UMUcTdIXP*f6Eh3GVIrb1TQs!y<}+|?Py z62_91l|*7ea>2OdszdW|E)=IUlT%9t{hB5=5A{S!i(A5%U&=~F=x*7JPK7GZns}0m z0`N3Jk_tUUCwCfYYLaA+&`3VL&m^%9yNQvRBw7N4n3^Qr0isY3^irg{TRSSUUA+ds z5Gvn2HPM6y8x+C9i+16l(u4Fk0};6D??4;*=OVi zA(RV*hEgk6pO}#QkixqrF@hGdL3B;tH^aY?; z2H4y40u<^=lo$n7ZUceStyPAyhP%@w5;HN$8foCeH55t+Wu9=DV&`J2D3UV9RVe-z zXb;Z*wmikhGd0M86}-?H?VVarnIe*x_c_{zF4qKD0;Ba1X?;anrbs(0 z(&#IS%~%TZfO+Dl3(cu{Z&_e`%;v!OnCk+Y$M|{xb7Wx$0;`IEx?CVI`qHB=7X_>( z!{UIoVtn+CMK4Apjlkz^JFq}TI}I$1VU3WRwhZeGtSiF;h{j?G1;)oR4j3N`nJzx1 z^MUax%>X86Ax;3}^L7;&A3_i5?ZloM0psJd1m?nMRw8Wzu+EH@BGUE(^I)_iBJCMr zjP^#P)yDlKminf^`1G{~#;0#EuuMFaasj}OF^qW_iWH@_sUjuL+FTBuOwL9>b9ePS z=4=#@trWZi-k>S66TD#VGOob3q$I=wRR|AK5>#}jPB2G`KB=hjN|aT|ZmKV98XY{2 z-dPC`Q7jTgs+wE@ra=^`vk2F4Db$_JUF}b@py#ty7w`zl#bY0Hfs=(w*iTP5li5e) z$z^%xMXiM5RmWL7lglF?lvxkY`3h(Zj0}P&UQuz+4$7 z6jLY_lhWFpcga#0@JW6LFUK`8L#dyYuo@va`&Z76>sBLSCW%S76>ZyPK~uA&Lr=8$ zTeFthOX8foiK0*lMvV$2C7p7c=Ri1LCN&Yg)A|eetE?{H3SZ|k{H`OKLPSv;@K0kN zqEeE<2F0dqtZ56YeKVq9SEI3!|xiwYsRi*D=+wsnz$3 z1eb!2ki^QzqCSmV;t+1(1d>FAQavg8dh*G{;j3H-q*9l21ID-QuE6-V-47Vww*7&H zGrkaDd@C9YjIUzyF!&0428@^gd| z<^5cwdK9$|!O>Ny^Rry62g77Bw;?7*Q~Ibm$bpGbqy?KEhz$ zMS%;>3P%-(m|~j3uS^^O<&<#v7%CjLuPbiABhS`jexF7r3gconTq7&wmRhpl@D4d0 zlHH+-lu&EC7-Ppta$L2VxcCOQkLFKCG70DnR+NDiE7-)QyP&8hjgAZnMO6HI!q5GG4PUlT1T>s zQ$QaUFw{EIB(Wz@O>Uf%SzN@?rU;qtZE=q>!Cx-d3V)p)H<5dx?CoN*Ya)IAS-!Ut zo@q*#f_!E7f0G$avXiJ8qvar#&L*>uBLlfdL4jXoPUSD8IL1feL?4dj;`Fm7t)d*^ z{a^9cn0gAQ&C@|p)+kH}^>0{Di+57d4rO_fa;FH>7<2hv95Kqtx1fa36Vp78>HfEc z{#(-WY#?IjtH>y6kh5PNsd7GvLUv;Gg)*X6N1}kHM;$_q98!mMEJ{z8a{)GnVSd1d zGHg1q^$be~7RRt$V0?%QxaS)jxd!wpWnFFr{?2DuD*i5FSO)%1W7q@y2NtaA!XC&(>y*v_QO6)0>wpUkX;ThJ$xzkSa5)i6_Hh`PuCUp+&C6{&3InFuxh zPB5f`uDdDUV+`Y!+PMa+c(@{by1&52#gtF&RF%m9y~L510hl>cv`&p%|Lce%#effr z04S!ZBU44(}4N2ryYBGarpJ% zT)n#YALi|Nq8C*@t(?enIB{@2BY=MAbk@&k(du zJK!Xa63!8Str_Nwzoi+bz+YpAdEqbRMZ)#PU${)b2IDVfNx}`qUn_=1;%`-k#fq2; zSan95j=v;I5-tOOsYOe;6Zp%&_X05fy*GgI@4XLYq!hI?Ry>{Q_VMd{9U|DOX08m^)=bxwWR&*hab-EVS!aaeuV(C?%uq8%s3kE5`z015<|8mR z?_%bRClra2aYP4?4rF9IfsAn;T(pLo#YLXCE#s^!F+`|Z43B2ds9zvw_m_lw2}eUy zB;fQ0ffp0@>@jue6^z|LQdUd=TS?BIlLJu+X&=hu*xX82vlZxnvF z@VhJg=-_-yuAC`Jg65(y!qvfy!z6-P25vni63&b>GrJF*%Fhq^nX-T z=O%zu!c_oim>J$m0R?DDp_R+|7(n%A~i);{v=j3}3 zLevmIjs~@KnVsQP6ZIwfA#1u^b6^V?<_hcsV$|h21LM^iRU_Y9&{Uo-Hx9H#EJQjm z>P6_{AFsILaOYS|aqY!3L;N=3*OjE3T`D>DF^~L5y;TW%i}VL+Xw(AN7D{M1e!uH8 z3mC|@W_Eg{?notJAwXaNDbV&I{ZL_?1UkDj>99EDFKWNuRK2 zL?|~?fVm}m&=5@$1KVKqWO^?uFghkw$=*N;I*2iK6z(NL+bzRs)DfwmUdXlwAgQFz zz)63X2JDL;sUy-KnyZL9Y7gBa=$j%cs1isDa8s5&C52fgtx{a6P}vt(Do@aOsTgtr zDMK#+so(VquqoghK+5@B!1jRe0J{Rd2kZfe{-BB)`e)oz=Fvn{!vMblQe*!PI0Eno z;AlXoJ5@Y@1aKlCg`WYa4@ip67?5Ox=%iE@qvUy|LYN_&*W_uw!c#*oM&u*+o9CM^ z(iV%fwIXe!NFznV$9GGleG_TFM4A!a&htV23h$UM(q@Y^=ild7o!!;J<{s)V?rIF? z6}YLBsOL$}*>uE=K1ZUp3W$sPt@5+^6gCXxD0k8~Nh$!JNevF| z+AVd?Z=b1%H}DyUSX+eMx69PHd4NBqeUX((2H$P$nE0a@bA zTU3l`4?WMDK{8COUzb}1ERtdSfJHOxJg~kDBlAOUl`a>Hzm5zWkH02N*G>k;>(F_? zN;BFrV7&f42+Ww#j*EO69ohwm6W8fC=kEfzsI3yDkLvK3ssk3p`E&|YqKDZXU%SAb z_(0}W{jKv?jp;U0gwY0_~FYmFOZl z@DEuaocZF9wR9{LWtqP!vrv6-Uzrj1N_xRNw4_k%9%qfk1o|i=eEb4^aNZ$K5+beL z-b{t3yl1*lLLOofXOoiA3lZ`Ka6sZM(PL?^#Ui9tpFzClr|Pq2L_-!Qi9V?oj$0)m zjnAimoyqEh=ffye!nkoE!4^cqr>rZ;RQq==J2WexYFg;ykeW{+QG{&g0k+o5CJso2m z!?N(rbr947tYi=iI~PoHsA4I)%6Kb=iXfcSYiVyrT4pej{#3jah>Fvc1zLiFaw}GR zk-rsRY=-m>Wm%-CsYJ+ftMIUh9NDoMdkWXL*yn;Z-2f9?GU%~-NGeiisI1;cC z?qdL{ZHxq@DWF(D7r-%q?to(fdjgIJ91J)Cki-WQyQ(pOlL1LU7Xr=&TnV@ea24Qb z!1aLCUETor01%VEtmCl*up!d88?Zg#K0uo6IRr=|ngK}NPkL`}z+-@e05K)13Ifaq zqyqU1a4KLr;2c1TpGG8-08au=1SAE~6*%vE5XN_Ccp7=aJdNxFPoo_2v{@o8O{A?9 zX=_B#0cSRcc9{fAV_u$`wPMkn%B+|&5@O(6}&-3|+G#Y~BX^A2&S)`?l zv<)I{k4QTp(r${hyCMy~qwrpMjlw&Ah%_iqfd-#W;G?#|r=^`p>mbr-$pD{^J|Yb= zDA1xs+6<94N2IM5X=_EARH_N9FJOjTWsydotmD(-DAHPsG&%B8 zEYbo*+8@XD3l5=VIMx0Khz=9LMZ1A6;eV|nc*@>G`L=*cnl z%m#u;k!vn0Gt$qbkEaMkv`ZD0BXpLE3IVNCWes>3&<-#IkTQ1!ustBWN>vxY6M+2z zPXh)4o&_YWbq-Joco8rj@G2ms;TqsyfHwfC&d~OmUR;D+@OqIjLv8?`@iZR+Gvq=< zT7*cOEYhZmG#WJJ!)_L7`$gJekw*HR=OYczzn9vVIrX>rIev&a2D{a?utTBV^c-yN zYPO0I`k%FwLJuFq);uNY_Ndy0WJVJQV+PX<6hG}hFjJ9m$N+7JQ?|fd8|&ksThu`1 zXg{t_vG6oV?u8adgXDc#jJaD85KYmIW{S^>Q*o@bH3^RpQ{{964CiPDk@%&m@+>_} z$5G?_EhXs^Wo|Lf|9$128cBKG_R>Jh=TK{}BVS9Yj~;nmLwbQtUnYE&ns{O+uUN#z zB4y9_P!vVWf$SnbLSzptA4*IYLowuZ5Y`zOKWfw+7`gwt9M$?~#y3;sTLp~trY=Wy z&G)4)1N*`FZi{?BfPo4BOM#nz2f2lO*zUl-vJj+u__t~F4}1x(RWbde1Q)d<@(F0* zg}+qY@m))NDk|U~ho6cMGm&dfJtw{s)JNjUNx7T&HAN4~46Zpp1clFBvZ$HP>H>ED zs?1zda#8r+P(MjGWbrnB4icd+#TYgIUnO|IUZA8i>KU#S#!=TmvC&vpEk?sP(eNP% z8aStfQSn$YdUr`@^e3+1XA6J*kK7NCx#7Urxr;-@DuF0NXMm6{)4c7r6n z;Zxqn&q?SY@hX?^AW@q8BFeu{GYz2^rkVPN^;i-*N@#5F1b$XRmyVPZdLaBz8x7u3 z_keT*$1UY#D8$ZO;gH)SM%UpQK~a1ud*s!+g5fTVv? z0OtZ?l!EDbH6V?UO$DSaRw=0Aha)U)$fPfitks^)Cm*-n5(pHKzvL<|d z+eI3A)I9BhNTc-ev@!yQIUkWmspa1hDAIyO8p=foOT7r5kH&KN_+Whn+6$5PTBPYf zKk~h8%e!JRgm~@qDzgCS^J;g~`+fF(1DJ z_%$r1@QpyDi_`#lar~u1Il$fgXEzg@i=bSuqYN<)7KjfOQwTBwVl+r3`FomJi$RP5 zkdH@&QA}k}2#OcobWOY(MPOGX5=uKMf}+KUuX?M9rL>e&QJxF|sTe1U#YmVT*G;7L z5->xij(EOUk#<4kyCTwrPD{~6vvzLkn{Mha3UaM-pMw*Fz24UK+|}pYggq@-g$(cO zszNQS&0$knSh1#{B{W|Aq?Q%JQSIq+&cGTlOjCK3FuP*1+z(t8@N>a$zF6uiAAGxv z32-QEd0Vq7cp~9^+Q$S@&*66~Eo1j&3}uLeHhC2Z(Gg$R^W`UQ3Jr5L7Q!7NNdHm~ zhC2pQyx42(10Mp^fiXtGXJMIlwlp2iqa7QicHL1VcnnV@QtS=a+9Du`4M z&J}+bM11~TB?CPekm@HCkOZ+IGR3!N!VK9e8=mGZJVhr+yPg=4>>U{*?TpAr;>?GABhucBv|l1kiWqo4>PPVJT_)0;d(dincXd4VuodcCY~PVJ zFZS69M5LZ|Rsvf&oRz@#821;?yv@2++3%1&URweM4 z%0D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%0D&%8{-{k>^K}> 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%0DxPMb%?IXC>e| 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 Fw>{;! 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
G{yvy)Ym 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

TMgG(RK8PPywdU#E<@o$Jc(mJHw@)f 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 fi*~p@8`rzf0?t3iyZMpp4*G!kJHR+U{yo0g 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 diff --git a/dependencies/reboot/vendor/curl/mprintf.h b/dependencies/reboot/vendor/curl/mprintf.h deleted file mode 100644 index cb948dc..0000000 --- a/dependencies/reboot/vendor/curl/mprintf.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef CURLINC_MPRINTF_H -#define CURLINC_MPRINTF_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -#include -#include /* needed for FILE */ -#include "curl.h" /* for CURL_EXTERN */ - -#ifdef __cplusplus -extern "C" { -#endif - -CURL_EXTERN int curl_mprintf(const char *format, ...); -CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); -CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); -CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, - const char *format, ...); -CURL_EXTERN int curl_mvprintf(const char *format, va_list args); -CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); -CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); -CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, - const char *format, va_list args); -CURL_EXTERN char *curl_maprintf(const char *format, ...); -CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); - -#ifdef __cplusplus -} -#endif - -#endif /* CURLINC_MPRINTF_H */ diff --git a/dependencies/reboot/vendor/curl/multi.h b/dependencies/reboot/vendor/curl/multi.h deleted file mode 100644 index 3010492..0000000 --- a/dependencies/reboot/vendor/curl/multi.h +++ /dev/null @@ -1,460 +0,0 @@ -#ifndef CURLINC_MULTI_H -#define CURLINC_MULTI_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ -/* - This is an "external" header file. Don't give away any internals here! - - GOALS - - o Enable a "pull" interface. The application that uses libcurl decides where - and when to ask libcurl to get/send data. - - o Enable multiple simultaneous transfers in the same thread without making it - complicated for the application. - - o Enable the application to select() on its own file descriptors and curl's - file descriptors simultaneous easily. - -*/ - -/* - * This header file should not really need to include "curl.h" since curl.h - * itself includes this file and we expect user applications to do #include - * without the need for especially including multi.h. - * - * For some reason we added this include here at one point, and rather than to - * break existing (wrongly written) libcurl applications, we leave it as-is - * but with this warning attached. - */ -#include "curl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) -typedef struct Curl_multi CURLM; -#else -typedef void CURLM; -#endif - -typedef enum { - CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or - curl_multi_socket*() soon */ - CURLM_OK, - CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ - CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ - CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ - CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ - CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ - CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ - CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was - attempted to get added - again */ - CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a - callback */ - CURLM_WAKEUP_FAILURE, /* wakeup is unavailable or failed */ - CURLM_BAD_FUNCTION_ARGUMENT, /* function called with a bad parameter */ - CURLM_ABORTED_BY_CALLBACK, - CURLM_UNRECOVERABLE_POLL, - CURLM_LAST -} CURLMcode; - -/* just to make code nicer when using curl_multi_socket() you can now check - for CURLM_CALL_MULTI_SOCKET too in the same style it works for - curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ -#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM - -/* bitmask bits for CURLMOPT_PIPELINING */ -#define CURLPIPE_NOTHING 0L -#define CURLPIPE_HTTP1 1L -#define CURLPIPE_MULTIPLEX 2L - -typedef enum { - CURLMSG_NONE, /* first, not used */ - CURLMSG_DONE, /* This easy handle has completed. 'result' contains - the CURLcode of the transfer */ - CURLMSG_LAST /* last, not used */ -} CURLMSG; - -struct CURLMsg { - CURLMSG msg; /* what this message means */ - CURL *easy_handle; /* the handle it concerns */ - union { - void *whatever; /* message-specific data */ - CURLcode result; /* return code for transfer */ - } data; -}; -typedef struct CURLMsg CURLMsg; - -/* Based on poll(2) structure and values. - * We don't use pollfd and POLL* constants explicitly - * to cover platforms without poll(). */ -#define CURL_WAIT_POLLIN 0x0001 -#define CURL_WAIT_POLLPRI 0x0002 -#define CURL_WAIT_POLLOUT 0x0004 - -struct curl_waitfd { - curl_socket_t fd; - short events; - short revents; /* not supported yet */ -}; - -/* - * Name: curl_multi_init() - * - * Desc: inititalize multi-style curl usage - * - * Returns: a new CURLM handle to use in all 'curl_multi' functions. - */ -CURL_EXTERN CURLM *curl_multi_init(void); - -/* - * Name: curl_multi_add_handle() - * - * Desc: add a standard curl handle to the multi stack - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, - CURL *curl_handle); - - /* - * Name: curl_multi_remove_handle() - * - * Desc: removes a curl handle from the multi stack again - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, - CURL *curl_handle); - - /* - * Name: curl_multi_fdset() - * - * Desc: Ask curl for its fd_set sets. The app can use these to select() or - * poll() on. We want curl_multi_perform() called as soon as one of - * them are ready. - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, - fd_set *read_fd_set, - fd_set *write_fd_set, - fd_set *exc_fd_set, - int *max_fd); - -/* - * Name: curl_multi_wait() - * - * Desc: Poll on all fds within a CURLM set as well as any - * additional fds passed to the function. - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle, - struct curl_waitfd extra_fds[], - unsigned int extra_nfds, - int timeout_ms, - int *ret); - -/* - * Name: curl_multi_poll() - * - * Desc: Poll on all fds within a CURLM set as well as any - * additional fds passed to the function. - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle, - struct curl_waitfd extra_fds[], - unsigned int extra_nfds, - int timeout_ms, - int *ret); - -/* - * Name: curl_multi_wakeup() - * - * Desc: wakes up a sleeping curl_multi_poll call. - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle); - - /* - * Name: curl_multi_perform() - * - * Desc: When the app thinks there's data available for curl it calls this - * function to read/write whatever there is right now. This returns - * as soon as the reads and writes are done. This function does not - * require that there actually is data available for reading or that - * data can be written, it can be called just in case. It returns - * the number of handles that still transfer data in the second - * argument's integer-pointer. - * - * Returns: CURLMcode type, general multi error code. *NOTE* that this only - * returns errors etc regarding the whole multi stack. There might - * still have occurred problems on individual transfers even when - * this returns OK. - */ -CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, - int *running_handles); - - /* - * Name: curl_multi_cleanup() - * - * Desc: Cleans up and removes a whole multi stack. It does not free or - * touch any individual easy handles in any way. We need to define - * in what state those handles will be if this function is called - * in the middle of a transfer. - * - * Returns: CURLMcode type, general multi error code. - */ -CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); - -/* - * Name: curl_multi_info_read() - * - * Desc: Ask the multi handle if there's any messages/informationals from - * the individual transfers. Messages include informationals such as - * error code from the transfer or just the fact that a transfer is - * completed. More details on these should be written down as well. - * - * Repeated calls to this function will return a new struct each - * time, until a special "end of msgs" struct is returned as a signal - * that there is no more to get at this point. - * - * The data the returned pointer points to will not survive calling - * curl_multi_cleanup(). - * - * The 'CURLMsg' struct is meant to be very simple and only contain - * very basic information. If more involved information is wanted, - * we will provide the particular "transfer handle" in that struct - * and that should/could/would be used in subsequent - * curl_easy_getinfo() calls (or similar). The point being that we - * must never expose complex structs to applications, as then we'll - * undoubtably get backwards compatibility problems in the future. - * - * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out - * of structs. It also writes the number of messages left in the - * queue (after this read) in the integer the second argument points - * to. - */ -CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, - int *msgs_in_queue); - -/* - * Name: curl_multi_strerror() - * - * Desc: The curl_multi_strerror function may be used to turn a CURLMcode - * value into the equivalent human readable error string. This is - * useful for printing meaningful error messages. - * - * Returns: A pointer to a null-terminated error message. - */ -CURL_EXTERN const char *curl_multi_strerror(CURLMcode); - -/* - * Name: curl_multi_socket() and - * curl_multi_socket_all() - * - * Desc: An alternative version of curl_multi_perform() that allows the - * application to pass in one of the file descriptors that have been - * detected to have "action" on them and let libcurl perform. - * See man page for details. - */ -#define CURL_POLL_NONE 0 -#define CURL_POLL_IN 1 -#define CURL_POLL_OUT 2 -#define CURL_POLL_INOUT 3 -#define CURL_POLL_REMOVE 4 - -#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD - -#define CURL_CSELECT_IN 0x01 -#define CURL_CSELECT_OUT 0x02 -#define CURL_CSELECT_ERR 0x04 - -typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ - curl_socket_t s, /* socket */ - int what, /* see above */ - void *userp, /* private callback - pointer */ - void *socketp); /* private socket - pointer */ -/* - * Name: curl_multi_timer_callback - * - * Desc: Called by libcurl whenever the library detects a change in the - * maximum number of milliseconds the app is allowed to wait before - * curl_multi_socket() or curl_multi_perform() must be called - * (to allow libcurl's timed events to take place). - * - * Returns: The callback should return zero. - */ -typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ - long timeout_ms, /* see above */ - void *userp); /* private callback - pointer */ - -CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, - int *running_handles); - -CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, - curl_socket_t s, - int ev_bitmask, - int *running_handles); - -CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, - int *running_handles); - -#ifndef CURL_ALLOW_OLD_MULTI_SOCKET -/* This macro below was added in 7.16.3 to push users who recompile to use - the new curl_multi_socket_action() instead of the old curl_multi_socket() -*/ -#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) -#endif - -/* - * Name: curl_multi_timeout() - * - * Desc: Returns the maximum number of milliseconds the app is allowed to - * wait before curl_multi_socket() or curl_multi_perform() must be - * called (to allow libcurl's timed events to take place). - * - * Returns: CURLM error code. - */ -CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, - long *milliseconds); - -typedef enum { - /* This is the socket callback function pointer */ - CURLOPT(CURLMOPT_SOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 1), - - /* This is the argument passed to the socket callback */ - CURLOPT(CURLMOPT_SOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 2), - - /* set to 1 to enable pipelining for this multi handle */ - CURLOPT(CURLMOPT_PIPELINING, CURLOPTTYPE_LONG, 3), - - /* This is the timer callback function pointer */ - CURLOPT(CURLMOPT_TIMERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 4), - - /* This is the argument passed to the timer callback */ - CURLOPT(CURLMOPT_TIMERDATA, CURLOPTTYPE_OBJECTPOINT, 5), - - /* maximum number of entries in the connection cache */ - CURLOPT(CURLMOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 6), - - /* maximum number of (pipelining) connections to one host */ - CURLOPT(CURLMOPT_MAX_HOST_CONNECTIONS, CURLOPTTYPE_LONG, 7), - - /* maximum number of requests in a pipeline */ - CURLOPT(CURLMOPT_MAX_PIPELINE_LENGTH, CURLOPTTYPE_LONG, 8), - - /* a connection with a content-length longer than this - will not be considered for pipelining */ - CURLOPT(CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 9), - - /* a connection with a chunk length longer than this - will not be considered for pipelining */ - CURLOPT(CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 10), - - /* a list of site names(+port) that are blocked from pipelining */ - CURLOPT(CURLMOPT_PIPELINING_SITE_BL, CURLOPTTYPE_OBJECTPOINT, 11), - - /* a list of server types that are blocked from pipelining */ - CURLOPT(CURLMOPT_PIPELINING_SERVER_BL, CURLOPTTYPE_OBJECTPOINT, 12), - - /* maximum number of open connections in total */ - CURLOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, CURLOPTTYPE_LONG, 13), - - /* This is the server push callback function pointer */ - CURLOPT(CURLMOPT_PUSHFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 14), - - /* This is the argument passed to the server push callback */ - CURLOPT(CURLMOPT_PUSHDATA, CURLOPTTYPE_OBJECTPOINT, 15), - - /* maximum number of concurrent streams to support on a connection */ - CURLOPT(CURLMOPT_MAX_CONCURRENT_STREAMS, CURLOPTTYPE_LONG, 16), - - CURLMOPT_LASTENTRY /* the last unused */ -} CURLMoption; - - -/* - * Name: curl_multi_setopt() - * - * Desc: Sets options for the multi handle. - * - * Returns: CURLM error code. - */ -CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, - CURLMoption option, ...); - - -/* - * Name: curl_multi_assign() - * - * Desc: This function sets an association in the multi handle between the - * given socket and a private pointer of the application. This is - * (only) useful for curl_multi_socket uses. - * - * Returns: CURLM error code. - */ -CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, - curl_socket_t sockfd, void *sockp); - - -/* - * Name: curl_push_callback - * - * Desc: This callback gets called when a new stream is being pushed by the - * server. It approves or denies the new stream. It can also decide - * to completely fail the connection. - * - * Returns: CURL_PUSH_OK, CURL_PUSH_DENY or CURL_PUSH_ERROROUT - */ -#define CURL_PUSH_OK 0 -#define CURL_PUSH_DENY 1 -#define CURL_PUSH_ERROROUT 2 /* added in 7.72.0 */ - -struct curl_pushheaders; /* forward declaration only */ - -CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h, - size_t num); -CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h, - const char *name); - -typedef int (*curl_push_callback)(CURL *parent, - CURL *easy, - size_t num_headers, - struct curl_pushheaders *headers, - void *userp); - -#ifdef __cplusplus -} /* end of extern "C" */ -#endif - -#endif diff --git a/dependencies/reboot/vendor/curl/options.h b/dependencies/reboot/vendor/curl/options.h deleted file mode 100644 index c8ac827..0000000 --- a/dependencies/reboot/vendor/curl/options.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef CURLINC_OPTIONS_H -#define CURLINC_OPTIONS_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 2018 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - CURLOT_LONG, /* long (a range of values) */ - CURLOT_VALUES, /* (a defined set or bitmask) */ - CURLOT_OFF_T, /* curl_off_t (a range of values) */ - CURLOT_OBJECT, /* pointer (void *) */ - CURLOT_STRING, /* (char * to zero terminated buffer) */ - CURLOT_SLIST, /* (struct curl_slist *) */ - CURLOT_CBPTR, /* (void * passed as-is to a callback) */ - CURLOT_BLOB, /* blob (struct curl_blob *) */ - CURLOT_FUNCTION /* function pointer */ -} curl_easytype; - -/* Flag bits */ - -/* "alias" means it is provided for old programs to remain functional, - we prefer another name */ -#define CURLOT_FLAG_ALIAS (1<<0) - -/* The CURLOPTTYPE_* id ranges can still be used to figure out what type/size - to use for curl_easy_setopt() for the given id */ -struct curl_easyoption { - const char *name; - CURLoption id; - curl_easytype type; - unsigned int flags; -}; - -CURL_EXTERN const struct curl_easyoption * -curl_easy_option_by_name(const char *name); - -CURL_EXTERN const struct curl_easyoption * -curl_easy_option_by_id(CURLoption id); - -CURL_EXTERN const struct curl_easyoption * -curl_easy_option_next(const struct curl_easyoption *prev); - -#ifdef __cplusplus -} /* end of extern "C" */ -#endif -#endif /* CURLINC_OPTIONS_H */ diff --git a/dependencies/reboot/vendor/curl/stdcheaders.h b/dependencies/reboot/vendor/curl/stdcheaders.h deleted file mode 100644 index 82e1b5f..0000000 --- a/dependencies/reboot/vendor/curl/stdcheaders.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef CURLINC_STDCHEADERS_H -#define CURLINC_STDCHEADERS_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -#include - -size_t fread(void *, size_t, size_t, FILE *); -size_t fwrite(const void *, size_t, size_t, FILE *); - -int strcasecmp(const char *, const char *); -int strncasecmp(const char *, const char *, size_t); - -#endif /* CURLINC_STDCHEADERS_H */ diff --git a/dependencies/reboot/vendor/curl/system.h b/dependencies/reboot/vendor/curl/system.h deleted file mode 100644 index 8d56b8a..0000000 --- a/dependencies/reboot/vendor/curl/system.h +++ /dev/null @@ -1,490 +0,0 @@ -#ifndef CURLINC_SYSTEM_H -#define CURLINC_SYSTEM_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -/* - * Try to keep one section per platform, compiler and architecture, otherwise, - * if an existing section is reused for a different one and later on the - * original is adjusted, probably the piggybacking one can be adversely - * changed. - * - * In order to differentiate between platforms/compilers/architectures use - * only compiler built in predefined preprocessor symbols. - * - * curl_off_t - * ---------- - * - * For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit - * wide signed integral data type. The width of this data type must remain - * constant and independent of any possible large file support settings. - * - * As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit - * wide signed integral data type if there is no 64-bit type. - * - * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall - * only be violated if off_t is the only 64-bit data type available and the - * size of off_t is independent of large file support settings. Keep your - * build on the safe side avoiding an off_t gating. If you have a 64-bit - * off_t then take for sure that another 64-bit data type exists, dig deeper - * and you will find it. - * - */ - -#if defined(__DJGPP__) || defined(__GO32__) -# if defined(__DJGPP__) && (__DJGPP__ > 1) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -#elif defined(__SALFORDC__) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -#elif defined(__BORLANDC__) -# if (__BORLANDC__ < 0x520) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -#elif defined(__TURBOC__) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -#elif defined(__POCC__) -# if (__POCC__ < 280) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# elif defined(_MSC_VER) -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -#elif defined(__LCC__) -# if defined(__MCST__) /* MCST eLbrus Compiler Collection */ -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# else /* Local (or Little) C Compiler */ -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# endif - -#elif defined(__SYMBIAN32__) -# if defined(__EABI__) /* Treat all ARM compilers equally */ -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__CW32__) -# pragma longlong on -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__VC32__) -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int - -#elif defined(__MWERKS__) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -#elif defined(_WIN32_WCE) -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -#elif defined(__MINGW32__) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_WS2TCPIP_H 1 - -#elif defined(__VMS) -# if defined(__VAX) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int - -#elif defined(__OS400__) -# if defined(__ILEC400__) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__MVS__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# elif defined(_LP64) -# endif -# if defined(_LONG_LONG) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__370__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# elif defined(_LP64) -# endif -# if defined(_LONG_LONG) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(TPF) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -#elif defined(__TINYC__) /* also known as tcc */ -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 - -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */ -# if !defined(__LP64) && (defined(__ILP32) || \ - defined(__i386) || \ - defined(__sparcv8) || \ - defined(__sparcv8plus)) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__LP64) || \ - defined(__amd64) || defined(__sparcv9) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 - -#elif defined(__xlc__) /* IBM xlc compiler */ -# if !defined(_LP64) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 - -/* ===================================== */ -/* KEEP MSVC THE PENULTIMATE ENTRY */ -/* ===================================== */ - -#elif defined(_MSC_VER) -# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int - -/* ===================================== */ -/* KEEP GENERIC GCC THE LAST ENTRY */ -/* ===================================== */ - -#elif defined(__GNUC__) && !defined(_SCO_DS) -# if !defined(__LP64__) && \ - (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \ - defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \ - defined(__sparc__) || defined(__mips__) || defined(__sh__) || \ - defined(__XTENSA__) || \ - (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \ - (defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L)) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__LP64__) || \ - defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \ - defined(__e2k__) || \ - (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \ - (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 - -#else -/* generic "safe guess" on old 32 bit style */ -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -#endif - -#ifdef _AIX -/* AIX needs */ -#define CURL_PULL_SYS_POLL_H -#endif - - -/* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */ -/* ws2tcpip.h is required here to properly make type definitions below. */ -#ifdef CURL_PULL_WS2TCPIP_H -# include -# include -# include -#endif - -/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ -/* sys/types.h is required here to properly make type definitions below. */ -#ifdef CURL_PULL_SYS_TYPES_H -# include -#endif - -/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ -/* sys/socket.h is required here to properly make type definitions below. */ -#ifdef CURL_PULL_SYS_SOCKET_H -# include -#endif - -/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */ -/* sys/poll.h is required here to properly make type definitions below. */ -#ifdef CURL_PULL_SYS_POLL_H -# include -#endif - -/* Data type definition of curl_socklen_t. */ -#ifdef CURL_TYPEOF_CURL_SOCKLEN_T - typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; -#endif - -/* Data type definition of curl_off_t. */ - -#ifdef CURL_TYPEOF_CURL_OFF_T - typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; -#endif - -/* - * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow - * these to be visible and exported by the external libcurl interface API, - * while also making them visible to the library internals, simply including - * curl_setup.h, without actually needing to include curl.h internally. - * If some day this section would grow big enough, all this should be moved - * to its own header file. - */ - -/* - * Figure out if we can use the ## preprocessor operator, which is supported - * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ - * or __cplusplus so we need to carefully check for them too. - */ - -#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ - defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ - defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ - defined(__ILEC400__) - /* This compiler is believed to have an ISO compatible preprocessor */ -#define CURL_ISOCPP -#else - /* This compiler is believed NOT to have an ISO compatible preprocessor */ -#undef CURL_ISOCPP -#endif - -/* - * Macros for minimum-width signed and unsigned curl_off_t integer constants. - */ - -#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) -# define CURLINC_OFF_T_C_HLPR2(x) x -# define CURLINC_OFF_T_C_HLPR1(x) CURLINC_OFF_T_C_HLPR2(x) -# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \ - CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) -# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \ - CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) -#else -# ifdef CURL_ISOCPP -# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix -# else -# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix -# endif -# define CURLINC_OFF_T_C_HLPR1(Val,Suffix) CURLINC_OFF_T_C_HLPR2(Val,Suffix) -# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) -# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) -#endif - -#endif /* CURLINC_SYSTEM_H */ diff --git a/dependencies/reboot/vendor/curl/typecheck-gcc.h b/dependencies/reboot/vendor/curl/typecheck-gcc.h deleted file mode 100644 index 2dabcb4..0000000 --- a/dependencies/reboot/vendor/curl/typecheck-gcc.h +++ /dev/null @@ -1,712 +0,0 @@ -#ifndef CURLINC_TYPECHECK_GCC_H -#define CURLINC_TYPECHECK_GCC_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -/* wraps curl_easy_setopt() with typechecking */ - -/* To add a new kind of warning, add an - * if(curlcheck_sometype_option(_curl_opt)) - * if(!curlcheck_sometype(value)) - * _curl_easy_setopt_err_sometype(); - * block and define curlcheck_sometype_option, curlcheck_sometype and - * _curl_easy_setopt_err_sometype below - * - * NOTE: We use two nested 'if' statements here instead of the && operator, in - * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x - * when compiling with -Wlogical-op. - * - * To add an option that uses the same type as an existing option, you'll just - * need to extend the appropriate _curl_*_option macro - */ -#define curl_easy_setopt(handle, option, value) \ - __extension__({ \ - __typeof__(option) _curl_opt = option; \ - if(__builtin_constant_p(_curl_opt)) { \ - if(curlcheck_long_option(_curl_opt)) \ - if(!curlcheck_long(value)) \ - _curl_easy_setopt_err_long(); \ - if(curlcheck_off_t_option(_curl_opt)) \ - if(!curlcheck_off_t(value)) \ - _curl_easy_setopt_err_curl_off_t(); \ - if(curlcheck_string_option(_curl_opt)) \ - if(!curlcheck_string(value)) \ - _curl_easy_setopt_err_string(); \ - if(curlcheck_write_cb_option(_curl_opt)) \ - if(!curlcheck_write_cb(value)) \ - _curl_easy_setopt_err_write_callback(); \ - if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \ - if(!curlcheck_resolver_start_callback(value)) \ - _curl_easy_setopt_err_resolver_start_callback(); \ - if((_curl_opt) == CURLOPT_READFUNCTION) \ - if(!curlcheck_read_cb(value)) \ - _curl_easy_setopt_err_read_cb(); \ - if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ - if(!curlcheck_ioctl_cb(value)) \ - _curl_easy_setopt_err_ioctl_cb(); \ - if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ - if(!curlcheck_sockopt_cb(value)) \ - _curl_easy_setopt_err_sockopt_cb(); \ - if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ - if(!curlcheck_opensocket_cb(value)) \ - _curl_easy_setopt_err_opensocket_cb(); \ - if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ - if(!curlcheck_progress_cb(value)) \ - _curl_easy_setopt_err_progress_cb(); \ - if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ - if(!curlcheck_debug_cb(value)) \ - _curl_easy_setopt_err_debug_cb(); \ - if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ - if(!curlcheck_ssl_ctx_cb(value)) \ - _curl_easy_setopt_err_ssl_ctx_cb(); \ - if(curlcheck_conv_cb_option(_curl_opt)) \ - if(!curlcheck_conv_cb(value)) \ - _curl_easy_setopt_err_conv_cb(); \ - if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ - if(!curlcheck_seek_cb(value)) \ - _curl_easy_setopt_err_seek_cb(); \ - if(curlcheck_cb_data_option(_curl_opt)) \ - if(!curlcheck_cb_data(value)) \ - _curl_easy_setopt_err_cb_data(); \ - if((_curl_opt) == CURLOPT_ERRORBUFFER) \ - if(!curlcheck_error_buffer(value)) \ - _curl_easy_setopt_err_error_buffer(); \ - if((_curl_opt) == CURLOPT_STDERR) \ - if(!curlcheck_FILE(value)) \ - _curl_easy_setopt_err_FILE(); \ - if(curlcheck_postfields_option(_curl_opt)) \ - if(!curlcheck_postfields(value)) \ - _curl_easy_setopt_err_postfields(); \ - if((_curl_opt) == CURLOPT_HTTPPOST) \ - if(!curlcheck_arr((value), struct curl_httppost)) \ - _curl_easy_setopt_err_curl_httpost(); \ - if((_curl_opt) == CURLOPT_MIMEPOST) \ - if(!curlcheck_ptr((value), curl_mime)) \ - _curl_easy_setopt_err_curl_mimepost(); \ - if(curlcheck_slist_option(_curl_opt)) \ - if(!curlcheck_arr((value), struct curl_slist)) \ - _curl_easy_setopt_err_curl_slist(); \ - if((_curl_opt) == CURLOPT_SHARE) \ - if(!curlcheck_ptr((value), CURLSH)) \ - _curl_easy_setopt_err_CURLSH(); \ - } \ - curl_easy_setopt(handle, _curl_opt, value); \ - }) - -/* wraps curl_easy_getinfo() with typechecking */ -#define curl_easy_getinfo(handle, info, arg) \ - __extension__({ \ - __typeof__(info) _curl_info = info; \ - if(__builtin_constant_p(_curl_info)) { \ - if(curlcheck_string_info(_curl_info)) \ - if(!curlcheck_arr((arg), char *)) \ - _curl_easy_getinfo_err_string(); \ - if(curlcheck_long_info(_curl_info)) \ - if(!curlcheck_arr((arg), long)) \ - _curl_easy_getinfo_err_long(); \ - if(curlcheck_double_info(_curl_info)) \ - if(!curlcheck_arr((arg), double)) \ - _curl_easy_getinfo_err_double(); \ - if(curlcheck_slist_info(_curl_info)) \ - if(!curlcheck_arr((arg), struct curl_slist *)) \ - _curl_easy_getinfo_err_curl_slist(); \ - if(curlcheck_tlssessioninfo_info(_curl_info)) \ - if(!curlcheck_arr((arg), struct curl_tlssessioninfo *)) \ - _curl_easy_getinfo_err_curl_tlssesssioninfo(); \ - if(curlcheck_certinfo_info(_curl_info)) \ - if(!curlcheck_arr((arg), struct curl_certinfo *)) \ - _curl_easy_getinfo_err_curl_certinfo(); \ - if(curlcheck_socket_info(_curl_info)) \ - if(!curlcheck_arr((arg), curl_socket_t)) \ - _curl_easy_getinfo_err_curl_socket(); \ - if(curlcheck_off_t_info(_curl_info)) \ - if(!curlcheck_arr((arg), curl_off_t)) \ - _curl_easy_getinfo_err_curl_off_t(); \ - } \ - curl_easy_getinfo(handle, _curl_info, arg); \ - }) - -/* - * For now, just make sure that the functions are called with three arguments - */ -#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) -#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) - - -/* the actual warnings, triggered by calling the _curl_easy_setopt_err* - * functions */ - -/* To define a new warning, use _CURL_WARNING(identifier, "message") */ -#define CURLWARNING(id, message) \ - static void __attribute__((__warning__(message))) \ - __attribute__((__unused__)) __attribute__((__noinline__)) \ - id(void) { __asm__(""); } - -CURLWARNING(_curl_easy_setopt_err_long, - "curl_easy_setopt expects a long argument for this option") -CURLWARNING(_curl_easy_setopt_err_curl_off_t, - "curl_easy_setopt expects a curl_off_t argument for this option") -CURLWARNING(_curl_easy_setopt_err_string, - "curl_easy_setopt expects a " - "string ('char *' or char[]) argument for this option" - ) -CURLWARNING(_curl_easy_setopt_err_write_callback, - "curl_easy_setopt expects a curl_write_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_resolver_start_callback, - "curl_easy_setopt expects a " - "curl_resolver_start_callback argument for this option" - ) -CURLWARNING(_curl_easy_setopt_err_read_cb, - "curl_easy_setopt expects a curl_read_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_ioctl_cb, - "curl_easy_setopt expects a curl_ioctl_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_sockopt_cb, - "curl_easy_setopt expects a curl_sockopt_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_opensocket_cb, - "curl_easy_setopt expects a " - "curl_opensocket_callback argument for this option" - ) -CURLWARNING(_curl_easy_setopt_err_progress_cb, - "curl_easy_setopt expects a curl_progress_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_debug_cb, - "curl_easy_setopt expects a curl_debug_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_ssl_ctx_cb, - "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_conv_cb, - "curl_easy_setopt expects a curl_conv_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_seek_cb, - "curl_easy_setopt expects a curl_seek_callback argument for this option") -CURLWARNING(_curl_easy_setopt_err_cb_data, - "curl_easy_setopt expects a " - "private data pointer as argument for this option") -CURLWARNING(_curl_easy_setopt_err_error_buffer, - "curl_easy_setopt expects a " - "char buffer of CURL_ERROR_SIZE as argument for this option") -CURLWARNING(_curl_easy_setopt_err_FILE, - "curl_easy_setopt expects a 'FILE *' argument for this option") -CURLWARNING(_curl_easy_setopt_err_postfields, - "curl_easy_setopt expects a 'void *' or 'char *' argument for this option") -CURLWARNING(_curl_easy_setopt_err_curl_httpost, - "curl_easy_setopt expects a 'struct curl_httppost *' " - "argument for this option") -CURLWARNING(_curl_easy_setopt_err_curl_mimepost, - "curl_easy_setopt expects a 'curl_mime *' " - "argument for this option") -CURLWARNING(_curl_easy_setopt_err_curl_slist, - "curl_easy_setopt expects a 'struct curl_slist *' argument for this option") -CURLWARNING(_curl_easy_setopt_err_CURLSH, - "curl_easy_setopt expects a CURLSH* argument for this option") - -CURLWARNING(_curl_easy_getinfo_err_string, - "curl_easy_getinfo expects a pointer to 'char *' for this info") -CURLWARNING(_curl_easy_getinfo_err_long, - "curl_easy_getinfo expects a pointer to long for this info") -CURLWARNING(_curl_easy_getinfo_err_double, - "curl_easy_getinfo expects a pointer to double for this info") -CURLWARNING(_curl_easy_getinfo_err_curl_slist, - "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info") -CURLWARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo, - "curl_easy_getinfo expects a pointer to " - "'struct curl_tlssessioninfo *' for this info") -CURLWARNING(_curl_easy_getinfo_err_curl_certinfo, - "curl_easy_getinfo expects a pointer to " - "'struct curl_certinfo *' for this info") -CURLWARNING(_curl_easy_getinfo_err_curl_socket, - "curl_easy_getinfo expects a pointer to curl_socket_t for this info") -CURLWARNING(_curl_easy_getinfo_err_curl_off_t, - "curl_easy_getinfo expects a pointer to curl_off_t for this info") - -/* groups of curl_easy_setops options that take the same type of argument */ - -/* To add a new option to one of the groups, just add - * (option) == CURLOPT_SOMETHING - * to the or-expression. If the option takes a long or curl_off_t, you don't - * have to do anything - */ - -/* evaluates to true if option takes a long argument */ -#define curlcheck_long_option(option) \ - (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) - -#define curlcheck_off_t_option(option) \ - (((option) > CURLOPTTYPE_OFF_T) && ((option) < CURLOPTTYPE_BLOB)) - -/* evaluates to true if option takes a char* argument */ -#define curlcheck_string_option(option) \ - ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ - (option) == CURLOPT_ACCEPT_ENCODING || \ - (option) == CURLOPT_ALTSVC || \ - (option) == CURLOPT_CAINFO || \ - (option) == CURLOPT_CAPATH || \ - (option) == CURLOPT_COOKIE || \ - (option) == CURLOPT_COOKIEFILE || \ - (option) == CURLOPT_COOKIEJAR || \ - (option) == CURLOPT_COOKIELIST || \ - (option) == CURLOPT_CRLFILE || \ - (option) == CURLOPT_CUSTOMREQUEST || \ - (option) == CURLOPT_DEFAULT_PROTOCOL || \ - (option) == CURLOPT_DNS_INTERFACE || \ - (option) == CURLOPT_DNS_LOCAL_IP4 || \ - (option) == CURLOPT_DNS_LOCAL_IP6 || \ - (option) == CURLOPT_DNS_SERVERS || \ - (option) == CURLOPT_DOH_URL || \ - (option) == CURLOPT_EGDSOCKET || \ - (option) == CURLOPT_FTP_ACCOUNT || \ - (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ - (option) == CURLOPT_FTPPORT || \ - (option) == CURLOPT_HSTS || \ - (option) == CURLOPT_INTERFACE || \ - (option) == CURLOPT_ISSUERCERT || \ - (option) == CURLOPT_KEYPASSWD || \ - (option) == CURLOPT_KRBLEVEL || \ - (option) == CURLOPT_LOGIN_OPTIONS || \ - (option) == CURLOPT_MAIL_AUTH || \ - (option) == CURLOPT_MAIL_FROM || \ - (option) == CURLOPT_NETRC_FILE || \ - (option) == CURLOPT_NOPROXY || \ - (option) == CURLOPT_PASSWORD || \ - (option) == CURLOPT_PINNEDPUBLICKEY || \ - (option) == CURLOPT_PRE_PROXY || \ - (option) == CURLOPT_PROTOCOLS_STR || \ - (option) == CURLOPT_PROXY || \ - (option) == CURLOPT_PROXY_CAINFO || \ - (option) == CURLOPT_PROXY_CAPATH || \ - (option) == CURLOPT_PROXY_CRLFILE || \ - (option) == CURLOPT_PROXY_ISSUERCERT || \ - (option) == CURLOPT_PROXY_KEYPASSWD || \ - (option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \ - (option) == CURLOPT_PROXY_SERVICE_NAME || \ - (option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \ - (option) == CURLOPT_PROXY_SSLCERT || \ - (option) == CURLOPT_PROXY_SSLCERTTYPE || \ - (option) == CURLOPT_PROXY_SSLKEY || \ - (option) == CURLOPT_PROXY_SSLKEYTYPE || \ - (option) == CURLOPT_PROXY_TLS13_CIPHERS || \ - (option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \ - (option) == CURLOPT_PROXY_TLSAUTH_TYPE || \ - (option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \ - (option) == CURLOPT_PROXYPASSWORD || \ - (option) == CURLOPT_PROXYUSERNAME || \ - (option) == CURLOPT_PROXYUSERPWD || \ - (option) == CURLOPT_RANDOM_FILE || \ - (option) == CURLOPT_RANGE || \ - (option) == CURLOPT_REDIR_PROTOCOLS_STR || \ - (option) == CURLOPT_REFERER || \ - (option) == CURLOPT_REQUEST_TARGET || \ - (option) == CURLOPT_RTSP_SESSION_ID || \ - (option) == CURLOPT_RTSP_STREAM_URI || \ - (option) == CURLOPT_RTSP_TRANSPORT || \ - (option) == CURLOPT_SASL_AUTHZID || \ - (option) == CURLOPT_SERVICE_NAME || \ - (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ - (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ - (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 || \ - (option) == CURLOPT_SSH_KNOWNHOSTS || \ - (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ - (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ - (option) == CURLOPT_SSLCERT || \ - (option) == CURLOPT_SSLCERTTYPE || \ - (option) == CURLOPT_SSLENGINE || \ - (option) == CURLOPT_SSLKEY || \ - (option) == CURLOPT_SSLKEYTYPE || \ - (option) == CURLOPT_SSL_CIPHER_LIST || \ - (option) == CURLOPT_TLS13_CIPHERS || \ - (option) == CURLOPT_TLSAUTH_PASSWORD || \ - (option) == CURLOPT_TLSAUTH_TYPE || \ - (option) == CURLOPT_TLSAUTH_USERNAME || \ - (option) == CURLOPT_UNIX_SOCKET_PATH || \ - (option) == CURLOPT_URL || \ - (option) == CURLOPT_USERAGENT || \ - (option) == CURLOPT_USERNAME || \ - (option) == CURLOPT_AWS_SIGV4 || \ - (option) == CURLOPT_USERPWD || \ - (option) == CURLOPT_XOAUTH2_BEARER || \ - (option) == CURLOPT_SSL_EC_CURVES || \ - 0) - -/* evaluates to true if option takes a curl_write_callback argument */ -#define curlcheck_write_cb_option(option) \ - ((option) == CURLOPT_HEADERFUNCTION || \ - (option) == CURLOPT_WRITEFUNCTION) - -/* evaluates to true if option takes a curl_conv_callback argument */ -#define curlcheck_conv_cb_option(option) \ - ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ - (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ - (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) - -/* evaluates to true if option takes a data argument to pass to a callback */ -#define curlcheck_cb_data_option(option) \ - ((option) == CURLOPT_CHUNK_DATA || \ - (option) == CURLOPT_CLOSESOCKETDATA || \ - (option) == CURLOPT_DEBUGDATA || \ - (option) == CURLOPT_FNMATCH_DATA || \ - (option) == CURLOPT_HEADERDATA || \ - (option) == CURLOPT_HSTSREADDATA || \ - (option) == CURLOPT_HSTSWRITEDATA || \ - (option) == CURLOPT_INTERLEAVEDATA || \ - (option) == CURLOPT_IOCTLDATA || \ - (option) == CURLOPT_OPENSOCKETDATA || \ - (option) == CURLOPT_PREREQDATA || \ - (option) == CURLOPT_PROGRESSDATA || \ - (option) == CURLOPT_READDATA || \ - (option) == CURLOPT_SEEKDATA || \ - (option) == CURLOPT_SOCKOPTDATA || \ - (option) == CURLOPT_SSH_KEYDATA || \ - (option) == CURLOPT_SSL_CTX_DATA || \ - (option) == CURLOPT_WRITEDATA || \ - (option) == CURLOPT_RESOLVER_START_DATA || \ - (option) == CURLOPT_TRAILERDATA || \ - (option) == CURLOPT_SSH_HOSTKEYDATA || \ - 0) - -/* evaluates to true if option takes a POST data argument (void* or char*) */ -#define curlcheck_postfields_option(option) \ - ((option) == CURLOPT_POSTFIELDS || \ - (option) == CURLOPT_COPYPOSTFIELDS || \ - 0) - -/* evaluates to true if option takes a struct curl_slist * argument */ -#define curlcheck_slist_option(option) \ - ((option) == CURLOPT_HTTP200ALIASES || \ - (option) == CURLOPT_HTTPHEADER || \ - (option) == CURLOPT_MAIL_RCPT || \ - (option) == CURLOPT_POSTQUOTE || \ - (option) == CURLOPT_PREQUOTE || \ - (option) == CURLOPT_PROXYHEADER || \ - (option) == CURLOPT_QUOTE || \ - (option) == CURLOPT_RESOLVE || \ - (option) == CURLOPT_TELNETOPTIONS || \ - (option) == CURLOPT_CONNECT_TO || \ - 0) - -/* groups of curl_easy_getinfo infos that take the same type of argument */ - -/* evaluates to true if info expects a pointer to char * argument */ -#define curlcheck_string_info(info) \ - (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG && \ - (info) != CURLINFO_PRIVATE) - -/* evaluates to true if info expects a pointer to long argument */ -#define curlcheck_long_info(info) \ - (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) - -/* evaluates to true if info expects a pointer to double argument */ -#define curlcheck_double_info(info) \ - (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) - -/* true if info expects a pointer to struct curl_slist * argument */ -#define curlcheck_slist_info(info) \ - (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST)) - -/* true if info expects a pointer to struct curl_tlssessioninfo * argument */ -#define curlcheck_tlssessioninfo_info(info) \ - (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION)) - -/* true if info expects a pointer to struct curl_certinfo * argument */ -#define curlcheck_certinfo_info(info) ((info) == CURLINFO_CERTINFO) - -/* true if info expects a pointer to struct curl_socket_t argument */ -#define curlcheck_socket_info(info) \ - (CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T) - -/* true if info expects a pointer to curl_off_t argument */ -#define curlcheck_off_t_info(info) \ - (CURLINFO_OFF_T < (info)) - - -/* typecheck helpers -- check whether given expression has requested type*/ - -/* For pointers, you can use the curlcheck_ptr/curlcheck_arr macros, - * otherwise define a new macro. Search for __builtin_types_compatible_p - * in the GCC manual. - * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is - * the actual expression passed to the curl_easy_setopt macro. This - * means that you can only apply the sizeof and __typeof__ operators, no - * == or whatsoever. - */ - -/* XXX: should evaluate to true if expr is a pointer */ -#define curlcheck_any_ptr(expr) \ - (sizeof(expr) == sizeof(void *)) - -/* evaluates to true if expr is NULL */ -/* XXX: must not evaluate expr, so this check is not accurate */ -#define curlcheck_NULL(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) - -/* evaluates to true if expr is type*, const type* or NULL */ -#define curlcheck_ptr(expr, type) \ - (curlcheck_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), type *) || \ - __builtin_types_compatible_p(__typeof__(expr), const type *)) - -/* evaluates to true if expr is one of type[], type*, NULL or const type* */ -#define curlcheck_arr(expr, type) \ - (curlcheck_ptr((expr), type) || \ - __builtin_types_compatible_p(__typeof__(expr), type [])) - -/* evaluates to true if expr is a string */ -#define curlcheck_string(expr) \ - (curlcheck_arr((expr), char) || \ - curlcheck_arr((expr), signed char) || \ - curlcheck_arr((expr), unsigned char)) - -/* evaluates to true if expr is a long (no matter the signedness) - * XXX: for now, int is also accepted (and therefore short and char, which - * are promoted to int when passed to a variadic function) */ -#define curlcheck_long(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), long) || \ - __builtin_types_compatible_p(__typeof__(expr), signed long) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ - __builtin_types_compatible_p(__typeof__(expr), int) || \ - __builtin_types_compatible_p(__typeof__(expr), signed int) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ - __builtin_types_compatible_p(__typeof__(expr), short) || \ - __builtin_types_compatible_p(__typeof__(expr), signed short) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ - __builtin_types_compatible_p(__typeof__(expr), char) || \ - __builtin_types_compatible_p(__typeof__(expr), signed char) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned char)) - -/* evaluates to true if expr is of type curl_off_t */ -#define curlcheck_off_t(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) - -/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ -/* XXX: also check size of an char[] array? */ -#define curlcheck_error_buffer(expr) \ - (curlcheck_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), char *) || \ - __builtin_types_compatible_p(__typeof__(expr), char[])) - -/* evaluates to true if expr is of type (const) void* or (const) FILE* */ -#if 0 -#define curlcheck_cb_data(expr) \ - (curlcheck_ptr((expr), void) || \ - curlcheck_ptr((expr), FILE)) -#else /* be less strict */ -#define curlcheck_cb_data(expr) \ - curlcheck_any_ptr(expr) -#endif - -/* evaluates to true if expr is of type FILE* */ -#define curlcheck_FILE(expr) \ - (curlcheck_NULL(expr) || \ - (__builtin_types_compatible_p(__typeof__(expr), FILE *))) - -/* evaluates to true if expr can be passed as POST data (void* or char*) */ -#define curlcheck_postfields(expr) \ - (curlcheck_ptr((expr), void) || \ - curlcheck_arr((expr), char) || \ - curlcheck_arr((expr), unsigned char)) - -/* helper: __builtin_types_compatible_p distinguishes between functions and - * function pointers, hide it */ -#define curlcheck_cb_compatible(func, type) \ - (__builtin_types_compatible_p(__typeof__(func), type) || \ - __builtin_types_compatible_p(__typeof__(func) *, type)) - -/* evaluates to true if expr is of type curl_resolver_start_callback */ -#define curlcheck_resolver_start_callback(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_resolver_start_callback)) - -/* evaluates to true if expr is of type curl_read_callback or "similar" */ -#define curlcheck_read_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), __typeof__(fread) *) || \ - curlcheck_cb_compatible((expr), curl_read_callback) || \ - curlcheck_cb_compatible((expr), _curl_read_callback1) || \ - curlcheck_cb_compatible((expr), _curl_read_callback2) || \ - curlcheck_cb_compatible((expr), _curl_read_callback3) || \ - curlcheck_cb_compatible((expr), _curl_read_callback4) || \ - curlcheck_cb_compatible((expr), _curl_read_callback5) || \ - curlcheck_cb_compatible((expr), _curl_read_callback6)) -typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *); -typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *); -typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *); -typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *); -typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *); -typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *); - -/* evaluates to true if expr is of type curl_write_callback or "similar" */ -#define curlcheck_write_cb(expr) \ - (curlcheck_read_cb(expr) || \ - curlcheck_cb_compatible((expr), __typeof__(fwrite) *) || \ - curlcheck_cb_compatible((expr), curl_write_callback) || \ - curlcheck_cb_compatible((expr), _curl_write_callback1) || \ - curlcheck_cb_compatible((expr), _curl_write_callback2) || \ - curlcheck_cb_compatible((expr), _curl_write_callback3) || \ - curlcheck_cb_compatible((expr), _curl_write_callback4) || \ - curlcheck_cb_compatible((expr), _curl_write_callback5) || \ - curlcheck_cb_compatible((expr), _curl_write_callback6)) -typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *); -typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t, - const void *); -typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *); -typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *); -typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t, - const void *); -typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *); - -/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ -#define curlcheck_ioctl_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_ioctl_callback) || \ - curlcheck_cb_compatible((expr), _curl_ioctl_callback1) || \ - curlcheck_cb_compatible((expr), _curl_ioctl_callback2) || \ - curlcheck_cb_compatible((expr), _curl_ioctl_callback3) || \ - curlcheck_cb_compatible((expr), _curl_ioctl_callback4)) -typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *); -typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *); -typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *); -typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *); - -/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ -#define curlcheck_sockopt_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_sockopt_callback) || \ - curlcheck_cb_compatible((expr), _curl_sockopt_callback1) || \ - curlcheck_cb_compatible((expr), _curl_sockopt_callback2)) -typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); -typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t, - curlsocktype); - -/* evaluates to true if expr is of type curl_opensocket_callback or - "similar" */ -#define curlcheck_opensocket_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_opensocket_callback) || \ - curlcheck_cb_compatible((expr), _curl_opensocket_callback1) || \ - curlcheck_cb_compatible((expr), _curl_opensocket_callback2) || \ - curlcheck_cb_compatible((expr), _curl_opensocket_callback3) || \ - curlcheck_cb_compatible((expr), _curl_opensocket_callback4)) -typedef curl_socket_t (*_curl_opensocket_callback1) - (void *, curlsocktype, struct curl_sockaddr *); -typedef curl_socket_t (*_curl_opensocket_callback2) - (void *, curlsocktype, const struct curl_sockaddr *); -typedef curl_socket_t (*_curl_opensocket_callback3) - (const void *, curlsocktype, struct curl_sockaddr *); -typedef curl_socket_t (*_curl_opensocket_callback4) - (const void *, curlsocktype, const struct curl_sockaddr *); - -/* evaluates to true if expr is of type curl_progress_callback or "similar" */ -#define curlcheck_progress_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_progress_callback) || \ - curlcheck_cb_compatible((expr), _curl_progress_callback1) || \ - curlcheck_cb_compatible((expr), _curl_progress_callback2)) -typedef int (*_curl_progress_callback1)(void *, - double, double, double, double); -typedef int (*_curl_progress_callback2)(const void *, - double, double, double, double); - -/* evaluates to true if expr is of type curl_debug_callback or "similar" */ -#define curlcheck_debug_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_debug_callback) || \ - curlcheck_cb_compatible((expr), _curl_debug_callback1) || \ - curlcheck_cb_compatible((expr), _curl_debug_callback2) || \ - curlcheck_cb_compatible((expr), _curl_debug_callback3) || \ - curlcheck_cb_compatible((expr), _curl_debug_callback4) || \ - curlcheck_cb_compatible((expr), _curl_debug_callback5) || \ - curlcheck_cb_compatible((expr), _curl_debug_callback6) || \ - curlcheck_cb_compatible((expr), _curl_debug_callback7) || \ - curlcheck_cb_compatible((expr), _curl_debug_callback8)) -typedef int (*_curl_debug_callback1) (CURL *, - curl_infotype, char *, size_t, void *); -typedef int (*_curl_debug_callback2) (CURL *, - curl_infotype, char *, size_t, const void *); -typedef int (*_curl_debug_callback3) (CURL *, - curl_infotype, const char *, size_t, void *); -typedef int (*_curl_debug_callback4) (CURL *, - curl_infotype, const char *, size_t, const void *); -typedef int (*_curl_debug_callback5) (CURL *, - curl_infotype, unsigned char *, size_t, void *); -typedef int (*_curl_debug_callback6) (CURL *, - curl_infotype, unsigned char *, size_t, const void *); -typedef int (*_curl_debug_callback7) (CURL *, - curl_infotype, const unsigned char *, size_t, void *); -typedef int (*_curl_debug_callback8) (CURL *, - curl_infotype, const unsigned char *, size_t, const void *); - -/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ -/* this is getting even messier... */ -#define curlcheck_ssl_ctx_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_ssl_ctx_callback) || \ - curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback1) || \ - curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback2) || \ - curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback3) || \ - curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback4) || \ - curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback5) || \ - curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback6) || \ - curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback7) || \ - curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback8)) -typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *); -typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *); -typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *); -typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *, - const void *); -#ifdef HEADER_SSL_H -/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX - * this will of course break if we're included before OpenSSL headers... - */ -typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX *, void *); -typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX *, const void *); -typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX *, void *); -typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX *, - const void *); -#else -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; -#endif - -/* evaluates to true if expr is of type curl_conv_callback or "similar" */ -#define curlcheck_conv_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_conv_callback) || \ - curlcheck_cb_compatible((expr), _curl_conv_callback1) || \ - curlcheck_cb_compatible((expr), _curl_conv_callback2) || \ - curlcheck_cb_compatible((expr), _curl_conv_callback3) || \ - curlcheck_cb_compatible((expr), _curl_conv_callback4)) -typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); -typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); -typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); -typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); - -/* evaluates to true if expr is of type curl_seek_callback or "similar" */ -#define curlcheck_seek_cb(expr) \ - (curlcheck_NULL(expr) || \ - curlcheck_cb_compatible((expr), curl_seek_callback) || \ - curlcheck_cb_compatible((expr), _curl_seek_callback1) || \ - curlcheck_cb_compatible((expr), _curl_seek_callback2)) -typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); -typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); - - -#endif /* CURLINC_TYPECHECK_GCC_H */ diff --git a/dependencies/reboot/vendor/curl/urlapi.h b/dependencies/reboot/vendor/curl/urlapi.h deleted file mode 100644 index e15c213..0000000 --- a/dependencies/reboot/vendor/curl/urlapi.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef CURLINC_URLAPI_H -#define CURLINC_URLAPI_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 2018 - 2022, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - * SPDX-License-Identifier: curl - * - ***************************************************************************/ - -#include "curl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* the error codes for the URL API */ -typedef enum { - CURLUE_OK, - CURLUE_BAD_HANDLE, /* 1 */ - CURLUE_BAD_PARTPOINTER, /* 2 */ - CURLUE_MALFORMED_INPUT, /* 3 */ - CURLUE_BAD_PORT_NUMBER, /* 4 */ - CURLUE_UNSUPPORTED_SCHEME, /* 5 */ - CURLUE_URLDECODE, /* 6 */ - CURLUE_OUT_OF_MEMORY, /* 7 */ - CURLUE_USER_NOT_ALLOWED, /* 8 */ - CURLUE_UNKNOWN_PART, /* 9 */ - CURLUE_NO_SCHEME, /* 10 */ - CURLUE_NO_USER, /* 11 */ - CURLUE_NO_PASSWORD, /* 12 */ - CURLUE_NO_OPTIONS, /* 13 */ - CURLUE_NO_HOST, /* 14 */ - CURLUE_NO_PORT, /* 15 */ - CURLUE_NO_QUERY, /* 16 */ - CURLUE_NO_FRAGMENT, /* 17 */ - CURLUE_NO_ZONEID, /* 18 */ - CURLUE_BAD_FILE_URL, /* 19 */ - CURLUE_BAD_FRAGMENT, /* 20 */ - CURLUE_BAD_HOSTNAME, /* 21 */ - CURLUE_BAD_IPV6, /* 22 */ - CURLUE_BAD_LOGIN, /* 23 */ - CURLUE_BAD_PASSWORD, /* 24 */ - CURLUE_BAD_PATH, /* 25 */ - CURLUE_BAD_QUERY, /* 26 */ - CURLUE_BAD_SCHEME, /* 27 */ - CURLUE_BAD_SLASHES, /* 28 */ - CURLUE_BAD_USER, /* 29 */ - CURLUE_LAST -} CURLUcode; - -typedef enum { - CURLUPART_URL, - CURLUPART_SCHEME, - CURLUPART_USER, - CURLUPART_PASSWORD, - CURLUPART_OPTIONS, - CURLUPART_HOST, - CURLUPART_PORT, - CURLUPART_PATH, - CURLUPART_QUERY, - CURLUPART_FRAGMENT, - CURLUPART_ZONEID /* added in 7.65.0 */ -} CURLUPart; - -#define CURLU_DEFAULT_PORT (1<<0) /* return default port number */ -#define CURLU_NO_DEFAULT_PORT (1<<1) /* act as if no port number was set, - if the port number matches the - default for the scheme */ -#define CURLU_DEFAULT_SCHEME (1<<2) /* return default scheme if - missing */ -#define CURLU_NON_SUPPORT_SCHEME (1<<3) /* allow non-supported scheme */ -#define CURLU_PATH_AS_IS (1<<4) /* leave dot sequences */ -#define CURLU_DISALLOW_USER (1<<5) /* no user+password allowed */ -#define CURLU_URLDECODE (1<<6) /* URL decode on get */ -#define CURLU_URLENCODE (1<<7) /* URL encode on set */ -#define CURLU_APPENDQUERY (1<<8) /* append a form style part */ -#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */ -#define CURLU_NO_AUTHORITY (1<<10) /* Allow empty authority when the - scheme is unknown. */ -#define CURLU_ALLOW_SPACE (1<<11) /* Allow spaces in the URL */ - -typedef struct Curl_URL CURLU; - -/* - * curl_url() creates a new CURLU handle and returns a pointer to it. - * Must be freed with curl_url_cleanup(). - */ -CURL_EXTERN CURLU *curl_url(void); - -/* - * curl_url_cleanup() frees the CURLU handle and related resources used for - * the URL parsing. It will not free strings previously returned with the URL - * API. - */ -CURL_EXTERN void curl_url_cleanup(CURLU *handle); - -/* - * curl_url_dup() duplicates a CURLU handle and returns a new copy. The new - * handle must also be freed with curl_url_cleanup(). - */ -CURL_EXTERN CURLU *curl_url_dup(CURLU *in); - -/* - * curl_url_get() extracts a specific part of the URL from a CURLU - * handle. Returns error code. The returned pointer MUST be freed with - * curl_free() afterwards. - */ -CURL_EXTERN CURLUcode curl_url_get(CURLU *handle, CURLUPart what, - char **part, unsigned int flags); - -/* - * curl_url_set() sets a specific part of the URL in a CURLU handle. Returns - * error code. The passed in string will be copied. Passing a NULL instead of - * a part string, clears that part. - */ -CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what, - const char *part, unsigned int flags); - -/* - * curl_url_strerror() turns a CURLUcode value into the equivalent human - * readable error string. This is useful for printing meaningful error - * messages. - */ -CURL_EXTERN const char *curl_url_strerror(CURLUcode); - -#ifdef __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* CURLINC_URLAPI_H */ diff --git a/dependencies/reboot/vendor/curl/zlib.lib b/dependencies/reboot/vendor/curl/zlib.lib deleted file mode 100644 index 1e55507b29f9c08a2f0cd5ff1fe9508f38a75992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445992 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%0A6r3Yqs==g9}Z$H7H{uHUMUS2*8q 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 -// SPDX-License-Identifier: MIT - -/****************************************************************************\ - * Note on documentation: The source files contain links to the online * - * documentation of the public API at https://json.nlohmann.me. This URL * - * contains the most recent documentation and should also be applicable to * - * previous versions; documentation for deprecated functions is not * - * removed, but marked deprecated. See "Generate documentation" section in * - * file docs/README.md. * -\****************************************************************************/ - -#ifndef INCLUDE_NLOHMANN_JSON_HPP_ -#define INCLUDE_NLOHMANN_JSON_HPP_ - -#include // all_of, find, for_each -#include // nullptr_t, ptrdiff_t, size_t -#include // hash, less -#include // initializer_list -#ifndef JSON_NO_IO -#include // istream, ostream -#endif // JSON_NO_IO -#include // random_access_iterator_tag -#include // unique_ptr -#include // string, stoi, to_string -#include // declval, forward, move, pair, swap -#include // vector - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// This file contains all macro definitions affecting or depending on the ABI - -#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK -#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) -#if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 2 -#warning "Already included a different version of the library!" -#endif -#endif -#endif - -#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) -#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum) -#define NLOHMANN_JSON_VERSION_PATCH 2 // NOLINT(modernize-macro-to-enum) - -#ifndef JSON_DIAGNOSTICS -#define JSON_DIAGNOSTICS 0 -#endif - -#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON -#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 -#endif - -#if JSON_DIAGNOSTICS -#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag -#else -#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS -#endif - -#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON -#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp -#else -#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON -#endif - -#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION -#define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 -#endif - -// Construct the namespace ABI tags component -#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b -#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \ - NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) - -#define NLOHMANN_JSON_ABI_TAGS \ - NLOHMANN_JSON_ABI_TAGS_CONCAT( \ - NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ - NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON) - -// Construct the namespace version component -#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ - _v ## major ## _ ## minor ## _ ## patch -#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ - NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) - -#if NLOHMANN_JSON_NAMESPACE_NO_VERSION -#define NLOHMANN_JSON_NAMESPACE_VERSION -#else -#define NLOHMANN_JSON_NAMESPACE_VERSION \ - NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ - NLOHMANN_JSON_VERSION_MINOR, \ - NLOHMANN_JSON_VERSION_PATCH) -#endif - -// Combine namespace components -#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b -#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ - NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) - -#ifndef NLOHMANN_JSON_NAMESPACE -#define NLOHMANN_JSON_NAMESPACE \ - nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ - NLOHMANN_JSON_ABI_TAGS, \ - NLOHMANN_JSON_NAMESPACE_VERSION) -#endif - -#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN -#define NLOHMANN_JSON_NAMESPACE_BEGIN \ - namespace nlohmann \ - { \ - inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ - NLOHMANN_JSON_ABI_TAGS, \ - NLOHMANN_JSON_NAMESPACE_VERSION) \ - { -#endif - -#ifndef NLOHMANN_JSON_NAMESPACE_END -#define NLOHMANN_JSON_NAMESPACE_END \ - } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ - } // namespace nlohmann -#endif - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // transform -#include // array -#include // forward_list -#include // inserter, front_inserter, end -#include // map -#include // string -#include // tuple, make_tuple -#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible -#include // unordered_map -#include // pair, declval -#include // valarray - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // nullptr_t -#include // exception -#if JSON_DIAGNOSTICS -#include // accumulate -#endif -#include // runtime_error -#include // to_string -#include // vector - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // array -#include // size_t -#include // uint8_t -#include // string - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // declval, pair -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - - template struct make_void - { - using type = void; - }; - template using void_t = typename make_void::type; - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - - // https://en.cppreference.com/w/cpp/experimental/is_detected - struct nonesuch - { - nonesuch() = delete; - ~nonesuch() = delete; - nonesuch(nonesuch const&) = delete; - nonesuch(nonesuch const&&) = delete; - void operator=(nonesuch const&) = delete; - void operator=(nonesuch&&) = delete; - }; - - template class Op, - class... Args> - struct detector - { - using value_t = std::false_type; - using type = Default; - }; - - template class Op, class... Args> - struct detector>, Op, Args...> - { - using value_t = std::true_type; - using type = Op; - }; - - template class Op, class... Args> - using is_detected = typename detector::value_t; - - template class Op, class... Args> - struct is_detected_lazy : is_detected { }; - - template class Op, class... Args> - using detected_t = typename detector::type; - - template class Op, class... Args> - using detected_or = detector; - - template class Op, class... Args> - using detected_or_t = typename detected_or::type; - - template class Op, class... Args> - using is_detected_exact = std::is_same>; - - template class Op, class... Args> - using is_detected_convertible = - std::is_convertible, To>; - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include - - -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson -// SPDX-License-Identifier: MIT - -/* Hedley - https://nemequ.github.io/hedley - * Created by Evan Nemerson - */ - -#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) -#if defined(JSON_HEDLEY_VERSION) -#undef JSON_HEDLEY_VERSION -#endif -#define JSON_HEDLEY_VERSION 15 - -#if defined(JSON_HEDLEY_STRINGIFY_EX) -#undef JSON_HEDLEY_STRINGIFY_EX -#endif -#define JSON_HEDLEY_STRINGIFY_EX(x) #x - -#if defined(JSON_HEDLEY_STRINGIFY) -#undef JSON_HEDLEY_STRINGIFY -#endif -#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) - -#if defined(JSON_HEDLEY_CONCAT_EX) -#undef JSON_HEDLEY_CONCAT_EX -#endif -#define JSON_HEDLEY_CONCAT_EX(a,b) a##b - -#if defined(JSON_HEDLEY_CONCAT) -#undef JSON_HEDLEY_CONCAT -#endif -#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) - -#if defined(JSON_HEDLEY_CONCAT3_EX) -#undef JSON_HEDLEY_CONCAT3_EX -#endif -#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c - -#if defined(JSON_HEDLEY_CONCAT3) -#undef JSON_HEDLEY_CONCAT3 -#endif -#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) - -#if defined(JSON_HEDLEY_VERSION_ENCODE) -#undef JSON_HEDLEY_VERSION_ENCODE -#endif -#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) - -#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) -#undef JSON_HEDLEY_VERSION_DECODE_MAJOR -#endif -#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) - -#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) -#undef JSON_HEDLEY_VERSION_DECODE_MINOR -#endif -#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) - -#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) -#undef JSON_HEDLEY_VERSION_DECODE_REVISION -#endif -#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) - -#if defined(JSON_HEDLEY_GNUC_VERSION) -#undef JSON_HEDLEY_GNUC_VERSION -#endif -#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) -#define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) -#elif defined(__GNUC__) -#define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) -#endif - -#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) -#undef JSON_HEDLEY_GNUC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_GNUC_VERSION) -#define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_MSVC_VERSION) -#undef JSON_HEDLEY_MSVC_VERSION -#endif -#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) -#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) -#elif defined(_MSC_FULL_VER) && !defined(__ICL) -#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) -#elif defined(_MSC_VER) && !defined(__ICL) -#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) -#endif - -#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) -#undef JSON_HEDLEY_MSVC_VERSION_CHECK -#endif -#if !defined(JSON_HEDLEY_MSVC_VERSION) -#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) -#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) -#elif defined(_MSC_VER) && (_MSC_VER >= 1200) -#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) -#else -#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) -#endif - -#if defined(JSON_HEDLEY_INTEL_VERSION) -#undef JSON_HEDLEY_INTEL_VERSION -#endif -#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) -#define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) -#elif defined(__INTEL_COMPILER) && !defined(__ICL) -#define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) -#endif - -#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) -#undef JSON_HEDLEY_INTEL_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_INTEL_VERSION) -#define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_INTEL_CL_VERSION) -#undef JSON_HEDLEY_INTEL_CL_VERSION -#endif -#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) -#define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) -#endif - -#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) -#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_INTEL_CL_VERSION) -#define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_PGI_VERSION) -#undef JSON_HEDLEY_PGI_VERSION -#endif -#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) -#define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) -#endif - -#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) -#undef JSON_HEDLEY_PGI_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_PGI_VERSION) -#define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_SUNPRO_VERSION) -#undef JSON_HEDLEY_SUNPRO_VERSION -#endif -#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) -#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) -#elif defined(__SUNPRO_C) -#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) -#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) -#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) -#elif defined(__SUNPRO_CC) -#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) -#endif - -#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) -#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_SUNPRO_VERSION) -#define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) -#undef JSON_HEDLEY_EMSCRIPTEN_VERSION -#endif -#if defined(__EMSCRIPTEN__) -#define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) -#endif - -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) -#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) -#define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_ARM_VERSION) -#undef JSON_HEDLEY_ARM_VERSION -#endif -#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) -#define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) -#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) -#define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) -#endif - -#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) -#undef JSON_HEDLEY_ARM_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_ARM_VERSION) -#define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_IBM_VERSION) -#undef JSON_HEDLEY_IBM_VERSION -#endif -#if defined(__ibmxl__) -#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) -#elif defined(__xlC__) && defined(__xlC_ver__) -#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) -#elif defined(__xlC__) -#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) -#endif - -#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) -#undef JSON_HEDLEY_IBM_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_IBM_VERSION) -#define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_VERSION) -#undef JSON_HEDLEY_TI_VERSION -#endif -#if \ - defined(__TI_COMPILER_VERSION__) && \ - ( \ - defined(__TMS470__) || defined(__TI_ARM__) || \ - defined(__MSP430__) || \ - defined(__TMS320C2000__) \ - ) -#if (__TI_COMPILER_VERSION__ >= 16000000) -#define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif -#endif - -#if defined(JSON_HEDLEY_TI_VERSION_CHECK) -#undef JSON_HEDLEY_TI_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_VERSION) -#define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL2000_VERSION) -#undef JSON_HEDLEY_TI_CL2000_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) -#define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) -#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL2000_VERSION) -#define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL430_VERSION) -#undef JSON_HEDLEY_TI_CL430_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) -#define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) -#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL430_VERSION) -#define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) -#undef JSON_HEDLEY_TI_ARMCL_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) -#define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) -#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) -#define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL6X_VERSION) -#undef JSON_HEDLEY_TI_CL6X_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) -#define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) -#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL6X_VERSION) -#define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL7X_VERSION) -#undef JSON_HEDLEY_TI_CL7X_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) -#define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) -#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL7X_VERSION) -#define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) -#undef JSON_HEDLEY_TI_CLPRU_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) -#define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) -#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) -#define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_CRAY_VERSION) -#undef JSON_HEDLEY_CRAY_VERSION -#endif -#if defined(_CRAYC) -#if defined(_RELEASE_PATCHLEVEL) -#define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) -#else -#define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) -#endif -#endif - -#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) -#undef JSON_HEDLEY_CRAY_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_CRAY_VERSION) -#define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_IAR_VERSION) -#undef JSON_HEDLEY_IAR_VERSION -#endif -#if defined(__IAR_SYSTEMS_ICC__) -#if __VER__ > 1000 -#define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) -#else -#define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) -#endif -#endif - -#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) -#undef JSON_HEDLEY_IAR_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_IAR_VERSION) -#define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TINYC_VERSION) -#undef JSON_HEDLEY_TINYC_VERSION -#endif -#if defined(__TINYC__) -#define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) -#endif - -#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) -#undef JSON_HEDLEY_TINYC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TINYC_VERSION) -#define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_DMC_VERSION) -#undef JSON_HEDLEY_DMC_VERSION -#endif -#if defined(__DMC__) -#define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) -#endif - -#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) -#undef JSON_HEDLEY_DMC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_DMC_VERSION) -#define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_COMPCERT_VERSION) -#undef JSON_HEDLEY_COMPCERT_VERSION -#endif -#if defined(__COMPCERT_VERSION__) -#define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) -#endif - -#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) -#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_COMPCERT_VERSION) -#define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_PELLES_VERSION) -#undef JSON_HEDLEY_PELLES_VERSION -#endif -#if defined(__POCC__) -#define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) -#endif - -#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) -#undef JSON_HEDLEY_PELLES_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_PELLES_VERSION) -#define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_MCST_LCC_VERSION) -#undef JSON_HEDLEY_MCST_LCC_VERSION -#endif -#if defined(__LCC__) && defined(__LCC_MINOR__) -#define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) -#endif - -#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) -#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_MCST_LCC_VERSION) -#define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_GCC_VERSION) -#undef JSON_HEDLEY_GCC_VERSION -#endif -#if \ - defined(JSON_HEDLEY_GNUC_VERSION) && \ - !defined(__clang__) && \ - !defined(JSON_HEDLEY_INTEL_VERSION) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_ARM_VERSION) && \ - !defined(JSON_HEDLEY_CRAY_VERSION) && \ - !defined(JSON_HEDLEY_TI_VERSION) && \ - !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ - !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ - !defined(__COMPCERT__) && \ - !defined(JSON_HEDLEY_MCST_LCC_VERSION) -#define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION -#endif - -#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) -#undef JSON_HEDLEY_GCC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_GCC_VERSION) -#define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else -#define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) -#undef JSON_HEDLEY_HAS_ATTRIBUTE -#endif -#if \ - defined(__has_attribute) && \ - ( \ - (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ - ) -# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) -#else -# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) -#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE -#endif -#if defined(__has_attribute) -#define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) -#else -#define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) -#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE -#endif -#if defined(__has_attribute) -#define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) -#else -#define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) -#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE -#endif -#if \ - defined(__has_cpp_attribute) && \ - defined(__cplusplus) && \ - (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) -#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) -#else -#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) -#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS -#endif -#if !defined(__cplusplus) || !defined(__has_cpp_attribute) -#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) -#elif \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_IAR_VERSION) && \ - (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ - (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) -#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) -#else -#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) -#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE -#endif -#if defined(__has_cpp_attribute) && defined(__cplusplus) -#define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) -#else -#define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) -#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE -#endif -#if defined(__has_cpp_attribute) && defined(__cplusplus) -#define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) -#else -#define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_BUILTIN) -#undef JSON_HEDLEY_HAS_BUILTIN -#endif -#if defined(__has_builtin) -#define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) -#else -#define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) -#undef JSON_HEDLEY_GNUC_HAS_BUILTIN -#endif -#if defined(__has_builtin) -#define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) -#else -#define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) -#undef JSON_HEDLEY_GCC_HAS_BUILTIN -#endif -#if defined(__has_builtin) -#define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) -#else -#define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_FEATURE) -#undef JSON_HEDLEY_HAS_FEATURE -#endif -#if defined(__has_feature) -#define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) -#else -#define JSON_HEDLEY_HAS_FEATURE(feature) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) -#undef JSON_HEDLEY_GNUC_HAS_FEATURE -#endif -#if defined(__has_feature) -#define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) -#else -#define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) -#undef JSON_HEDLEY_GCC_HAS_FEATURE -#endif -#if defined(__has_feature) -#define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) -#else -#define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_EXTENSION) -#undef JSON_HEDLEY_HAS_EXTENSION -#endif -#if defined(__has_extension) -#define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) -#else -#define JSON_HEDLEY_HAS_EXTENSION(extension) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) -#undef JSON_HEDLEY_GNUC_HAS_EXTENSION -#endif -#if defined(__has_extension) -#define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) -#else -#define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) -#undef JSON_HEDLEY_GCC_HAS_EXTENSION -#endif -#if defined(__has_extension) -#define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) -#else -#define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) -#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) -#define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) -#else -#define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) -#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) -#define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) -#else -#define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) -#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) -#define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) -#else -#define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_WARNING) -#undef JSON_HEDLEY_HAS_WARNING -#endif -#if defined(__has_warning) -#define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) -#else -#define JSON_HEDLEY_HAS_WARNING(warning) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) -#undef JSON_HEDLEY_GNUC_HAS_WARNING -#endif -#if defined(__has_warning) -#define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) -#else -#define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_WARNING) -#undef JSON_HEDLEY_GCC_HAS_WARNING -#endif -#if defined(__has_warning) -#define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) -#else -#define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ - defined(__clang__) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ - (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) -#define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) -#define JSON_HEDLEY_PRAGMA(value) __pragma(value) -#else -#define JSON_HEDLEY_PRAGMA(value) -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) -#undef JSON_HEDLEY_DIAGNOSTIC_PUSH -#endif -#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) -#undef JSON_HEDLEY_DIAGNOSTIC_POP -#endif -#if defined(__clang__) -#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") -#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") -#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) -#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") -#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) -#define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) -#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) -#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") -#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) -#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") -#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) -#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") -#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") -#else -#define JSON_HEDLEY_DIAGNOSTIC_PUSH -#define JSON_HEDLEY_DIAGNOSTIC_POP -#endif - - /* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for - HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ -#endif -#if defined(__cplusplus) -# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") -# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") -# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") -# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ - _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ - _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ - xpr \ - JSON_HEDLEY_DIAGNOSTIC_POP -# else -# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ - _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ - xpr \ - JSON_HEDLEY_DIAGNOSTIC_POP -# endif -# else -# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ - xpr \ - JSON_HEDLEY_DIAGNOSTIC_POP -# endif -# endif -#endif -#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x -#endif - -#if defined(JSON_HEDLEY_CONST_CAST) -#undef JSON_HEDLEY_CONST_CAST -#endif -#if defined(__cplusplus) -# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) -#elif \ - JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ - ((T) (expr)); \ - JSON_HEDLEY_DIAGNOSTIC_POP \ - })) -#else -# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_REINTERPRET_CAST) -#undef JSON_HEDLEY_REINTERPRET_CAST -#endif -#if defined(__cplusplus) -#define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) -#else -#define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_STATIC_CAST) -#undef JSON_HEDLEY_STATIC_CAST -#endif -#if defined(__cplusplus) -#define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) -#else -#define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_CPP_CAST) -#undef JSON_HEDLEY_CPP_CAST -#endif -#if defined(__cplusplus) -# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") -# define JSON_HEDLEY_CPP_CAST(T, expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ - ((T) (expr)) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) -# define JSON_HEDLEY_CPP_CAST(T, expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("diag_suppress=Pe137") \ - JSON_HEDLEY_DIAGNOSTIC_POP -# else -# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) -# endif -#else -# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") -#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) -#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") -#else -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") -#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") -#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") -#else -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") -#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") -#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") -#else -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") -#else -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) -#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") -#else -#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION -#endif - -#if defined(JSON_HEDLEY_DEPRECATED) -#undef JSON_HEDLEY_DEPRECATED -#endif -#if defined(JSON_HEDLEY_DEPRECATED_FOR) -#undef JSON_HEDLEY_DEPRECATED_FOR -#endif -#if \ - JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) -#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) -#elif \ - (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) -#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) -#elif defined(__cplusplus) && (__cplusplus >= 201402L) -#define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) -#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) -#define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) -#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) -#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -#define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") -#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") -#else -#define JSON_HEDLEY_DEPRECATED(since) -#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) -#endif - -#if defined(JSON_HEDLEY_UNAVAILABLE) -#undef JSON_HEDLEY_UNAVAILABLE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) -#else -#define JSON_HEDLEY_UNAVAILABLE(available_since) -#endif - -#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) -#undef JSON_HEDLEY_WARN_UNUSED_RESULT -#endif -#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) -#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) -#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) -#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) -#define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) -#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) -#define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) -#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) -#elif defined(_Check_return_) /* SAL */ -#define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ -#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ -#else -#define JSON_HEDLEY_WARN_UNUSED_RESULT -#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) -#endif - -#if defined(JSON_HEDLEY_SENTINEL) -#undef JSON_HEDLEY_SENTINEL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) -#else -#define JSON_HEDLEY_SENTINEL(position) -#endif - -#if defined(JSON_HEDLEY_NO_RETURN) -#undef JSON_HEDLEY_NO_RETURN -#endif -#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -#define JSON_HEDLEY_NO_RETURN __noreturn -#elif \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L -#define JSON_HEDLEY_NO_RETURN _Noreturn -#elif defined(__cplusplus) && (__cplusplus >= 201103L) -#define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) -#define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) -#define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_NO_RETURN __declspec(noreturn) -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) -#define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") -#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) -#define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) -#define JSON_HEDLEY_NO_RETURN __declspec(noreturn) -#else -#define JSON_HEDLEY_NO_RETURN -#endif - -#if defined(JSON_HEDLEY_NO_ESCAPE) -#undef JSON_HEDLEY_NO_ESCAPE -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) -#define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) -#else -#define JSON_HEDLEY_NO_ESCAPE -#endif - -#if defined(JSON_HEDLEY_UNREACHABLE) -#undef JSON_HEDLEY_UNREACHABLE -#endif -#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) -#undef JSON_HEDLEY_UNREACHABLE_RETURN -#endif -#if defined(JSON_HEDLEY_ASSUME) -#undef JSON_HEDLEY_ASSUME -#endif -#if \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_ASSUME(expr) __assume(expr) -#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) -#define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) -#elif \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) -#if defined(__cplusplus) -#define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) -#else -#define JSON_HEDLEY_ASSUME(expr) _nassert(expr) -#endif -#endif -#if \ - (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() -#elif defined(JSON_HEDLEY_ASSUME) -#define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) -#endif -#if !defined(JSON_HEDLEY_ASSUME) -#if defined(JSON_HEDLEY_UNREACHABLE) -#define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) -#else -#define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) -#endif -#endif -#if defined(JSON_HEDLEY_UNREACHABLE) -#if \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) -#define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) -#else -#define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() -#endif -#else -#define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) -#endif -#if !defined(JSON_HEDLEY_UNREACHABLE) -#define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) -#endif - - JSON_HEDLEY_DIAGNOSTIC_PUSH -#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") -#pragma clang diagnostic ignored "-Wpedantic" -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) -#pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -#endif -#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) -#if defined(__clang__) -#pragma clang diagnostic ignored "-Wvariadic-macros" -#elif defined(JSON_HEDLEY_GCC_VERSION) -#pragma GCC diagnostic ignored "-Wvariadic-macros" -#endif -#endif -#if defined(JSON_HEDLEY_NON_NULL) -#undef JSON_HEDLEY_NON_NULL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) -#define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) -#else -#define JSON_HEDLEY_NON_NULL(...) -#endif - JSON_HEDLEY_DIAGNOSTIC_POP - -#if defined(JSON_HEDLEY_PRINTF_FORMAT) -#undef JSON_HEDLEY_PRINTF_FORMAT -#endif -#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) -#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) -#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) -#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) -#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) -#else -#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) -#endif - -#if defined(JSON_HEDLEY_CONSTEXPR) -#undef JSON_HEDLEY_CONSTEXPR -#endif -#if defined(__cplusplus) -#if __cplusplus >= 201103L -#define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) -#endif -#endif -#if !defined(JSON_HEDLEY_CONSTEXPR) -#define JSON_HEDLEY_CONSTEXPR -#endif - -#if defined(JSON_HEDLEY_PREDICT) -#undef JSON_HEDLEY_PREDICT -#endif -#if defined(JSON_HEDLEY_LIKELY) -#undef JSON_HEDLEY_LIKELY -#endif -#if defined(JSON_HEDLEY_UNLIKELY) -#undef JSON_HEDLEY_UNLIKELY -#endif -#if defined(JSON_HEDLEY_UNPREDICTABLE) -#undef JSON_HEDLEY_UNPREDICTABLE -#endif -#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) -#define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) -#endif -#if \ - (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) -# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) -# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) -#elif \ - (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ - (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ - (__extension__ ({ \ - double hedley_probability_ = (probability); \ - ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ - })) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ - (__extension__ ({ \ - double hedley_probability_ = (probability); \ - ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ - })) -# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) -# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) -#else -# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) -# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) -# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) -#endif -#if !defined(JSON_HEDLEY_UNPREDICTABLE) -#define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) -#endif - -#if defined(JSON_HEDLEY_MALLOC) -#undef JSON_HEDLEY_MALLOC -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) -#define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_MALLOC __declspec(restrict) -#else -#define JSON_HEDLEY_MALLOC -#endif - -#if defined(JSON_HEDLEY_PURE) -#undef JSON_HEDLEY_PURE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -# define JSON_HEDLEY_PURE __attribute__((__pure__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) -# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") -#elif defined(__cplusplus) && \ - ( \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ - ) -# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") -#else -# define JSON_HEDLEY_PURE -#endif - -#if defined(JSON_HEDLEY_CONST) -#undef JSON_HEDLEY_CONST -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_CONST __attribute__((__const__)) -#elif \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) -#define JSON_HEDLEY_CONST _Pragma("no_side_effect") -#else -#define JSON_HEDLEY_CONST JSON_HEDLEY_PURE -#endif - -#if defined(JSON_HEDLEY_RESTRICT) -#undef JSON_HEDLEY_RESTRICT -#endif -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) -#define JSON_HEDLEY_RESTRICT restrict -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ - defined(__clang__) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_RESTRICT __restrict -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) -#define JSON_HEDLEY_RESTRICT _Restrict -#else -#define JSON_HEDLEY_RESTRICT -#endif - -#if defined(JSON_HEDLEY_INLINE) -#undef JSON_HEDLEY_INLINE -#endif -#if \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ - (defined(__cplusplus) && (__cplusplus >= 199711L)) -#define JSON_HEDLEY_INLINE inline -#elif \ - defined(JSON_HEDLEY_GCC_VERSION) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) -#define JSON_HEDLEY_INLINE __inline__ -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_INLINE __inline -#else -#define JSON_HEDLEY_INLINE -#endif - -#if defined(JSON_HEDLEY_ALWAYS_INLINE) -#undef JSON_HEDLEY_ALWAYS_INLINE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) -# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -# define JSON_HEDLEY_ALWAYS_INLINE __forceinline -#elif defined(__cplusplus) && \ - ( \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ - ) -# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") -#else -# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE -#endif - -#if defined(JSON_HEDLEY_NEVER_INLINE) -#undef JSON_HEDLEY_NEVER_INLINE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) -#define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) -#define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) -#define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -#define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") -#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) -#define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) -#define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) -#else -#define JSON_HEDLEY_NEVER_INLINE -#endif - -#if defined(JSON_HEDLEY_PRIVATE) -#undef JSON_HEDLEY_PRIVATE -#endif -#if defined(JSON_HEDLEY_PUBLIC) -#undef JSON_HEDLEY_PUBLIC -#endif -#if defined(JSON_HEDLEY_IMPORT) -#undef JSON_HEDLEY_IMPORT -#endif -#if defined(_WIN32) || defined(__CYGWIN__) -# define JSON_HEDLEY_PRIVATE -# define JSON_HEDLEY_PUBLIC __declspec(dllexport) -# define JSON_HEDLEY_IMPORT __declspec(dllimport) -#else -# if \ - JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - ( \ - defined(__TI_EABI__) && \ - ( \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ - ) \ - ) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) -# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) -# else -# define JSON_HEDLEY_PRIVATE -# define JSON_HEDLEY_PUBLIC -# endif -# define JSON_HEDLEY_IMPORT extern -#endif - -#if defined(JSON_HEDLEY_NO_THROW) -#undef JSON_HEDLEY_NO_THROW -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) -#define JSON_HEDLEY_NO_THROW __declspec(nothrow) -#else -#define JSON_HEDLEY_NO_THROW -#endif - -#if defined(JSON_HEDLEY_FALL_THROUGH) -#undef JSON_HEDLEY_FALL_THROUGH -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) -#define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) -#define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) -#elif defined(__fallthrough) /* SAL */ -#define JSON_HEDLEY_FALL_THROUGH __fallthrough -#else -#define JSON_HEDLEY_FALL_THROUGH -#endif - -#if defined(JSON_HEDLEY_RETURNS_NON_NULL) -#undef JSON_HEDLEY_RETURNS_NON_NULL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) -#elif defined(_Ret_notnull_) /* SAL */ -#define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ -#else -#define JSON_HEDLEY_RETURNS_NON_NULL -#endif - -#if defined(JSON_HEDLEY_ARRAY_PARAM) -#undef JSON_HEDLEY_ARRAY_PARAM -#endif -#if \ - defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ - !defined(__STDC_NO_VLA__) && \ - !defined(__cplusplus) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_TINYC_VERSION) -#define JSON_HEDLEY_ARRAY_PARAM(name) (name) -#else -#define JSON_HEDLEY_ARRAY_PARAM(name) -#endif - -#if defined(JSON_HEDLEY_IS_CONSTANT) -#undef JSON_HEDLEY_IS_CONSTANT -#endif -#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) -#undef JSON_HEDLEY_REQUIRE_CONSTEXPR -#endif - /* JSON_HEDLEY_IS_CONSTEXPR_ is for - HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ -#if defined(JSON_HEDLEY_IS_CONSTEXPR_) -#undef JSON_HEDLEY_IS_CONSTEXPR_ -#endif -#if \ - JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -#define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) -#endif -#if !defined(__cplusplus) -# if \ - JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) -#if defined(__INTPTR_TYPE__) -#define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) -#else -#include -#define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) -#endif -# elif \ - ( \ - defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ - !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_IAR_VERSION)) || \ - (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) -#if defined(__INTPTR_TYPE__) -#define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) -#else -#include -#define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) -#endif -# elif \ - defined(JSON_HEDLEY_GCC_VERSION) || \ - defined(JSON_HEDLEY_INTEL_VERSION) || \ - defined(JSON_HEDLEY_TINYC_VERSION) || \ - defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ - defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ - defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ - defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ - defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ - defined(__clang__) -# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ - sizeof(void) != \ - sizeof(*( \ - 1 ? \ - ((void*) ((expr) * 0L) ) : \ -((struct { char v[sizeof(void) * 2]; } *) 1) \ - ) \ - ) \ - ) -# endif -#endif -#if defined(JSON_HEDLEY_IS_CONSTEXPR_) -#if !defined(JSON_HEDLEY_IS_CONSTANT) -#define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) -#endif -#define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) -#else -#if !defined(JSON_HEDLEY_IS_CONSTANT) -#define JSON_HEDLEY_IS_CONSTANT(expr) (0) -#endif -#define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) -#endif - -#if defined(JSON_HEDLEY_BEGIN_C_DECLS) -#undef JSON_HEDLEY_BEGIN_C_DECLS -#endif -#if defined(JSON_HEDLEY_END_C_DECLS) -#undef JSON_HEDLEY_END_C_DECLS -#endif -#if defined(JSON_HEDLEY_C_DECL) -#undef JSON_HEDLEY_C_DECL -#endif -#if defined(__cplusplus) -#define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { -#define JSON_HEDLEY_END_C_DECLS } -#define JSON_HEDLEY_C_DECL extern "C" -#else -#define JSON_HEDLEY_BEGIN_C_DECLS -#define JSON_HEDLEY_END_C_DECLS -#define JSON_HEDLEY_C_DECL -#endif - -#if defined(JSON_HEDLEY_STATIC_ASSERT) -#undef JSON_HEDLEY_STATIC_ASSERT -#endif -#if \ - !defined(__cplusplus) && ( \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ - (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - defined(_Static_assert) \ - ) -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) -#elif \ - (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ - JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) -#else -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) -#endif - -#if defined(JSON_HEDLEY_NULL) -#undef JSON_HEDLEY_NULL -#endif -#if defined(__cplusplus) -#if __cplusplus >= 201103L -#define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) -#elif defined(NULL) -#define JSON_HEDLEY_NULL NULL -#else -#define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) -#endif -#elif defined(NULL) -#define JSON_HEDLEY_NULL NULL -#else -#define JSON_HEDLEY_NULL ((void*) 0) -#endif - -#if defined(JSON_HEDLEY_MESSAGE) -#undef JSON_HEDLEY_MESSAGE -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") -# define JSON_HEDLEY_MESSAGE(msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ - JSON_HEDLEY_PRAGMA(message msg) \ - JSON_HEDLEY_DIAGNOSTIC_POP -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) -#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#else -# define JSON_HEDLEY_MESSAGE(msg) -#endif - -#if defined(JSON_HEDLEY_WARNING) -#undef JSON_HEDLEY_WARNING -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") -# define JSON_HEDLEY_WARNING(msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ - JSON_HEDLEY_PRAGMA(clang warning msg) \ - JSON_HEDLEY_DIAGNOSTIC_POP -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#else -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) -#endif - -#if defined(JSON_HEDLEY_REQUIRE) -#undef JSON_HEDLEY_REQUIRE -#endif -#if defined(JSON_HEDLEY_REQUIRE_MSG) -#undef JSON_HEDLEY_REQUIRE_MSG -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) -# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") -# define JSON_HEDLEY_REQUIRE(expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ - __attribute__((diagnose_if(!(expr), #expr, "error"))) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ - __attribute__((diagnose_if(!(expr), msg, "error"))) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# else -# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) -# endif -#else -# define JSON_HEDLEY_REQUIRE(expr) -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) -#endif - -#if defined(JSON_HEDLEY_FLAGS) -#undef JSON_HEDLEY_FLAGS -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) -#define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) -#else -#define JSON_HEDLEY_FLAGS -#endif - -#if defined(JSON_HEDLEY_FLAGS_CAST) -#undef JSON_HEDLEY_FLAGS_CAST -#endif -#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) -# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("warning(disable:188)") \ - ((T) (expr)); \ - JSON_HEDLEY_DIAGNOSTIC_POP \ - })) -#else -# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) -#endif - -#if defined(JSON_HEDLEY_EMPTY_BASES) -#undef JSON_HEDLEY_EMPTY_BASES -#endif -#if \ - (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -#define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) -#else -#define JSON_HEDLEY_EMPTY_BASES -#endif - - /* Remaining macros are deprecated. */ - -#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) -#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK -#endif -#if defined(__clang__) -#define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) -#else -#define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) -#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) -#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) -#undef JSON_HEDLEY_CLANG_HAS_BUILTIN -#endif -#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) - -#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) -#undef JSON_HEDLEY_CLANG_HAS_FEATURE -#endif -#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) - -#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) -#undef JSON_HEDLEY_CLANG_HAS_EXTENSION -#endif -#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) - -#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) -#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) -#undef JSON_HEDLEY_CLANG_HAS_WARNING -#endif -#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) - -#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ - - -// This file contains all internal macro definitions (except those affecting ABI) -// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them - -// #include - - -// exclude unsupported compilers -#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) -#if defined(__clang__) -#if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 -#error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" -#endif -#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) -#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 -#error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" -#endif -#endif -#endif - -// C++ language standard detection -// if the user manually specified the used c++ version this is skipped -#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) -#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) -#define JSON_HAS_CPP_20 -#define JSON_HAS_CPP_17 -#define JSON_HAS_CPP_14 -#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 -#define JSON_HAS_CPP_17 -#define JSON_HAS_CPP_14 -#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) -#define JSON_HAS_CPP_14 -#endif -// the cpp 11 flag is always specified because it is the minimal required version -#define JSON_HAS_CPP_11 -#endif - -#ifdef __has_include -#if __has_include() -#include -#endif -#endif - -#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) -#ifdef JSON_HAS_CPP_17 -#if defined(__cpp_lib_filesystem) -#define JSON_HAS_FILESYSTEM 1 -#elif defined(__cpp_lib_experimental_filesystem) -#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 -#elif !defined(__has_include) -#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 -#elif __has_include() -#define JSON_HAS_FILESYSTEM 1 -#elif __has_include() -#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 -#endif - -// std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ -#if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 -#undef JSON_HAS_FILESYSTEM -#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM -#endif - -// no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support -#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 -#undef JSON_HAS_FILESYSTEM -#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM -#endif - -// no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support -#if defined(__clang_major__) && __clang_major__ < 7 -#undef JSON_HAS_FILESYSTEM -#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM -#endif - -// no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support -#if defined(_MSC_VER) && _MSC_VER < 1914 -#undef JSON_HAS_FILESYSTEM -#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM -#endif - -// no filesystem support before iOS 13 -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 -#undef JSON_HAS_FILESYSTEM -#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM -#endif - -// no filesystem support before macOS Catalina -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 -#undef JSON_HAS_FILESYSTEM -#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM -#endif -#endif -#endif - -#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM -#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 -#endif - -#ifndef JSON_HAS_FILESYSTEM -#define JSON_HAS_FILESYSTEM 0 -#endif - -#ifndef JSON_HAS_THREE_WAY_COMPARISON -#if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ - && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L -#define JSON_HAS_THREE_WAY_COMPARISON 1 -#else -#define JSON_HAS_THREE_WAY_COMPARISON 0 -#endif -#endif - -#ifndef JSON_HAS_RANGES - // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error -#if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 -#define JSON_HAS_RANGES 0 -#elif defined(__cpp_lib_ranges) -#define JSON_HAS_RANGES 1 -#else -#define JSON_HAS_RANGES 0 -#endif -#endif - -#ifdef JSON_HAS_CPP_17 -#define JSON_INLINE_VARIABLE inline -#else -#define JSON_INLINE_VARIABLE -#endif - -#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) -#define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] -#else -#define JSON_NO_UNIQUE_ADDRESS -#endif - -// disable documentation warnings on clang -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdocumentation" -#pragma clang diagnostic ignored "-Wdocumentation-unknown-command" -#endif - -// allow disabling exceptions -#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) -#define JSON_THROW(exception) throw exception -#define JSON_TRY try -#define JSON_CATCH(exception) catch(exception) -#define JSON_INTERNAL_CATCH(exception) catch(exception) -#else -#include -#define JSON_THROW(exception) std::abort() -#define JSON_TRY if(true) -#define JSON_CATCH(exception) if(false) -#define JSON_INTERNAL_CATCH(exception) if(false) -#endif - -// override exception macros -#if defined(JSON_THROW_USER) -#undef JSON_THROW -#define JSON_THROW JSON_THROW_USER -#endif -#if defined(JSON_TRY_USER) -#undef JSON_TRY -#define JSON_TRY JSON_TRY_USER -#endif -#if defined(JSON_CATCH_USER) -#undef JSON_CATCH -#define JSON_CATCH JSON_CATCH_USER -#undef JSON_INTERNAL_CATCH -#define JSON_INTERNAL_CATCH JSON_CATCH_USER -#endif -#if defined(JSON_INTERNAL_CATCH_USER) -#undef JSON_INTERNAL_CATCH -#define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER -#endif - -// allow overriding assert -#if !defined(JSON_ASSERT) -#include // assert -#define JSON_ASSERT(x) assert(x) -#endif - -// allow to access some private functions (needed by the test suite) -#if defined(JSON_TESTS_PRIVATE) -#define JSON_PRIVATE_UNLESS_TESTED public -#else -#define JSON_PRIVATE_UNLESS_TESTED private -#endif - -/*! -@brief macro to briefly define a mapping between an enum and JSON -@def NLOHMANN_JSON_SERIALIZE_ENUM -@since version 3.4.0 -*/ -#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ - template \ - inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ - { \ - static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ - static const std::pair m[] = __VA_ARGS__; \ - auto it = std::find_if(std::begin(m), std::end(m), \ - [e](const std::pair& ej_pair) -> bool \ - { \ - return ej_pair.first == e; \ - }); \ - j = ((it != std::end(m)) ? it : std::begin(m))->second; \ - } \ - template \ - inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ - { \ - static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ - static const std::pair m[] = __VA_ARGS__; \ - auto it = std::find_if(std::begin(m), std::end(m), \ - [&j](const std::pair& ej_pair) -> bool \ - { \ - return ej_pair.second == j; \ - }); \ - e = ((it != std::end(m)) ? it : std::begin(m))->first; \ - } - -// Ugly macros to avoid uglier copy-paste when specializing basic_json. They -// may be removed in the future once the class is split. - -#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ - template class ObjectType, \ - template class ArrayType, \ - class StringType, class BooleanType, class NumberIntegerType, \ - class NumberUnsignedType, class NumberFloatType, \ - template class AllocatorType, \ - template class JSONSerializer, \ - class BinaryType, \ - class CustomBaseClass> - -#define NLOHMANN_BASIC_JSON_TPL \ - basic_json - -// Macros to simplify conversion from/to types - -#define NLOHMANN_JSON_EXPAND( x ) x -#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME -#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ - NLOHMANN_JSON_PASTE64, \ - NLOHMANN_JSON_PASTE63, \ - NLOHMANN_JSON_PASTE62, \ - NLOHMANN_JSON_PASTE61, \ - NLOHMANN_JSON_PASTE60, \ - NLOHMANN_JSON_PASTE59, \ - NLOHMANN_JSON_PASTE58, \ - NLOHMANN_JSON_PASTE57, \ - NLOHMANN_JSON_PASTE56, \ - NLOHMANN_JSON_PASTE55, \ - NLOHMANN_JSON_PASTE54, \ - NLOHMANN_JSON_PASTE53, \ - NLOHMANN_JSON_PASTE52, \ - NLOHMANN_JSON_PASTE51, \ - NLOHMANN_JSON_PASTE50, \ - NLOHMANN_JSON_PASTE49, \ - NLOHMANN_JSON_PASTE48, \ - NLOHMANN_JSON_PASTE47, \ - NLOHMANN_JSON_PASTE46, \ - NLOHMANN_JSON_PASTE45, \ - NLOHMANN_JSON_PASTE44, \ - NLOHMANN_JSON_PASTE43, \ - NLOHMANN_JSON_PASTE42, \ - NLOHMANN_JSON_PASTE41, \ - NLOHMANN_JSON_PASTE40, \ - NLOHMANN_JSON_PASTE39, \ - NLOHMANN_JSON_PASTE38, \ - NLOHMANN_JSON_PASTE37, \ - NLOHMANN_JSON_PASTE36, \ - NLOHMANN_JSON_PASTE35, \ - NLOHMANN_JSON_PASTE34, \ - NLOHMANN_JSON_PASTE33, \ - NLOHMANN_JSON_PASTE32, \ - NLOHMANN_JSON_PASTE31, \ - NLOHMANN_JSON_PASTE30, \ - NLOHMANN_JSON_PASTE29, \ - NLOHMANN_JSON_PASTE28, \ - NLOHMANN_JSON_PASTE27, \ - NLOHMANN_JSON_PASTE26, \ - NLOHMANN_JSON_PASTE25, \ - NLOHMANN_JSON_PASTE24, \ - NLOHMANN_JSON_PASTE23, \ - NLOHMANN_JSON_PASTE22, \ - NLOHMANN_JSON_PASTE21, \ - NLOHMANN_JSON_PASTE20, \ - NLOHMANN_JSON_PASTE19, \ - NLOHMANN_JSON_PASTE18, \ - NLOHMANN_JSON_PASTE17, \ - NLOHMANN_JSON_PASTE16, \ - NLOHMANN_JSON_PASTE15, \ - NLOHMANN_JSON_PASTE14, \ - NLOHMANN_JSON_PASTE13, \ - NLOHMANN_JSON_PASTE12, \ - NLOHMANN_JSON_PASTE11, \ - NLOHMANN_JSON_PASTE10, \ - NLOHMANN_JSON_PASTE9, \ - NLOHMANN_JSON_PASTE8, \ - NLOHMANN_JSON_PASTE7, \ - NLOHMANN_JSON_PASTE6, \ - NLOHMANN_JSON_PASTE5, \ - NLOHMANN_JSON_PASTE4, \ - NLOHMANN_JSON_PASTE3, \ - NLOHMANN_JSON_PASTE2, \ - NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) -#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) -#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) -#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) -#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) -#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) -#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) -#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) -#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) -#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) -#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) -#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) -#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) -#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) -#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) -#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) -#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) -#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) -#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) -#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) -#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) -#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) -#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) -#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) -#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) -#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) -#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) -#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) -#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) -#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) -#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) -#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) -#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) -#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) -#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) -#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) -#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) -#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) -#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) -#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) -#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) -#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) -#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) -#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) -#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) -#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) -#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) -#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) -#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) -#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) -#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) -#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) -#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) -#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) -#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) -#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) -#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) -#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) -#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) -#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) -#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) -#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) -#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) -#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) - -#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; -#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); -#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1); - -/*! -@brief macro -@def NLOHMANN_DEFINE_TYPE_INTRUSIVE -@since version 3.9.0 -*/ -#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ - friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } - -#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ - friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } - -/*! -@brief macro -@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE -@since version 3.9.0 -*/ -#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ - inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } - -#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ - inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } - - -// inspired from https://stackoverflow.com/a/26745591 -// allows to call any std function as if (e.g. with begin): -// using std::begin; begin(x); -// -// it allows using the detected idiom to retrieve the return type -// of such an expression -#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ - namespace detail { \ - using std::std_name; \ - \ - template \ - using result_of_##std_name = decltype(std_name(std::declval()...)); \ - } \ - \ - namespace detail2 { \ - struct std_name##_tag \ - { \ - }; \ - \ - template \ - std_name##_tag std_name(T&&...); \ - \ - template \ - using result_of_##std_name = decltype(std_name(std::declval()...)); \ - \ - template \ - struct would_call_std_##std_name \ - { \ - static constexpr auto const value = ::nlohmann::detail:: \ - is_detected_exact::value; \ - }; \ - } /* namespace detail2 */ \ - \ - template \ - struct would_call_std_##std_name : detail2::would_call_std_##std_name \ - { \ - } - -#ifndef JSON_USE_IMPLICIT_CONVERSIONS -#define JSON_USE_IMPLICIT_CONVERSIONS 1 -#endif - -#if JSON_USE_IMPLICIT_CONVERSIONS -#define JSON_EXPLICIT -#else -#define JSON_EXPLICIT explicit -#endif - -#ifndef JSON_DISABLE_ENUM_SERIALIZATION -#define JSON_DISABLE_ENUM_SERIALIZATION 0 -#endif - -#ifndef JSON_USE_GLOBAL_UDLS -#define JSON_USE_GLOBAL_UDLS 1 -#endif - -#if JSON_HAS_THREE_WAY_COMPARISON -#include // partial_ordering -#endif - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - - /////////////////////////// - // JSON type enumeration // - /////////////////////////// - - /*! - @brief the JSON type enumeration - - This enumeration collects the different JSON types. It is internally used to - distinguish the stored values, and the functions @ref basic_json::is_null(), - @ref basic_json::is_object(), @ref basic_json::is_array(), - @ref basic_json::is_string(), @ref basic_json::is_boolean(), - @ref basic_json::is_number() (with @ref basic_json::is_number_integer(), - @ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), - @ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and - @ref basic_json::is_structured() rely on it. - - @note There are three enumeration entries (number_integer, number_unsigned, and - number_float), because the library distinguishes these three types for numbers: - @ref basic_json::number_unsigned_t is used for unsigned integers, - @ref basic_json::number_integer_t is used for signed integers, and - @ref basic_json::number_float_t is used for floating-point numbers or to - approximate integers which do not fit in the limits of their respective type. - - @sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON - value with the default value for a given type - - @since version 1.0.0 - */ - enum class value_t : std::uint8_t - { - null, ///< null value - object, ///< object (unordered set of name/value pairs) - array, ///< array (ordered collection of values) - string, ///< string value - boolean, ///< boolean value - number_integer, ///< number value (signed integer) - number_unsigned, ///< number value (unsigned integer) - number_float, ///< number value (floating-point) - binary, ///< binary array (ordered collection of bytes) - discarded ///< discarded by the parser callback function - }; - - /*! - @brief comparison operator for JSON types - - Returns an ordering that is similar to Python: - - order: null < boolean < number < object < array < string < binary - - furthermore, each type is not smaller than itself - - discarded values are not comparable - - binary is represented as a b"" string in python and directly comparable to a - string; however, making a binary array directly comparable with a string would - be surprising behavior in a JSON file. - - @since version 1.0.0 - */ -#if JSON_HAS_THREE_WAY_COMPARISON - inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* -#else - inline bool operator<(const value_t lhs, const value_t rhs) noexcept -#endif - { - static constexpr std::array order = { { - 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, - 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, - 6 /* binary */ - } - }; - - const auto l_index = static_cast(lhs); - const auto r_index = static_cast(rhs); -#if JSON_HAS_THREE_WAY_COMPARISON - if (l_index < order.size() && r_index < order.size()) - { - return order[l_index] <=> order[r_index]; // *NOPAD* - } - return std::partial_ordering::unordered; -#else - return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; -#endif - } - - // GCC selects the built-in operator< over an operator rewritten from - // a user-defined spaceship operator - // Clang, MSVC, and ICC select the rewritten candidate - // (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) -#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) - inline bool operator<(const value_t lhs, const value_t rhs) noexcept - { - return std::is_lt(lhs <=> rhs); // *NOPAD* - } -#endif - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - - /*! - @brief replace all occurrences of a substring by another string - - @param[in,out] s the string to manipulate; changed so that all - occurrences of @a f are replaced with @a t - @param[in] f the substring to replace with @a t - @param[in] t the string to replace @a f - - @pre The search string @a f must not be empty. **This precondition is - enforced with an assertion.** - - @since version 2.0.0 - */ - template - inline void replace_substring(StringType& s, const StringType& f, - const StringType& t) - { - JSON_ASSERT(!f.empty()); - for (auto pos = s.find(f); // find first occurrence of f - pos != StringType::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t, and - pos = s.find(f, pos + t.size())) // find next occurrence of f - { - } - } - - /*! - * @brief string escaping as described in RFC 6901 (Sect. 4) - * @param[in] s string to escape - * @return escaped string - * - * Note the order of escaping "~" to "~0" and "/" to "~1" is important. - */ - template - inline StringType escape(StringType s) - { - replace_substring(s, StringType{ "~" }, StringType{ "~0" }); - replace_substring(s, StringType{ "/" }, StringType{ "~1" }); - return s; - } - - /*! - * @brief string unescaping as described in RFC 6901 (Sect. 4) - * @param[in] s string to unescape - * @return unescaped string - * - * Note the order of escaping "~1" to "/" and "~0" to "~" is important. - */ - template - static void unescape(StringType& s) - { - replace_substring(s, StringType{ "~1" }, StringType{ "/" }); - replace_substring(s, StringType{ "~0" }, StringType{ "~" }); - } - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // size_t - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - - /// struct to capture the start position of the current token - struct position_t - { - /// the total number of characters read - std::size_t chars_read_total = 0; - /// the number of characters read in the current line - std::size_t chars_read_current_line = 0; - /// the number of lines read - std::size_t lines_read = 0; - - /// conversion to size_t to preserve SAX interface - constexpr operator size_t() const - { - return chars_read_total; - } - }; - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-FileCopyrightText: 2018 The Abseil Authors -// SPDX-License-Identifier: MIT - - - -#include // array -#include // size_t -#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type -#include // index_sequence, make_index_sequence, index_sequence_for - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - - template - using uncvref_t = typename std::remove_cv::type>::type; - -#ifdef JSON_HAS_CPP_14 - - // the following utilities are natively available in C++14 - using std::enable_if_t; - using std::index_sequence; - using std::make_index_sequence; - using std::index_sequence_for; - -#else - - // alias templates to reduce boilerplate - template - using enable_if_t = typename std::enable_if::type; - - // The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h - // which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. - - //// START OF CODE FROM GOOGLE ABSEIL - - // integer_sequence - // - // Class template representing a compile-time integer sequence. An instantiation - // of `integer_sequence` has a sequence of integers encoded in its - // type through its template arguments (which is a common need when - // working with C++11 variadic templates). `absl::integer_sequence` is designed - // to be a drop-in replacement for C++14's `std::integer_sequence`. - // - // Example: - // - // template< class T, T... Ints > - // void user_function(integer_sequence); - // - // int main() - // { - // // user_function's `T` will be deduced to `int` and `Ints...` - // // will be deduced to `0, 1, 2, 3, 4`. - // user_function(make_integer_sequence()); - // } - template - struct integer_sequence - { - using value_type = T; - static constexpr std::size_t size() noexcept - { - return sizeof...(Ints); - } - }; - - // index_sequence - // - // A helper template for an `integer_sequence` of `size_t`, - // `absl::index_sequence` is designed to be a drop-in replacement for C++14's - // `std::index_sequence`. - template - using index_sequence = integer_sequence; - - namespace utility_internal - { - - template - struct Extend; - - // Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. - template - struct Extend, SeqSize, 0> - { - using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; - }; - - template - struct Extend, SeqSize, 1> - { - using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; - }; - - // Recursion helper for 'make_integer_sequence'. - // 'Gen::type' is an alias for 'integer_sequence'. - template - struct Gen - { - using type = - typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; - }; - - template - struct Gen - { - using type = integer_sequence; - }; - - } // namespace utility_internal - - // Compile-time sequences of integers - - // make_integer_sequence - // - // This template alias is equivalent to - // `integer_sequence`, and is designed to be a drop-in - // replacement for C++14's `std::make_integer_sequence`. - template - using make_integer_sequence = typename utility_internal::Gen::type; - - // make_index_sequence - // - // This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, - // and is designed to be a drop-in replacement for C++14's - // `std::make_index_sequence`. - template - using make_index_sequence = make_integer_sequence; - - // index_sequence_for - // - // Converts a typename pack into an index sequence of the same length, and - // is designed to be a drop-in replacement for C++14's - // `std::index_sequence_for()` - template - using index_sequence_for = make_index_sequence; - - //// END OF CODE FROM GOOGLE ABSEIL - -#endif - -// dispatch utility (taken from ranges-v3) - template struct priority_tag : priority_tag < N - 1 > {}; - template<> struct priority_tag<0> {}; - - // taken from ranges-v3 - template - struct static_const - { - static JSON_INLINE_VARIABLE constexpr T value{}; - }; - -#ifndef JSON_HAS_CPP_17 - template - constexpr T static_const::value; -#endif - - template - inline constexpr std::array make_array(Args&& ... args) - { - return std::array { {static_cast(std::forward(args))...}}; - } - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // numeric_limits -#include // false_type, is_constructible, is_integral, is_same, true_type -#include // declval -#include // tuple - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // random_access_iterator_tag - -// #include - -// #include - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - - template - struct iterator_types {}; - - template - struct iterator_types < - It, - void_t> - { - using difference_type = typename It::difference_type; - using value_type = typename It::value_type; - using pointer = typename It::pointer; - using reference = typename It::reference; - using iterator_category = typename It::iterator_category; - }; - - // This is required as some compilers implement std::iterator_traits in a way that - // doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. - template - struct iterator_traits - { - }; - - template - struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> - : iterator_types - { - }; - - template - struct iterator_traits::value>> - { - using iterator_category = std::random_access_iterator_tag; - using value_type = T; - using difference_type = ptrdiff_t; - using pointer = T*; - using reference = T&; - }; - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN - -NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); - -NLOHMANN_JSON_NAMESPACE_END - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN - -NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); - -NLOHMANN_JSON_NAMESPACE_END - -// #include - -// #include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - -#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ -#define INCLUDE_NLOHMANN_JSON_FWD_HPP_ - -#include // int64_t, uint64_t -#include // map -#include // allocator -#include // string -#include // vector - -// #include - - -/*! -@brief namespace for Niels Lohmann -@see https://github.com/nlohmann -@since version 1.0.0 -*/ -NLOHMANN_JSON_NAMESPACE_BEGIN - -/*! -@brief default JSONSerializer template argument - -This serializer ignores the template arguments and uses ADL -([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) -for serialization. -*/ -template -struct adl_serializer; - -/// a class to store JSON values -/// @sa https://json.nlohmann.me/api/basic_json/ -template class ObjectType = - std::map, - template class ArrayType = std::vector, - class StringType = std::string, class BooleanType = bool, - class NumberIntegerType = std::int64_t, - class NumberUnsignedType = std::uint64_t, - class NumberFloatType = double, - template class AllocatorType = std::allocator, - template class JSONSerializer = - adl_serializer, - class BinaryType = std::vector, // cppcheck-suppress syntaxError - class CustomBaseClass = void> -class basic_json; - -/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document -/// @sa https://json.nlohmann.me/api/json_pointer/ -template -class json_pointer; - -/*! -@brief default specialization -@sa https://json.nlohmann.me/api/json/ -*/ -using json = basic_json<>; - -/// @brief a minimal map-like container that preserves insertion order -/// @sa https://json.nlohmann.me/api/ordered_map/ -template -struct ordered_map; - -/// @brief specialization that maintains the insertion order of object keys -/// @sa https://json.nlohmann.me/api/ordered_json/ -using ordered_json = basic_json; - -NLOHMANN_JSON_NAMESPACE_END - -#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ - - -NLOHMANN_JSON_NAMESPACE_BEGIN -/*! -@brief detail namespace with internal helper functions - -This namespace collects functions that should not be exposed, -implementations of some @ref basic_json methods, and meta-programming helpers. - -@since version 2.1.0 -*/ -namespace detail -{ - - ///////////// - // helpers // - ///////////// - - // Note to maintainers: - // - // Every trait in this file expects a non CV-qualified type. - // The only exceptions are in the 'aliases for detected' section - // (i.e. those of the form: decltype(T::member_function(std::declval()))) - // - // In this case, T has to be properly CV-qualified to constraint the function arguments - // (e.g. to_json(BasicJsonType&, const T&)) - - template struct is_basic_json : std::false_type {}; - - NLOHMANN_BASIC_JSON_TPL_DECLARATION - struct is_basic_json : std::true_type {}; - - // used by exceptions create() member functions - // true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t - // false_type otherwise - template - struct is_basic_json_context : - std::integral_constant < bool, - is_basic_json::type>::type>::value - || std::is_same::value > - {}; - - ////////////////////// - // json_ref helpers // - ////////////////////// - - template - class json_ref; - - template - struct is_json_ref : std::false_type {}; - - template - struct is_json_ref> : std::true_type {}; - - ////////////////////////// - // aliases for detected // - ////////////////////////// - - template - using mapped_type_t = typename T::mapped_type; - - template - using key_type_t = typename T::key_type; - - template - using value_type_t = typename T::value_type; - - template - using difference_type_t = typename T::difference_type; - - template - using pointer_t = typename T::pointer; - - template - using reference_t = typename T::reference; - - template - using iterator_category_t = typename T::iterator_category; - - template - using to_json_function = decltype(T::to_json(std::declval()...)); - - template - using from_json_function = decltype(T::from_json(std::declval()...)); - - template - using get_template_function = decltype(std::declval().template get()); - - // trait checking if JSONSerializer::from_json(json const&, udt&) exists - template - struct has_from_json : std::false_type {}; - - // trait checking if j.get is valid - // use this trait instead of std::is_constructible or std::is_convertible, - // both rely on, or make use of implicit conversions, and thus fail when T - // has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) - template - struct is_getable - { - static constexpr bool value = is_detected::value; - }; - - template - struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> - { - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; - }; - - // This trait checks if JSONSerializer::from_json(json const&) exists - // this overload is used for non-default-constructible user-defined-types - template - struct has_non_default_from_json : std::false_type {}; - - template - struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> - { - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; - }; - - // This trait checks if BasicJsonType::json_serializer::to_json exists - // Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. - template - struct has_to_json : std::false_type {}; - - template - struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> - { - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; - }; - - template - using detect_key_compare = typename T::key_compare; - - template - struct has_key_compare : std::integral_constant::value> {}; - - // obtains the actual object key comparator - template - struct actual_object_comparator - { - using object_t = typename BasicJsonType::object_t; - using object_comparator_t = typename BasicJsonType::default_object_comparator_t; - using type = typename std::conditional < has_key_compare::value, - typename object_t::key_compare, object_comparator_t>::type; - }; - - template - using actual_object_comparator_t = typename actual_object_comparator::type; - - /////////////////// - // is_ functions // - /////////////////// - - // https://en.cppreference.com/w/cpp/types/conjunction - template struct conjunction : std::true_type { }; - template struct conjunction : B { }; - template - struct conjunction - : std::conditional(B::value), conjunction, B>::type {}; - - // https://en.cppreference.com/w/cpp/types/negation - template struct negation : std::integral_constant < bool, !B::value > { }; - - // Reimplementation of is_constructible and is_default_constructible, due to them being broken for - // std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). - // This causes compile errors in e.g. clang 3.5 or gcc 4.9. - template - struct is_default_constructible : std::is_default_constructible {}; - - template - struct is_default_constructible> - : conjunction, is_default_constructible> {}; - - template - struct is_default_constructible> - : conjunction, is_default_constructible> {}; - - template - struct is_default_constructible> - : conjunction...> {}; - - template - struct is_default_constructible> - : conjunction...> {}; - - - template - struct is_constructible : std::is_constructible {}; - - template - struct is_constructible> : is_default_constructible> {}; - - template - struct is_constructible> : is_default_constructible> {}; - - template - struct is_constructible> : is_default_constructible> {}; - - template - struct is_constructible> : is_default_constructible> {}; - - - template - struct is_iterator_traits : std::false_type {}; - - template - struct is_iterator_traits> - { - private: - using traits = iterator_traits; - - public: - static constexpr auto value = - is_detected::value && - is_detected::value && - is_detected::value && - is_detected::value && - is_detected::value; - }; - - template - struct is_range - { - private: - using t_ref = typename std::add_lvalue_reference::type; - - using iterator = detected_t; - using sentinel = detected_t; - - // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator - // and https://en.cppreference.com/w/cpp/iterator/sentinel_for - // but reimplementing these would be too much work, as a lot of other concepts are used underneath - static constexpr auto is_iterator_begin = - is_iterator_traits>::value; - - public: - static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; - }; - - template - using iterator_t = enable_if_t::value, result_of_begin())>>; - - template - using range_value_t = value_type_t>>; - - // The following implementation of is_complete_type is taken from - // https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ - // and is written by Xiang Fan who agreed to using it in this library. - - template - struct is_complete_type : std::false_type {}; - - template - struct is_complete_type : std::true_type {}; - - template - struct is_compatible_object_type_impl : std::false_type {}; - - template - struct is_compatible_object_type_impl < - BasicJsonType, CompatibleObjectType, - enable_if_t < is_detected::value&& - is_detected::value >> - { - using object_t = typename BasicJsonType::object_t; - - // macOS's is_constructible does not play well with nonesuch... - static constexpr bool value = - is_constructible::value && - is_constructible::value; - }; - - template - struct is_compatible_object_type - : is_compatible_object_type_impl {}; - - template - struct is_constructible_object_type_impl : std::false_type {}; - - template - struct is_constructible_object_type_impl < - BasicJsonType, ConstructibleObjectType, - enable_if_t < is_detected::value&& - is_detected::value >> - { - using object_t = typename BasicJsonType::object_t; - - static constexpr bool value = - (is_default_constructible::value && - (std::is_move_assignable::value || - std::is_copy_assignable::value) && - (is_constructible::value && - std::is_same < - typename object_t::mapped_type, - typename ConstructibleObjectType::mapped_type >::value)) || - (has_from_json::value || - has_non_default_from_json < - BasicJsonType, - typename ConstructibleObjectType::mapped_type >::value); - }; - - template - struct is_constructible_object_type - : is_constructible_object_type_impl {}; - - template - struct is_compatible_string_type - { - static constexpr auto value = - is_constructible::value; - }; - - template - struct is_constructible_string_type - { - // launder type through decltype() to fix compilation failure on ICPC -#ifdef __INTEL_COMPILER - using laundered_type = decltype(std::declval()); -#else - using laundered_type = ConstructibleStringType; -#endif - - static constexpr auto value = - conjunction < - is_constructible, - is_detected_exact>::value; - }; - - template - struct is_compatible_array_type_impl : std::false_type {}; - - template - struct is_compatible_array_type_impl < - BasicJsonType, CompatibleArrayType, - enable_if_t < - is_detected::value&& - is_iterator_traits>>::value && - // special case for types like std::filesystem::path whose iterator's value_type are themselves - // c.f. https://github.com/nlohmann/json/pull/3073 - !std::is_same>::value >> - { - static constexpr bool value = - is_constructible>::value; - }; - - template - struct is_compatible_array_type - : is_compatible_array_type_impl {}; - - template - struct is_constructible_array_type_impl : std::false_type {}; - - template - struct is_constructible_array_type_impl < - BasicJsonType, ConstructibleArrayType, - enable_if_t::value >> - : std::true_type {}; - - template - struct is_constructible_array_type_impl < - BasicJsonType, ConstructibleArrayType, - enable_if_t < !std::is_same::value && - !is_compatible_string_type::value&& - is_default_constructible::value && - (std::is_move_assignable::value || - std::is_copy_assignable::value) && - is_detected::value&& - is_iterator_traits>>::value&& - is_detected::value && - // special case for types like std::filesystem::path whose iterator's value_type are themselves - // c.f. https://github.com/nlohmann/json/pull/3073 - !std::is_same>::value&& - is_complete_type < - detected_t>::value >> - { - using value_type = range_value_t; - - static constexpr bool value = - std::is_same::value || - has_from_json::value || - has_non_default_from_json < - BasicJsonType, - value_type >::value; - }; - - template - struct is_constructible_array_type - : is_constructible_array_type_impl {}; - - template - struct is_compatible_integer_type_impl : std::false_type {}; - - template - struct is_compatible_integer_type_impl < - RealIntegerType, CompatibleNumberIntegerType, - enable_if_t < std::is_integral::value&& - std::is_integral::value && - !std::is_same::value >> - { - // is there an assert somewhere on overflows? - using RealLimits = std::numeric_limits; - using CompatibleLimits = std::numeric_limits; - - static constexpr auto value = - is_constructible::value && - CompatibleLimits::is_integer && - RealLimits::is_signed == CompatibleLimits::is_signed; - }; - - template - struct is_compatible_integer_type - : is_compatible_integer_type_impl {}; - - template - struct is_compatible_type_impl : std::false_type {}; - - template - struct is_compatible_type_impl < - BasicJsonType, CompatibleType, - enable_if_t::value >> - { - static constexpr bool value = - has_to_json::value; - }; - - template - struct is_compatible_type - : is_compatible_type_impl {}; - - template - struct is_constructible_tuple : std::false_type {}; - - template - struct is_constructible_tuple> : conjunction...> {}; - - template - struct is_json_iterator_of : std::false_type {}; - - template - struct is_json_iterator_of : std::true_type {}; - - template - struct is_json_iterator_of : std::true_type - {}; - - // checks if a given type T is a template specialization of Primary - template

HIP@pl81 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

=16jKp(LF%#2BGyfm(-AE~aGp-Bo(sVTGuw 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%0D6^ufGEIh-Njj%eTn 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%0AM$7dfZeR2|wZ7X9?TA;sLce|dvZ|q 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

;|-{X+p}@K`$fR{WxSgo+0S@?>dSy} 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